From ea01a83de08caf908cf3ea07951efe290461b113 Mon Sep 17 00:00:00 2001 From: Yuji Hatakeyama Date: Tue, 20 Jan 2026 01:25:32 +0900 Subject: [PATCH 1/5] Fix #5306: Add regression test for SHOW WARNINGS with comments --- test/tap/groups/groups.json | 1 + ...test_5306-show_warnings_with_comment-t.cpp | 89 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 test/tap/tests/reg_test_5306-show_warnings_with_comment-t.cpp diff --git a/test/tap/groups/groups.json b/test/tap/groups/groups.json index 226b7fab9a..0eb416af89 100644 --- a/test/tap/groups/groups.json +++ b/test/tap/groups/groups.json @@ -100,6 +100,7 @@ "reg_test_4399-stats_mysql_query_digest-t" : [ "default-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_4402-mysql_fields-t" : [ "default-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_4556-ssl_error_queue-t" : [ "default-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_5306-show_warnings_with_comment-t" : [ "default-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" : [ "default-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_fast_forward_split_packet-t" : [ "default-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_mariadb_metadata_check-t" : [ "default-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..554d92e620 --- /dev/null +++ b/test/tap/tests/reg_test_5306-show_warnings_with_comment-t.cpp @@ -0,0 +1,89 @@ +/** + * @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 +#include +#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); + 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); + 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 09758199cb055b074f928fc02a84f8033bb078c7 Mon Sep 17 00:00:00 2001 From: Yuji Hatakeyama Date: Tue, 20 Jan 2026 01:26:33 +0900 Subject: [PATCH 2/5] 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 6c85315753..36f69df3fe 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -1825,7 +1825,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); } } From a609bc999c08e57221827a9801856b1df2986c34 Mon Sep 17 00:00:00 2001 From: Yuji Hatakeyama Date: Tue, 20 Jan 2026 02:01:38 +0900 Subject: [PATCH 3/5] Exclude test from groups where digest_text cannot properly detect SHOW WARNINGS --- test/tap/groups/groups.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tap/groups/groups.json b/test/tap/groups/groups.json index 0eb416af89..cab645d379 100644 --- a/test/tap/groups/groups.json +++ b/test/tap/groups/groups.json @@ -100,7 +100,7 @@ "reg_test_4399-stats_mysql_query_digest-t" : [ "default-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_4402-mysql_fields-t" : [ "default-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_4556-ssl_error_queue-t" : [ "default-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_5306-show_warnings_with_comment-t" : [ "default-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_5306-show_warnings_with_comment-t" : [ "default-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2" ], "reg_test_compression_split_packets-t" : [ "default-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_fast_forward_split_packet-t" : [ "default-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_mariadb_metadata_check-t" : [ "default-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 0124c550dfadd22c055b714fed0c1ee46625ad14 Mon Sep 17 00:00:00 2001 From: Yuji Hatakeyama Date: Tue, 20 Jan 2026 16:02:27 +0900 Subject: [PATCH 4/5] Remove unused headers from reg_test_5306 test --- test/tap/tests/reg_test_5306-show_warnings_with_comment-t.cpp | 3 --- 1 file changed, 3 deletions(-) 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 index 554d92e620..079cc0d4e0 100644 --- 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 @@ -4,9 +4,6 @@ */ #include -#include -#include -#include #include "mysql.h" #include "mysqld_error.h" #include "tap.h" From 28037bc05923687f879c79a3889a6faa3e0cb785 Mon Sep 17 00:00:00 2001 From: Yuji Hatakeyama Date: Tue, 20 Jan 2026 23:06:23 +0900 Subject: [PATCH 5/5] Add NULL check for mysql_store_result in reg_test_5306 test --- .../tests/reg_test_5306-show_warnings_with_comment-t.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) 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 index 079cc0d4e0..130c984705 100644 --- 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 @@ -59,6 +59,10 @@ int main(int argc, char** argv) { 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); @@ -66,6 +70,10 @@ int main(int argc, char** argv) { 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);