diff --git a/src/admin.rs b/src/admin.rs index 22bbb0af..f08ef2e1 100644 --- a/src/admin.rs +++ b/src/admin.rs @@ -55,7 +55,12 @@ where let query_parts: Vec<&str> = query.trim_end_matches(';').split_whitespace().collect(); - match query_parts[0].to_ascii_uppercase().as_str() { + match query_parts + .first() + .unwrap_or(&"") + .to_ascii_uppercase() + .as_str() + { "BAN" => { trace!("BAN"); ban(stream, query_parts).await @@ -84,7 +89,12 @@ where trace!("SHUTDOWN"); shutdown(stream).await } - "SHOW" => match query_parts[1].to_ascii_uppercase().as_str() { + "SHOW" => match query_parts + .get(1) + .unwrap_or(&"") + .to_ascii_uppercase() + .as_str() + { "HELP" => { trace!("SHOW HELP"); show_help(stream).await diff --git a/tests/ruby/admin_spec.rb b/tests/ruby/admin_spec.rb index abaa5ff4..f9613d96 100644 --- a/tests/ruby/admin_spec.rb +++ b/tests/ruby/admin_spec.rb @@ -91,6 +91,27 @@ end end + [ + "SHOW ME THE MONEY", + "SHOW ME THE WAY", + "SHOW UP", + "SHOWTIME", + "HAMMER TIME", + "SHOWN TO BE TRUE", + "SHOW ", + "SHOW ", + "SHOW 1", + ";;;;;" + ].each do |cmd| + describe "Bad command #{cmd}" do + it "does not panic and responds with PG::SystemError" do + admin_conn = PG::connect(processes.pgcat.admin_connection_string) + expect { admin_conn.async_exec(cmd) }.to raise_error(PG::SystemError).with_message(/Unsupported/) + admin_conn.close + end + end + end + describe "PAUSE" do it "pauses all pools" do admin_conn = PG::connect(processes.pgcat.admin_connection_string)