summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <aelkin@mysql.com>2006-05-09 23:01:31 +0300
committerunknown <aelkin@mysql.com>2006-05-09 23:01:31 +0300
commitc23c38fa31ff9f7350c342a3fb8142e04b10e121 (patch)
tree61ba64452d42f5b52941e0cad96049ff2bed1302
parentf9216cdf8d40c0552382fd0788d03dc20db2d94c (diff)
downloadmariadb-git-c23c38fa31ff9f7350c342a3fb8142e04b10e121.tar.gz
BUG#14157: utf8 encoding in binlog without set character_set_client e.g DROP temporary
Binlog lacks encoding info about DROPped temporary table. Idea of the fix is to switch temporary to system_charset_info when a temporary table is DROPped for binlog. Since that is the server, that automatically, but not the client, who generates the query the binlog should be updated on the server's encoding for the coming DROP. The `write_binlog_with_system_charset()' is introduced to replace similar problematic places in the code. mysql-test/r/drop_temp_table.result: results changed mysql-test/r/mix_innodb_myisam_binlog.result: results changed mysql-test/r/mysqlbinlog.result: results changed mysql-test/r/rpl_temporary.result: results changed mysql-test/t/mysqlbinlog.test: Check roll-forward recovery from binlog where there are DROP temporary tables created in koi8r. mysql-test/t/rpl_temporary.test: Check slave digests binlog with DROP temporary tables created in koi8r. sql/mysql_priv.h: `write_binlog_with_system_charset()' is added to be called when a binlog event is created "implicitly" like DROP temporary table is case of closing connection. sql/sql_base.cc: Idea of the fix is to switch temporary to system_charset_info when a temporary table is DROPped for binlog. Since that is the server, not the client, who generates the query the binlog should be updated on server's encoding for the coming DROP.
-rw-r--r--mysql-test/r/drop_temp_table.result1
-rw-r--r--mysql-test/r/mix_innodb_myisam_binlog.result5
-rw-r--r--mysql-test/r/mysqlbinlog.result7
-rw-r--r--mysql-test/r/rpl_temporary.result4
-rw-r--r--mysql-test/t/mysqlbinlog.test11
-rw-r--r--mysql-test/t/rpl_temporary.test12
-rw-r--r--sql/mysql_priv.h7
-rw-r--r--sql/sql_base.cc2
8 files changed, 44 insertions, 5 deletions
diff --git a/mysql-test/r/drop_temp_table.result b/mysql-test/r/drop_temp_table.result
index 5f1f142cde5..40afd621676 100644
--- a/mysql-test/r/drop_temp_table.result
+++ b/mysql-test/r/drop_temp_table.result
@@ -17,6 +17,7 @@ master-bin.000001 # Query 1 # create database `drop-temp+table-test`
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table shortn1 (a int)
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table `table:name` (a int)
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table shortn2 (a int)
+master-bin.000001 # Query 1 # use `drop-temp+table-test`; SET ONE_SHOT CHARACTER_SET_CLIENT=33,COLLATION_CONNECTION=8,COLLATION_DATABASE=8,COLLATION_SERVER=8
master-bin.000001 # Query 1 # use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `drop-temp+table-test`.`shortn2`,`drop-temp+table-test`.`table:name`,`drop-temp+table-test`.`shortn1`
master-bin.000001 # Query 1 # use `drop-temp+table-test`; DO RELEASE_LOCK("a")
drop database `drop-temp+table-test`;
diff --git a/mysql-test/r/mix_innodb_myisam_binlog.result b/mysql-test/r/mix_innodb_myisam_binlog.result
index e9613bac833..8cf99e8d623 100644
--- a/mysql-test/r/mix_innodb_myisam_binlog.result
+++ b/mysql-test/r/mix_innodb_myisam_binlog.result
@@ -249,7 +249,8 @@ master-bin.000001 1056 Query 1 1056 use `test`; insert t0 select * from t1
master-bin.000001 1117 Query 1 1117 use `test`; DO RELEASE_LOCK("a")
master-bin.000001 1172 Query 1 1172 use `test`; insert into t0 select GET_LOCK("lock1",null)
master-bin.000001 1251 Query 1 1251 use `test`; create table t2 (n int) engine=innodb
-master-bin.000001 1323 Query 1 1323 use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `test`.`t1`,`test`.`ti`
-master-bin.000001 1424 Query 1 1424 use `test`; DO RELEASE_LOCK("lock1")
+master-bin.000001 1323 Query 1 1323 use `test`; SET ONE_SHOT CHARACTER_SET_CLIENT=33,COLLATION_CONNECTION=8,COLLATION_DATABASE=8,COLLATION_SERVER=8
+master-bin.000001 1457 Query 1 1457 use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `test`.`t1`,`test`.`ti`
+master-bin.000001 1558 Query 1 1558 use `test`; DO RELEASE_LOCK("lock1")
do release_lock("lock1");
drop table t0,t2;
diff --git a/mysql-test/r/mysqlbinlog.result b/mysql-test/r/mysqlbinlog.result
index adaf0dad56b..bade0ca9b46 100644
--- a/mysql-test/r/mysqlbinlog.result
+++ b/mysql-test/r/mysqlbinlog.result
@@ -101,4 +101,9 @@ HEX(f)
select HEX(f) from t4;
HEX(f)
835C
-drop table t1, t2, t03, t04, t3, t4;
+flush logs;
+select * from t5 /* must be (1),(1) */;
+a
+1
+1
+drop table t1, t2, t03, t04, t3, t4, t5;
diff --git a/mysql-test/r/rpl_temporary.result b/mysql-test/r/rpl_temporary.result
index cd67d2592a8..8c6d3f232b1 100644
--- a/mysql-test/r/rpl_temporary.result
+++ b/mysql-test/r/rpl_temporary.result
@@ -103,3 +103,7 @@ select * from t1 /* must be 1 */;
f
1
drop table t1;
+select * from t1;
+a
+1
+drop table t1;
diff --git a/mysql-test/t/mysqlbinlog.test b/mysql-test/t/mysqlbinlog.test
index 871886331f6..11aa5814bda 100644
--- a/mysql-test/t/mysqlbinlog.test
+++ b/mysql-test/t/mysqlbinlog.test
@@ -114,8 +114,17 @@ select HEX(f) from t3;
select HEX(f) from t04;
select HEX(f) from t4;
+#
+#14157: utf8 encoding in binlog without set character_set_client
+#
+flush logs;
+--exec $MYSQL --default-character-set=koi8r test -e 'create table if not exists t5 (a int); set names koi8r; create temporary table `только герои срезают рашпилем грим` (a int); insert into `только герои срезают рашпилем грим` values (1); insert into t5 select * from `только герои срезают рашпилем грим`'
+
+# resulted log is client charset insensitive (latin1 not koi8r) as it must be
+--exec $MYSQL_BINLOG --short-form $MYSQL_TEST_DIR/var/log/master-bin.000006 | $MYSQL --default-character-set=latin1
+select * from t5 /* must be (1),(1) */;
# clean up
-drop table t1, t2, t03, t04, t3, t4;
+drop table t1, t2, t03, t04, t3, t4, t5;
# End of 4.1 tests
diff --git a/mysql-test/t/rpl_temporary.test b/mysql-test/t/rpl_temporary.test
index 71d7b32b7c9..af952760d6b 100644
--- a/mysql-test/t/rpl_temporary.test
+++ b/mysql-test/t/rpl_temporary.test
@@ -156,4 +156,16 @@ select * from t1 /* must be 1 */;
connection master;
drop table t1;
+#
+#14157: utf8 encoding in binlog without set character_set_client
+#
+--exec $MYSQL --default-character-set=koi8r test -e 'create table t1 (a int); set names koi8r; create temporary table `только герои срезают рашпилем грим` (a int); insert into `только герои срезают рашпилем грим` values (1); insert into t1 select * from `только герои срезают рашпилем грим`'
+
+sync_slave_with_master;
+#connection slave;
+select * from t1;
+
+connection master;
+drop table t1;
+
# End of 4.1 tests
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 6676d994cfa..aab65bca82f 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -1275,6 +1275,13 @@ inline int hexchar_to_int(char c)
return -1;
}
+inline void write_binlog_with_system_charset(THD * thd, Query_log_event * qinfo)
+{
+ CHARSET_INFO * cs_save= thd->variables.character_set_client;
+ thd->variables.character_set_client= system_charset_info;
+ mysql_bin_log.write(qinfo);
+ thd->variables.character_set_client= cs_save;
+}
/*
Some functions that are different in the embedded library and the normal
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 60e91aff3f9..6365b8c8e40 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -615,7 +615,7 @@ void close_temporary_tables(THD *thd)
rightfully causing the slave to stop.
*/
qinfo.error_code= 0;
- mysql_bin_log.write(&qinfo);
+ write_binlog_with_system_charset(thd, &qinfo);
}
else
{