From 7e1b8ac0e4b5c8ce6502d3c5bf059970c8e3a673 Mon Sep 17 00:00:00 2001 From: Yuji Hatakeyama Date: Thu, 26 Mar 2026 00:48:32 +0900 Subject: [PATCH 1/4] Fix #5306: Add regression test for SHOW WARNINGS with comments --- ...test_5306-show_warnings_with_comment-t.cpp | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 test/tap/tests/reg_test_5306-show_warnings_with_comment-t.cpp 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 000000000..130c98470 --- /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(); +} From 604c02085767867b9a36ffcdf358c15bd55a3515 Mon Sep 17 00:00:00 2001 From: Yuji Hatakeyama Date: Thu, 26 Mar 2026 00:49:04 +0900 Subject: [PATCH 2/4] Fix #5306: Use digest_text to suppress warning_count for SHOW WARNINGS --- lib/mysql_connection.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 02d50a07d..f5a833742 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -1834,7 +1834,13 @@ handler_again: 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); } } From eda537ac6c8dcf4d800996b4061e1c992b643f7b Mon Sep 17 00:00:00 2001 From: Yuji Hatakeyama Date: Thu, 26 Mar 2026 00:50:48 +0900 Subject: [PATCH 3/4] Add reg_test_5306 to test groups, excluding digest-disabled configs --- test/tap/groups/groups.json | 1 + 1 file changed, 1 insertion(+) diff --git a/test/tap/groups/groups.json b/test/tap/groups/groups.json index 3a4817b2a..79c0f768c 100644 --- a/test/tap/groups/groups.json +++ b/test/tap/groups/groups.json @@ -185,6 +185,7 @@ "reg_test_4935-caching_sha2-t" : [ "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" ], From 8b0c7be827e7006d0102fb102282b7dba5081fe8 Mon Sep 17 00:00:00 2001 From: Rene Cannao Date: Tue, 31 Mar 2026 06:41:49 +0000 Subject: [PATCH 4/4] Add fallback to raw query when digest_text is unavailable When query digests are disabled (digest_text is NULL), the SHOW WARNINGS detection would always return false, losing the original behavior for plain "SHOW WARNINGS" queries. Add an else branch that falls back to checking query.ptr, preserving the pre-fix behavior when digests are off. --- lib/mysql_connection.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index f5a833742..272ea0614 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -1839,6 +1839,9 @@ handler_again: 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); + } else { + // Fallback to raw query when digest is unavailable (digests disabled) + is_show_warnings = (query.length == 13 && strncasecmp(query.ptr, "SHOW WARNINGS", 13) == 0); } MyRS->add_eof(is_show_warnings); NEXT_IMMEDIATE(ASYNC_QUERY_END);