diff --git a/mysql-test/r/processlist.result b/mysql-test/r/processlist.result index eb3af67c5bf..55d2425d269 100644 --- a/mysql-test/r/processlist.result +++ b/mysql-test/r/processlist.result @@ -17,3 +17,4 @@ select command, time < 5 from information_schema.processlist where id != connect command time < 5 Sleep 1 set debug_sync='reset'; +End of 5.5 tests diff --git a/mysql-test/r/processlist_MDEV-20466.result b/mysql-test/r/processlist_MDEV-20466.result new file mode 100644 index 00000000000..7120212d0f0 Binary files /dev/null and b/mysql-test/r/processlist_MDEV-20466.result differ diff --git a/mysql-test/t/processlist.test b/mysql-test/t/processlist.test index a8f8a4ed64c..8a8995f43b0 100644 --- a/mysql-test/t/processlist.test +++ b/mysql-test/t/processlist.test @@ -50,3 +50,5 @@ select command, time < 5 from information_schema.processlist where id != connect disconnect con1; set debug_sync='reset'; + +--echo End of 5.5 tests diff --git a/mysql-test/t/processlist_MDEV-20466.test b/mysql-test/t/processlist_MDEV-20466.test new file mode 100644 index 00000000000..70b56d25d72 --- /dev/null +++ b/mysql-test/t/processlist_MDEV-20466.test @@ -0,0 +1,35 @@ +--echo # This test has a result that includes \0 byte. +--echo # Such a byte makes diff to treat the whole file as binary, +--echo # and to refuse to diff it. +--echo # That's why this test is put in a separate file, +--echo # so that diff would still work on results of other tests. + +source include/have_debug.inc; +source include/have_debug_sync.inc; + +--echo # +--echo # MDEV-20466: SHOW PROCESSLIST truncates query text on \0 bytes +--echo # + +connect (con1,localhost,root,,); + +#select * from information_schema.processlist; +connection con1; + +let $q= `select CONCAT("SELECT user FROM mysql.user WHERE user ='some", CHAR(0), "' or sleep (3)")`; + +SET DEBUG_SYNC= 'before_join_optimize SIGNAL in_sync'; +--send_eval $q; + +connection default; + +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; + +--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS +SHOW PROCESSLIST; + +disconnect con1; + +SET DEBUG_SYNC = 'RESET'; + +--echo End of 5.5 tests diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 0cf992ce25b..998432e8443 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2278,8 +2278,12 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) else protocol->store_null(); protocol->store(thd_info->state_info, system_charset_info); - protocol->store(thd_info->query_string.str(), - thd_info->query_string.charset()); + if (thd_info->query_string.length()) + protocol->store(thd_info->query_string.str(), + thd_info->query_string.length(), + thd_info->query_string.charset()); + else + protocol->store_null(); if (!thd->variables.old_mode && !(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO)) protocol->store(thd_info->progress, 3, &store_buffer);