From 185e189da36bb0f5c71c2766fd1aff771a8d96a3 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 18 Nov 2010 17:08:32 +0300 Subject: Bug#57306 SHOW PROCESSLIST does not display string literals well. Problem: Extended characters outside of ASCII range where not displayed properly in SHOW PROCESSLIST, because thd_info->query was always sent as system_character_set (utf8). This was wrong, because query buffer is never converted to utf8 - it is always have client character set. Fix: sending query buffer using query character set @ sql/sql_class.cc @ sql/sql_class.h Introducing a new class CSET_STRING, a LEX_STRING with character set. Adding set_query(&CSET_STRING) Adding reset_query(), to use instead of set_query(0, NULL). @ sql/event_data_objects.cc Using reset_query() @ sql/log_event.cc Using reset_query() Adding charset argument to set_query_and_id(). @ sql/slave.cc Using reset_query(). @ sql/sp_head.cc Changing backing up and restore code to use CSET_STRING. @ sql/sql_audit.h Using CSET_STRING. In the "else" branch it's OK not to use global_system_variables.character_set_client. &my_charset_latin1, which is set in constructor, is fine (verified with Sergey Vojtovich). @ sql/sql_insert.cc Using set_query() with proper character set: table_name is utf8. @ sql/sql_parse.cc Adding character set argument to set_query_and_id(). (This is the main point where thd->charset() is stored into thd->query_string.cs, for use in "SHOW PROCESSLIST".) Using reset_query(). @ sql/sql_prepare.cc Storing client character set into thd->query_string.cs. @ sql/sql_show.cc Using CSET_STRING to fetch and send charset-aware query information from threads. @ storage/myisam/ha_myisam.cc Using set_query() with proper character set: table_name is utf8. @ mysql-test/r/show_check.result @ mysql-test/t/show_check.test Adding tests --- mysql-test/t/show_check.test | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'mysql-test/t/show_check.test') diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index fa9dc7472fe..060022dee64 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -1328,3 +1328,30 @@ disconnect con1; # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc +--echo # +--echo # Bug#57306 SHOW PROCESSLIST does not display string literals well. +--echo # + +SET NAMES latin1; +SELECT GET_LOCK('t', 1000); +--connect (con1,localhost,root,,) +--connection con1 +SET NAMES latin1; +--send SELECT GET_LOCK('t',1000) AS 'óóóó'; +--connection default +# Make sure con1 has switched from "SET NAMES" to "SELECT GET_LOCK" +let $wait_timeout= 10; +let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE '%GET_LOCK%' AND ID != CONNECTION_ID(); +--source include/wait_condition.inc +--replace_column 1 ### 6 ### 7 ### +SHOW PROCESSLIST; +SET NAMES utf8; +--replace_column 1 ### 6 ### 7 ### +SHOW PROCESSLIST; +SELECT RELEASE_LOCK('t'); +--connection con1 +--reap +--disconnect con1 +--connection default +SET NAMES latin1; + -- cgit v1.2.1