summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2019-10-14 16:45:51 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2019-10-15 09:48:49 +0200
commitc2854c7863aa01895febfb6503f542fce6825bd6 (patch)
treeadec4c146a1f4cccdc67978ff1170bfd59312842
parentea61b79694ee9fcc32e75966ee93c076443f16b4 (diff)
downloadmariadb-git-c2854c7863aa01895febfb6503f542fce6825bd6.tar.gz
MDEV-20466: SHOW PROCESSLIST truncates query text on \0 bytes
Data should be sent with length.
-rw-r--r--mysql-test/r/processlist.result1
-rw-r--r--mysql-test/r/processlist_MDEV-20466.resultbin0 -> 775 bytes
-rw-r--r--mysql-test/t/processlist.test2
-rw-r--r--mysql-test/t/processlist_MDEV-20466.test35
-rw-r--r--sql/sql_show.cc8
5 files changed, 44 insertions, 2 deletions
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
--- /dev/null
+++ b/mysql-test/r/processlist_MDEV-20466.result
Binary files 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);