Commit c0b31dc2 authored by unknown's avatar unknown

Fix for Bug#16905 Log tables: unicode statements are logged incorrectly


mysql-test/r/log_tables.result:
  update result
mysql-test/t/log_tables.test:
  add a testcase
sql/log.cc:
  take into account client charset info, while logging
  into a table.
sql/log.h:
  pass the charset info along with the log messages
  to log them correctly
parent 93985f25
...@@ -52,3 +52,15 @@ select "Mark that we woke up from TRUNCATE in the test" ...@@ -52,3 +52,15 @@ select "Mark that we woke up from TRUNCATE in the test"
as "test passed"; as "test passed";
test passed test passed
Mark that we woke up from TRUNCATE in the test Mark that we woke up from TRUNCATE in the test
use test;
truncate table mysql.general_log;
set names utf8;
create table bug16905 (s char(15) character set utf8 default 'пусто');
insert into bug16905 values ('новое');
select * from mysql.general_log;
event_time user_host thread_id server_id command_type argument
TIMESTAMP root[root] @ localhost [] 2 1 Query set names utf8
TIMESTAMP root[root] @ localhost [] 2 1 Query create table bug16905 (s char(15) character set utf8 default 'пусто')
TIMESTAMP root[root] @ localhost [] 2 1 Query insert into bug16905 values ('новое')
TIMESTAMP root[root] @ localhost [] 2 1 Query select * from mysql.general_log
drop table bug16905;
...@@ -144,7 +144,25 @@ reap; ...@@ -144,7 +144,25 @@ reap;
select "Mark that we woke up from TRUNCATE in the test" select "Mark that we woke up from TRUNCATE in the test"
as "test passed"; as "test passed";
connection con1;
disconnect con2; disconnect con2;
use test;
#
# Bug #16905 Log tables: unicode statements are logged incorrectly
#
truncate table mysql.general_log;
set names utf8;
create table bug16905 (s char(15) character set utf8 default 'пусто');
insert into bug16905 values ('новое');
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
drop table bug16905;
disconnect con1; disconnect con1;
--enable_ps_protocol --enable_ps_protocol
...@@ -310,7 +310,8 @@ bool Log_to_csv_event_handler:: ...@@ -310,7 +310,8 @@ bool Log_to_csv_event_handler::
log_general(time_t event_time, const char *user_host, log_general(time_t event_time, const char *user_host,
uint user_host_len, int thread_id, uint user_host_len, int thread_id,
const char *command_type, uint command_type_len, const char *command_type, uint command_type_len,
const char *sql_text, uint sql_text_len) const char *sql_text, uint sql_text_len,
CHARSET_INFO *client_cs)
{ {
TABLE *table= general_log.table; TABLE *table= general_log.table;
...@@ -325,11 +326,11 @@ bool Log_to_csv_event_handler:: ...@@ -325,11 +326,11 @@ bool Log_to_csv_event_handler::
/* set default value (which is CURRENT_TIMESTAMP) */ /* set default value (which is CURRENT_TIMESTAMP) */
table->field[0]->set_null(); table->field[0]->set_null();
table->field[1]->store(user_host, user_host_len, &my_charset_latin1); table->field[1]->store(user_host, user_host_len, client_cs);
table->field[2]->store((longlong) thread_id); table->field[2]->store((longlong) thread_id);
table->field[3]->store((longlong) server_id); table->field[3]->store((longlong) server_id);
table->field[4]->store(command_type, command_type_len, &my_charset_latin1); table->field[4]->store(command_type, command_type_len, client_cs);
table->field[5]->store(sql_text, sql_text_len, &my_charset_latin1); table->field[5]->store(sql_text, sql_text_len, client_cs);
table->file->ha_write_row(table->record[0]); table->file->ha_write_row(table->record[0]);
reenable_binlog(current_thd); reenable_binlog(current_thd);
...@@ -375,6 +376,7 @@ bool Log_to_csv_event_handler:: ...@@ -375,6 +376,7 @@ bool Log_to_csv_event_handler::
{ {
/* table variables */ /* table variables */
TABLE *table= slow_log.table; TABLE *table= slow_log.table;
CHARSET_INFO *client_cs= thd->variables.character_set_client;
DBUG_ENTER("log_slow_to_csv"); DBUG_ENTER("log_slow_to_csv");
...@@ -395,7 +397,7 @@ bool Log_to_csv_event_handler:: ...@@ -395,7 +397,7 @@ bool Log_to_csv_event_handler::
table->field[0]->set_null(); table->field[0]->set_null();
/* store the value */ /* store the value */
table->field[1]->store(user_host, user_host_len, &my_charset_latin1); table->field[1]->store(user_host, user_host_len, client_cs);
if (query_start_arg) if (query_start_arg)
{ {
...@@ -418,7 +420,7 @@ bool Log_to_csv_event_handler:: ...@@ -418,7 +420,7 @@ bool Log_to_csv_event_handler::
if (thd->db) if (thd->db)
/* fill database field */ /* fill database field */
table->field[6]->store(thd->db, thd->db_length, &my_charset_latin1); table->field[6]->store(thd->db, thd->db_length, client_cs);
else else
table->field[6]->set_null(); table->field[6]->set_null();
...@@ -436,8 +438,7 @@ bool Log_to_csv_event_handler:: ...@@ -436,8 +438,7 @@ bool Log_to_csv_event_handler::
table->field[9]->store((longlong) server_id); table->field[9]->store((longlong) server_id);
/* sql_text */ /* sql_text */
table->field[10]->store(sql_text,sql_text_len, table->field[10]->store(sql_text,sql_text_len, client_cs);
&my_charset_latin1);
/* write the row */ /* write the row */
table->file->ha_write_row(table->record[0]); table->file->ha_write_row(table->record[0]);
...@@ -493,7 +494,8 @@ bool Log_to_file_event_handler:: ...@@ -493,7 +494,8 @@ bool Log_to_file_event_handler::
log_general(time_t event_time, const char *user_host, log_general(time_t event_time, const char *user_host,
uint user_host_len, int thread_id, uint user_host_len, int thread_id,
const char *command_type, uint command_type_len, const char *command_type, uint command_type_len,
const char *sql_text, uint sql_text_len) const char *sql_text, uint sql_text_len,
CHARSET_INFO *client_cs)
{ {
return mysql_log.write(event_time, user_host, user_host_len, return mysql_log.write(event_time, user_host, user_host_len,
thread_id, command_type, command_type_len, thread_id, command_type, command_type_len,
...@@ -809,7 +811,8 @@ bool LOGGER::general_log_print(THD *thd, enum enum_server_command command, ...@@ -809,7 +811,8 @@ bool LOGGER::general_log_print(THD *thd, enum enum_server_command command,
user_host_len, id, user_host_len, id,
command_name[(uint) command].str, command_name[(uint) command].str,
command_name[(uint) command].length, command_name[(uint) command].length,
message_buff, message_buff_len) || error; message_buff, message_buff_len,
thd->variables.character_set_client) || error;
unlock(); unlock();
} }
return error; return error;
......
...@@ -368,7 +368,8 @@ class Log_event_handler ...@@ -368,7 +368,8 @@ class Log_event_handler
virtual bool log_general(time_t event_time, const char *user_host, virtual bool log_general(time_t event_time, const char *user_host,
uint user_host_len, int thread_id, uint user_host_len, int thread_id,
const char *command_type, uint command_type_len, const char *command_type, uint command_type_len,
const char *sql_text, uint sql_text_len)= 0; const char *sql_text, uint sql_text_len,
CHARSET_INFO *client_cs)= 0;
virtual ~Log_event_handler() {} virtual ~Log_event_handler() {}
}; };
...@@ -403,7 +404,8 @@ class Log_to_csv_event_handler: public Log_event_handler ...@@ -403,7 +404,8 @@ class Log_to_csv_event_handler: public Log_event_handler
virtual bool log_general(time_t event_time, const char *user_host, virtual bool log_general(time_t event_time, const char *user_host,
uint user_host_len, int thread_id, uint user_host_len, int thread_id,
const char *command_type, uint command_type_len, const char *command_type, uint command_type_len,
const char *sql_text, uint sql_text_len); const char *sql_text, uint sql_text_len,
CHARSET_INFO *client_cs);
bool flush(THD *thd, TABLE_LIST *close_slow_Log, bool flush(THD *thd, TABLE_LIST *close_slow_Log,
TABLE_LIST* close_general_log); TABLE_LIST* close_general_log);
void close_log_table(uint log_type, bool lock_in_use); void close_log_table(uint log_type, bool lock_in_use);
...@@ -431,7 +433,8 @@ class Log_to_file_event_handler: public Log_event_handler ...@@ -431,7 +433,8 @@ class Log_to_file_event_handler: public Log_event_handler
virtual bool log_general(time_t event_time, const char *user_host, virtual bool log_general(time_t event_time, const char *user_host,
uint user_host_len, int thread_id, uint user_host_len, int thread_id,
const char *command_type, uint command_type_len, const char *command_type, uint command_type_len,
const char *sql_text, uint sql_text_len); const char *sql_text, uint sql_text_len,
CHARSET_INFO *client_cs);
void flush(); void flush();
void init_pthread_objects(); void init_pthread_objects();
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment