diff --git a/test/tap/tests/pgsql-reg_test_4716_single_semicolon-t.cpp b/test/tap/tests/pgsql-reg_test_4716_single_semicolon-t.cpp new file mode 100644 index 000000000..09d19a0b3 --- /dev/null +++ b/test/tap/tests/pgsql-reg_test_4716_single_semicolon-t.cpp @@ -0,0 +1,77 @@ +/** + * @file pgsql-reg_test_4716_single_semicolon-t.cpp + * @brief This test aims to verify that ProxySQL handles a lone semicolon (;) input + * crashing. The expected behavior is for ProxySQL to either ignore the input or return an + * appropriate error message, rather than crashing or becoming unresponsive. + */ + +#include +#include + +#include "libpq-fe.h" +#include "command_line.h" +#include "tap.h" +#include "utils.h" + +CommandLine cl; + +enum ConnType { + ADMIN, + BACKEND +}; + +PGconn* createNewConnection(ConnType conn_type, bool with_ssl) { + std::stringstream ss; + const char* host = (conn_type == BACKEND) ? cl.pgsql_host : cl.admin_host; + int port = (conn_type == BACKEND) ? cl.pgsql_port : cl.admin_port; + const char* username = (conn_type == BACKEND) ? cl.pgsql_username : cl.admin_username; + const char* password = (conn_type == BACKEND) ? cl.pgsql_password : cl.admin_password; + + + ss << "host=" << host << " port=" << port; + ss << " user=" << username << " password=" << password; + ss << (with_ssl ? " sslmode=require" : " sslmode=disable"); + + PGconn* conn = PQconnectdb(ss.str().c_str()); + if (PQstatus(conn) != CONNECTION_OK) { + diag("Connection failed to '%s': %s", (conn_type == BACKEND ? "Backend" : "Admin"), PQerrorMessage(conn)); + PQfinish(conn); + return nullptr; + } + return conn; +} + +int main(int argc, char** argv) { + + std::vector queries = { ";", " ", "", "; ", " ;" }; + + plan(queries.size() + 1); // Total number of tests planned + + if (cl.getEnv()) + return exit_status(); + + PGconn* conn = createNewConnection(ADMIN, false); + + if (conn == nullptr) + return exit_status(); + + PGresult* res = nullptr; + + for (const char* query : queries) { + PGresult* res = PQexec(conn, query); + + ok(PQresultStatus(res) == PGRES_FATAL_ERROR, + "Error. %s", PQerrorMessage(conn)); + PQclear(res); + } + + res = PQexec(conn, "SELECT 1"); + ok(PQresultStatus(res) == PGRES_TUPLES_OK, + "Query executed sucessfully. %s", PQerrorMessage(conn)); + PQclear(res); + + // Close the connection + PQfinish(conn); + + return exit_status(); +}