#At file:///home/anders/work/bzrwork/bug45516/mysql-5.0-bugteam/ based on revid:joro@strippeda9p8wvcw4k
2772 Li-Bing.Song@stripped 2009-07-13
BUG#45516 SQL thread does not use database charset properly
This patch is a follow up to http://lists.mysql.com/commits/45516.
that Replication SQL thread does not set database charset to
thd->variables.collation_database properly.
This bug can be repeated by using "LOAD DATA" command in STATEMENT mode.
Slave server assign the relay log's database to the thd->db
when it executes one relay log entry, but thd->db_charset is not changed.
This patch adds code to find the default character set of the current database
then assign it to thd->db_charset when slave server begins to execute a relay log.
added:
mysql-test/include/rpl_bug45516.inc
mysql-test/r/rpl_bug45516.result
mysql-test/std_data/rpl_bug45516.dat
mysql-test/t/rpl_bug45516.test
modified:
sql/log_event.cc
=== added file 'mysql-test/include/rpl_bug45516.inc'
--- a/mysql-test/include/rpl_bug45516.inc 1970-01-01 00:00:00 +0000
+++ b/mysql-test/include/rpl_bug45516.inc 2009-07-13 07:43:28 +0000
@@ -0,0 +1,37 @@
+connection master;
+--disable_warnings
+DROP DATABASE IF EXISTS mysqltest;
+--enable_warnings
+
+CREATE DATABASE mysqltest CHARSET UTF8;
+CREATE TABLE mysqltest.t (cl varchar(100)) CHARSET UTF8;
+
+USE mysqltest;
+
+if (`SELECT '$LOAD_LOCALE' = 'server'`)
+{
+ let $DATAFILE= ./var/master-data/rpl_bug45516.dat;
+ copy_file ./std_data/rpl_bug45516.dat $DATAFILE;
+
+ LOAD DATA INFILE './rpl_bug45516.dat' INTO TABLE mysqltest.t
+ FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
+}
+if (`SELECT '$LOAD_LOCALE' = 'local'`)
+{
+ LOAD DATA LOCAL INFILE './std_data/rpl_bug45516.dat' INTO TABLE mysqltest.t
+ FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
+}
+save_master_pos;
+echo ==========content on master==========;
+SELECT hex(cl) FROM mysqltest.t;
+
+connection slave;
+sync_with_master;
+echo ==========content on slave==========;
+SELECT hex(cl) FROM mysqltest.t;
+
+connection master;
+DROP DATABASE mysqltest;
+save_master_pos;
+connection slave;
+sync_with_master;
=== added file 'mysql-test/r/rpl_bug45516.result'
--- a/mysql-test/r/rpl_bug45516.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/rpl_bug45516.result 2009-07-13 07:43:28 +0000
@@ -0,0 +1,44 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+DROP DATABASE IF EXISTS mysqltest;
+CREATE DATABASE mysqltest CHARSET UTF8;
+CREATE TABLE mysqltest.t (cl varchar(100)) CHARSET UTF8;
+USE mysqltest;
+LOAD DATA LOCAL INFILE './std_data/rpl_bug45516.dat' INTO TABLE mysqltest.t
+FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
+==========content on master==========
+SELECT hex(cl) FROM mysqltest.t;
+hex(cl)
+E4B880E4BA8CE4B889
+E59B9BE4BA94E585AD
+E4B883E585ABE4B99D
+==========content on slave==========
+SELECT hex(cl) FROM mysqltest.t;
+hex(cl)
+E4B880E4BA8CE4B889
+E59B9BE4BA94E585AD
+E4B883E585ABE4B99D
+DROP DATABASE mysqltest;
+DROP DATABASE IF EXISTS mysqltest;
+CREATE DATABASE mysqltest CHARSET UTF8;
+CREATE TABLE mysqltest.t (cl varchar(100)) CHARSET UTF8;
+USE mysqltest;
+LOAD DATA INFILE './rpl_bug45516.dat' INTO TABLE mysqltest.t
+FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
+==========content on master==========
+SELECT hex(cl) FROM mysqltest.t;
+hex(cl)
+E4B880E4BA8CE4B889
+E59B9BE4BA94E585AD
+E4B883E585ABE4B99D
+==========content on slave==========
+SELECT hex(cl) FROM mysqltest.t;
+hex(cl)
+E4B880E4BA8CE4B889
+E59B9BE4BA94E585AD
+E4B883E585ABE4B99D
+DROP DATABASE mysqltest;
=== added file 'mysql-test/std_data/rpl_bug45516.dat'
--- a/mysql-test/std_data/rpl_bug45516.dat 1970-01-01 00:00:00 +0000
+++ b/mysql-test/std_data/rpl_bug45516.dat 2009-07-13 07:43:28 +0000
@@ -0,0 +1,3 @@
+一二三
+四五六
+
--- a/mysql-test/t/rpl_bug45516.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/rpl_bug45516.test 2009-07-13 07:43:28 +0000
@@ -0,0 +1,11 @@
+source include/master-slave.inc;
+
+# LOAD DATA LOCAL INFILE
+let $LOAD_LOCALE= local;
+source include/rpl_bug45516.inc;
+
+# LOAD DATA INFILE
+let $LOAD_LOCALE= server;
+source include/rpl_bug45516.inc;
+
+#source include/master-slave-end.inc;
=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc 2009-06-09 16:11:21 +0000
+++ b/sql/log_event.cc 2009-07-13 07:43:28 +0000
@@ -1918,6 +1918,7 @@ int Query_log_event::exec_event(struct s
{
const char *new_db= rewrite_db(db);
int expected_error,actual_error= 0;
+ HA_CREATE_INFO db_options;
/*
Colleagues: please never free(thd->catalog) in MySQL. This would lead to
bugs as here thd->catalog is a part of an alloced block, not an entire
@@ -1926,6 +1927,9 @@ int Query_log_event::exec_event(struct s
*/
thd->catalog= catalog_len ? (char *) catalog : (char *)"";
thd->set_db(new_db, (uint) strlen(new_db)); /* allocates a copy of 'db' */
+ load_db_opt_by_name(thd, thd->db, &db_options);
+ if (db_options.default_table_charset)
+ thd->db_charset= db_options.default_table_charset;
thd->variables.auto_increment_increment= auto_increment_increment;
thd->variables.auto_increment_offset= auto_increment_offset;
Attachment: [text/bzr-bundle] bzr/li-bing.song@sun.com-20090713074328-2ijmqyb0ed7gor4w.bundle