List:Commits« Previous MessageNext Message »
From:Li-Bing.Song Date:July 13 2009 7:43am
Subject:bzr commit into mysql-5.0-bugteam branch (Li-Bing.Song:2772) Bug#45516
View as plain text  
#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
Thread
bzr commit into mysql-5.0-bugteam branch (Li-Bing.Song:2772) Bug#45516Li-Bing.Song13 Jul
  • Re: bzr commit into mysql-5.0-bugteam branch (Li-Bing.Song:2772)Bug#45516He Zhenxing15 Jul