From 7b6ff85e435ef9971cc4ad1f9aaa3d3c92e745f1 Mon Sep 17 00:00:00 2001 From: Alfranio Correia Date: Tue, 27 Jan 2009 20:49:37 +0000 Subject: [PATCH] BUG#36391: "mysqlbinlog creates invalid charset statements" The fix for BUG#20103 "Escaping with backslash does not work as expected" was implemented too greedy though in that it not only changes the behavior of backslashes within strings but in general, so disabling command shortcuts like \G or \C (which in turn leads to Bug #36391: "mysqlbinlog creates invalid charset statements"). The fix allows the escaping with backslash to take place only inside a string, thus enabling the execution of command shortcuts and presevering the fix for BUG#20103. --- client/mysql.cc | 3 +- mysql-test/suite/bugs/r/rpl_bug36391.result | 17 +++++++++++ .../suite/bugs/t/rpl_bug36391-master.opt | 1 + mysql-test/suite/bugs/t/rpl_bug36391.test | 28 +++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/bugs/r/rpl_bug36391.result create mode 100644 mysql-test/suite/bugs/t/rpl_bug36391-master.opt create mode 100644 mysql-test/suite/bugs/t/rpl_bug36391.test diff --git a/client/mysql.cc b/client/mysql.cc index 3de616ae407..be157f52d08 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -2044,7 +2044,8 @@ static bool add_line(String &buffer,char *line,char *in_string, } #endif if (!*ml_comment && inchar == '\\' && - !(mysql.server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)) + !(*in_string && + (mysql.server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES))) { // Found possbile one character command like \c diff --git a/mysql-test/suite/bugs/r/rpl_bug36391.result b/mysql-test/suite/bugs/r/rpl_bug36391.result new file mode 100644 index 00000000000..2d62837a87a --- /dev/null +++ b/mysql-test/suite/bugs/r/rpl_bug36391.result @@ -0,0 +1,17 @@ +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 table if exists t1; +Warnings: +Note 1051 Unknown table 't1' +create table t1(id int); +show tables; +Tables_in_test +t1 +show master status; +File Position Binlog_Do_DB Binlog_Ignore_DB +master-bin.000001 278 +flush logs; diff --git a/mysql-test/suite/bugs/t/rpl_bug36391-master.opt b/mysql-test/suite/bugs/t/rpl_bug36391-master.opt new file mode 100644 index 00000000000..56273241f14 --- /dev/null +++ b/mysql-test/suite/bugs/t/rpl_bug36391-master.opt @@ -0,0 +1 @@ +--sql_mode=NO_BACKSLASH_ESCAPES diff --git a/mysql-test/suite/bugs/t/rpl_bug36391.test b/mysql-test/suite/bugs/t/rpl_bug36391.test new file mode 100644 index 00000000000..9f384304837 --- /dev/null +++ b/mysql-test/suite/bugs/t/rpl_bug36391.test @@ -0,0 +1,28 @@ +# +# BUG#36391 and BUG#38731 +# +# The fix for BUG#20103 "Escaping with backslash does not work as expected" +# was implemented too greedy though in that it not only changes the behavior +# of backslashes within strings but in general, so disabling command shortcuts +# like \G or \C (which in turn leads to BUG#36391: "mysqlbinlog creates invalid charset statements". +# +# The test executes simple commands that are stored in the binary log and +# re-execute them through the mysql client which should have to process +# some command shortcuts. The backslashes within strings is disabled in the file +# rpl_bug36391-master.opt by the option --sql_mode=NO_BACKSLASH_ESCAPES. +# +# + +--source include/master-slave.inc + +drop table if exists t1; + +create table t1(id int); + +show tables; + +show master status; + +flush logs; + +--exec $MYSQL_BINLOG $MYSQL_TEST_DIR/var/log/master-bin.000001 | $MYSQL test