mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
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
This commit is contained in:
@@ -99,32 +99,29 @@ void mysql_audit_general(THD *thd, uint event_subtype,
|
||||
{
|
||||
time_t time= my_time(0);
|
||||
uint msglen= msg ? strlen(msg) : 0;
|
||||
const char *query, *user;
|
||||
uint querylen, userlen;
|
||||
const char *user;
|
||||
uint userlen;
|
||||
char user_buff[MAX_USER_HOST_SIZE];
|
||||
CHARSET_INFO *clientcs;
|
||||
CSET_STRING query;
|
||||
ha_rows rows;
|
||||
|
||||
if (thd)
|
||||
{
|
||||
query= thd->query();
|
||||
querylen= thd->query_length();
|
||||
query= thd->query_string;
|
||||
user= user_buff;
|
||||
userlen= make_user_name(thd, user_buff);
|
||||
clientcs= thd->variables.character_set_client;
|
||||
rows= thd->warning_info->current_row_for_warning();
|
||||
}
|
||||
else
|
||||
{
|
||||
query= user= 0;
|
||||
querylen= userlen= 0;
|
||||
clientcs= global_system_variables.character_set_client;
|
||||
user= 0;
|
||||
userlen= 0;
|
||||
rows= 0;
|
||||
}
|
||||
|
||||
mysql_audit_notify(thd, MYSQL_AUDIT_GENERAL_CLASS, event_subtype,
|
||||
error_code, time, user, userlen, msg, msglen,
|
||||
query, querylen, clientcs, rows);
|
||||
query.str(), query.length(), query.charset(), rows);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user