diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 02d50a07dc..f5a8337423 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -1834,7 +1834,13 @@ MDB_ASYNC_ST MySQL_Connection::handler(short event) { update_warning_count_from_connection(); // we reach here if there was no error // exclude warning_count from the OK/EOF packet for the ‘SHOW WARNINGS’ statement - MyRS->add_eof(query.length == 13 && strncasecmp(query.ptr, "SHOW WARNINGS", 13) == 0); + bool is_show_warnings = false; + if (myds && myds->sess && myds->sess->CurrentQuery.QueryParserArgs.digest_text) { + const char* dig_text = myds->sess->CurrentQuery.QueryParserArgs.digest_text; + const size_t dig_len = strlen(dig_text); + is_show_warnings = (dig_len == 13 && strncasecmp(dig_text, "SHOW WARNINGS", 13) == 0); + } + MyRS->add_eof(is_show_warnings); NEXT_IMMEDIATE(ASYNC_QUERY_END); } } diff --git a/test/tap/groups/groups.json b/test/tap/groups/groups.json index ddc0764e95..37343b65eb 100644 --- a/test/tap/groups/groups.json +++ b/test/tap/groups/groups.json @@ -185,6 +185,7 @@ "reg_test_4935-caching_sha2-t" : [ "legacy-g4","mysql84-g4","mysql-auto_increment_delay_multiplex=0-g4","mysql-multiplexing=false-g4","mysql-query_digests=0-g4","mysql-query_digests_keep_comment=1-g4" ], "reg_test_5212_tcp_keepalive_warnings-t" : [ "legacy-g1","mysql84-g1" ], "reg_test_5233_set_warning-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], + "reg_test_5306-show_warnings_with_comment-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2" ], "reg_test_5389-flush_logs_no_drop-t" : [ "legacy-g4","mysql84-g4" ], "reg_test__ssl_client_busy_wait-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_compression_split_packets-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], diff --git a/test/tap/tests/reg_test_5306-show_warnings_with_comment-t.cpp b/test/tap/tests/reg_test_5306-show_warnings_with_comment-t.cpp new file mode 100644 index 0000000000..130c984705 --- /dev/null +++ b/test/tap/tests/reg_test_5306-show_warnings_with_comment-t.cpp @@ -0,0 +1,94 @@ +/** + * @file reg_test_5306-show_warnings_with_comment-t.cpp + * @brief This test verifies that SHOW WARNINGS with inline comments does not incorrectly return warning_count in EOF packet. + */ + +#include +#include "mysql.h" +#include "mysqld_error.h" +#include "tap.h" +#include "command_line.h" +#include "utils.h" + +int main(int argc, char** argv) { + CommandLine cl; + + if (cl.getEnv()) { + diag("Failed to get the required environmental variables."); + return -1; + } + + plan(4); + + // Initialize Admin connection + MYSQL* proxysql_admin = mysql_init(NULL); + if (!proxysql_admin) { + fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(proxysql_admin)); + return -1; + } + // Connnect to ProxySQL Admin + if (!mysql_real_connect(proxysql_admin, cl.host, cl.admin_username, cl.admin_password, NULL, cl.admin_port, NULL, 0)) { + fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(proxysql_admin)); + return -1; + } + + MYSQL_QUERY(proxysql_admin, "SET mysql-handle_warnings=1"); + MYSQL_QUERY(proxysql_admin, "LOAD MYSQL VARIABLES TO RUNTIME"); + + // Initialize ProxySQL connection + MYSQL* proxysql = mysql_init(NULL); + if (!proxysql) { + fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(proxysql)); + return -1; + } + + if (!mysql_real_connect(proxysql, cl.host, cl.username, cl.password, NULL, cl.port, NULL, 0)) { + fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(proxysql)); + return exit_status(); + } + + // Query that produces a warning (truncation warning) + const char* WARNING_QUERY = "SELECT CAST('abc' AS DOUBLE)"; + + // Test cases: SHOW WARNINGS without and with comment + const char* show_warnings_queries[] = { + "SHOW WARNINGS", + "SHOW /* comment */ WARNINGS" + }; + + for (const char* show_query : show_warnings_queries) { + MYSQL_QUERY(proxysql, WARNING_QUERY); + MYSQL_RES* res = mysql_store_result(proxysql); + if (!res) { + fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(proxysql)); + return exit_status(); + } + mysql_free_result(res); + + unsigned int warning_count_after_query = mysql_warning_count(proxysql); + diag("After WARNING_QUERY: warning_count=%u", warning_count_after_query); + + MYSQL_QUERY(proxysql, show_query); + res = mysql_store_result(proxysql); + if (!res) { + fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(proxysql)); + return exit_status(); + } + unsigned int row_count = mysql_num_rows(res); + mysql_free_result(res); + + unsigned int warning_count_after_show = mysql_warning_count(proxysql); + diag("After '%s': warning_count=%u, rows=%u", show_query, warning_count_after_show, row_count); + + ok(warning_count_after_query == 1, + "WARNING_QUERY should produce warning. warning_count=%u", warning_count_after_query); + + ok(warning_count_after_show == 0, + "'%s' should return warning_count=0 in EOF packet. Actual=%u", show_query, warning_count_after_show); + } + + mysql_close(proxysql); + mysql_close(proxysql_admin); + + return exit_status(); +}