MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:He Zhenxing Date:August 17 2010 12:14pm
Subject:Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3479)
WL#5370
View as plain text  
Hi, 

INSERT INTO t1 /*!SELECT 1*/;

Will be illegal on other DB systems, I think the following is slightly better 
(Please add a ' ' after /*!):

/*! INSERT INTO t1 SELECT 1*/;

But still I think this is a bad hack :(

Patch approved after address the above comment.


Li-Bing.Song@stripped wrote: 
> #At file:///home/anders/work/bzrwork1/wt3/mysql-5.1-bugteam/ based on
> revid:georgi.kodinov@stripped
> 
>  3479 Li-Bing.Song@stripped	2010-08-17
>       WL#5370 Keep forward-compatibility when changing
>               'CREATE TABLE IF NOT EXISTS ... SELECT' behaviour
>       
>       This is the 5.1 part.
>       It implements:
>       - if the table exists, binlog two events: CREATE TABLE IF NOT EXISTS
>         and INSERT ... SELECT
>       
>       - Insert nothing and binlog nothing on master if the existing object
>         is a view. It only generates a warning that table already exists.
>      @ sql/sql_class.h
>         Declare virtual function write_to_binlog() for select_insert.
>         It's used to binlog 'create select'
>      @ sql/sql_insert.cc
>         Implement write_to_binlog();
>         Use write_to_binlog() instead of binlog_query() to binlog the statement.
>         if the table exists, binlog two events: CREATE TABLE IF NOT EXISTS
>         and INSERT ... SELECT
>      @ sql/sql_lex.h
>         Declare create_select_start_with_brace and create_select_pos.
>         They are helpful for binlogging 'create select'
>      @ sql/sql_parse.cc
>         Do nothing on master if the existing object is a view.
>      @ sql/sql_yacc.yy
>         Record the relative postion of 'SELECT' in the 'CREATE ...SELECT' statement.
>         Record whether there is a '(' before the 'SELECT' clause.
> 
>     added:
>       mysql-test/extra/rpl_tests/rpl_stm_create_if_not_exists.test
>       mysql-test/suite/rpl/r/rpl_stm_create_if_not_exists.result
>       mysql-test/suite/rpl/t/rpl_stm_create_if_not_exists.test
>     modified:
>       mysql-test/include/commit.inc
>       mysql-test/include/rpl_diff_tables.inc
>       mysql-test/r/commit_1innodb.result
>       mysql-test/r/trigger.result
>       mysql-test/suite/rpl/r/rpl_create_tmp_table_if_not_exists.result
>       mysql-test/suite/rpl/r/rpl_row_create_table.result
>       mysql-test/suite/rpl/t/rpl_create_if_not_exists.test
>       mysql-test/suite/rpl/t/rpl_row_create_table.test
>       sql/sql_class.h
>       sql/sql_insert.cc
>       sql/sql_lex.h
>       sql/sql_parse.cc
>       sql/sql_yacc.yy
> === added file 'mysql-test/extra/rpl_tests/rpl_stm_create_if_not_exists.test'
> --- a/mysql-test/extra/rpl_tests/rpl_stm_create_if_not_exists.test	1970-01-01
> 00:00:00 +0000
> +++ b/mysql-test/extra/rpl_tests/rpl_stm_create_if_not_exists.test	2010-08-17
> 10:05:41 +0000
> @@ -0,0 +1,231 @@
> +--echo
> +--echo
> +connection master;
> +
> +if ($is_temporary)
> +{
> +  --let $_temporary=TEMPORARY
> +}
> +
> +CREATE TABLE t2(c1 INT, c2 char(10));
> +INSERT INTO t2 VALUES(1, 'abc'), (2, 'abc');
> +
> +--echo
> +--echo # The original query should be binlogged if the table does not exist.
> +--echo # ------------------------------------------------------------------
> +--echo
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1 (c1 INT , c2 INT, c3 char(10), c4 INT
> KEY)
> +  SELECT 'abc' AS c3, 1 AS c4;
> +source include/show_binlog_events.inc;
> +
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +
> +--echo
> +--echo # The statement should be binlogged as two events. one is 
> +--echo # 'CREATE $_temporary TABLE IF NOT EXISTS ..', another one is
> +--echo # 'INSERT ... SELECT'.
> +--echo # ------------------------------------------------------------------
> +--echo
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  SELECT 'abc', 2;
> +source include/show_binlog_events.inc;
> +
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +
> +--disable_warnings
> +DROP DATABASE IF EXISTS db1;
> +--enable_warnings
> +CREATE DATABASE db1;
> +USE db1;
> +
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +eval CREATE $_temporary TABLE IF NOT EXISTS test.t1
> +  SELECT 'abc', 20;
> +source include/show_binlog_events.inc;
> +
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +USE test;
> +DROP DATABASE db1;
> +
> +--echo
> +--echo # It should be binlogged as 'REPLACE ... SELECT'
> +--echo # if the original statement has option REPLACE
> +--echo
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  REPLACE SELECT '123', 2;
> +source include/show_binlog_events.inc;
> +
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +
> +--echo
> +--echo # It should be binlogged as 'INSERT IGNORE... SELECT'
> +--echo # if the original statement has option IGNORE 
> +--echo
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  IGNORE SELECT '123', 2;
> +source include/show_binlog_events.inc;
> +
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +
> +--echo
> +--echo # Nothing should be binlogged if error happens and no any row is inserted
> +--echo
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +--error ER_DUP_ENTRY
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  SELECT '123', 2;
> +source include/show_binlog_events.inc;
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +
> +--echo
> +--echo # Verify it can binlog well when there are some braces('(')
> +--echo
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  (SELECT '123', 3) UNION (SELECT '123', 4);
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  REPLACE (SELECT 'abc', 3) UNION (SELECT 'abc', 4);
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  IGNORE (SELECT '123', 3) UNION (SELECT '123', 4);
> +source include/show_binlog_events.inc;
> +
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +
> +if (!$is_temporary)
> +{
> +  --echo
> +  --echo # An error happens when the table already exists as a view.
> +  --echo
> +  CREATE VIEW t3 AS SELECT * FROM t2;
> +  let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +  CREATE TABLE IF NOT EXISTS t3
> +    SELECT '123', 2;
> +  source include/show_binlog_events.inc;
> +  DROP VIEW t3;
> +}
> +
> +--echo
> +--echo # The statement can be binlogged correctly when it is in a SP/EVENT/TRIGGER
> +--echo
> +
> +--disable_warnings
> +DROP PROCEDURE IF EXISTS p1;
> +--enable_warnings
> +eval CREATE PROCEDURE p1(IN a INT)
> +  CREATE $_temporary TABLE IF NOT EXISTS t1 SELECT '123', a;
> +
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +call p1(500);
> +call p1(600);
> +source include/show_binlog_events.inc;
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +DROP PROCEDURE p1;
> +
> +--echo
> +--echo # The statement can be binlogged correctly when it is in a prepared
> statement
> +--echo
> +eval PREPARE stm FROM "CREATE $_temporary TABLE IF NOT EXISTS t1 SELECT '123', ?";
> +
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +SET @a= 700;
> +EXECUTE stm USING @a;
> +SET @a= 800;
> +EXECUTE stm USING @a;
> +source include/show_binlog_events.inc;
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +
> +--echo
> +--echo # The statement can be binlogged correctly when it is in a conditional
> comment
> +--echo
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +--echo # The whole statement in a conditional comment
> +eval /*!CREATE $_temporary TABLE IF NOT EXISTS t1
> +  SELECT 'abc', 900*/;
> +source include/show_binlog_events.inc;
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +--echo
> +--echo # There is an long comment before SELECT
> +eval /*!CREATE $_temporary /*blabla*/ TABLE IF NOT EXISTS t1
> +  SELECT 'abc', 901*/;
> +source include/show_binlog_events.inc;
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +--echo
> +--echo # Conditional comment starts just from SELECT
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  /*!SELECT 'abc',*/ 902;
> +source include/show_binlog_events.inc;
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +--echo
> +--echo # Only SELECT keyword is in the conditional comment
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  /*!SELECT*/ /*!'abc',*/ 904;
> +source include/show_binlog_events.inc;
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +--echo
> +--echo # Conditional comment is after SELECT keyword
> +eval CREATE $_temporary TABLE IF NOT EXISTS t1
> +  SELECT /*!'abc',*/ 903;
> +source include/show_binlog_events.inc;
> +let binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
> +
> +--echo
> +--echo # Conditional comment ends just before SELECT keyword
> +eval /*!CREATE $_temporary TABLE IF NOT EXISTS t1
> +  */SELECT 'abc', 905;
> +source include/show_binlog_events.inc;
> +
> +if (!$is_temporary)
> +{
> +  let $diff_table= test.t1;
> +  source include/rpl_diff_tables.inc;
> +}
> +
> +DROP TABLE t2;
> +eval DROP $_temporary TABLE t1;
> +
> 
> === modified file 'mysql-test/include/commit.inc'
> --- a/mysql-test/include/commit.inc	2010-07-20 17:36:15 +0000
> +++ b/mysql-test/include/commit.inc	2010-08-17 10:05:41 +0000
> @@ -717,7 +717,10 @@ call p_verify_status_increment(4, 4, 4, 
>  --echo # 31. DDL: various DDL with transactional tables
>  --echo #
>  --echo # Sic: no table is created.
> +# The warning happens only on SBR, so disable it.
> +--disable_warnings
>  create table if not exists t2 (a int) select 6 union select 7;
> +--enable_warnings
>  --echo # Sic: first commits the statement, and then the transaction.
>  call p_verify_status_increment(4, 4, 4, 4);
>  create table t3 select a from t2;
> 
> === modified file 'mysql-test/include/rpl_diff_tables.inc'
> --- a/mysql-test/include/rpl_diff_tables.inc	2010-07-04 04:02:49 +0000
> +++ b/mysql-test/include/rpl_diff_tables.inc	2010-08-17 10:05:41 +0000
> @@ -33,3 +33,4 @@ while (`SELECT "XX$_servers" <> "XX"`)
>    --source include/diff_tables.inc
>    connection $_slave;
>  }
> +connection $_master;
> 
> === modified file 'mysql-test/r/commit_1innodb.result'
> --- a/mysql-test/r/commit_1innodb.result	2010-07-20 17:36:15 +0000
> +++ b/mysql-test/r/commit_1innodb.result	2010-08-17 10:05:41 +0000
> @@ -826,8 +826,6 @@ SUCCESS
>  #
>  # Sic: no table is created.
>  create table if not exists t2 (a int) select 6 union select 7;
> -Warnings:
> -Note	1050	Table 't2' already exists
>  # Sic: first commits the statement, and then the transaction.
>  call p_verify_status_increment(4, 4, 4, 4);
>  SUCCESS
> 
> === modified file 'mysql-test/r/trigger.result'
> --- a/mysql-test/r/trigger.result	2010-07-08 18:46:26 +0000
> +++ b/mysql-test/r/trigger.result	2010-08-17 10:05:41 +0000
> @@ -1824,11 +1824,8 @@ Note	1050	Table 'v1' already exists
>  set @id=last_insert_id();
>  select * from t1;
>  id	operation
> -1	CREATE TABLE ... SELECT, inserting a new key
>  select * from t1_op_log;
>  operation
> -Before INSERT, new=CREATE TABLE ... SELECT, inserting a new key
> -After INSERT, new=CREATE TABLE ... SELECT, inserting a new key
>  truncate t1_op_log;
>  create table if not exists v1 replace
>  select @id, "CREATE TABLE ... REPLACE SELECT, deleting a duplicate key";
> @@ -1836,13 +1833,8 @@ Warnings:
>  Note	1050	Table 'v1' already exists
>  select * from t1;
>  id	operation
> -1	CREATE TABLE ... REPLACE SELECT, deleting a duplicate key
>  select * from t1_op_log;
>  operation
> -Before INSERT, new=CREATE TABLE ... REPLACE SELECT, deleting a duplicate key
> -Before DELETE, old=CREATE TABLE ... SELECT, inserting a new key
> -After DELETE, old=CREATE TABLE ... SELECT, inserting a new key
> -After INSERT, new=CREATE TABLE ... REPLACE SELECT, deleting a duplicate key
>  truncate t1;
>  truncate t1_op_log;
>  insert into v1 (id, operation)
> 
> === modified file 'mysql-test/suite/rpl/r/rpl_create_tmp_table_if_not_exists.result'
> --- a/mysql-test/suite/rpl/r/rpl_create_tmp_table_if_not_exists.result	2009-08-13
> 02:48:57 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_create_tmp_table_if_not_exists.result	2010-08-17
> 10:05:41 +0000
> @@ -19,4 +19,9 @@ master-bin.000001	#	Query	#	#	use `test`
>  master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS tmp1
> LIKE tmp
>  master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS tmp1
> LIKE tmp
>  master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS tmp2
> SELECT * FROM tmp
> -master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS tmp2
> SELECT * FROM tmp
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS
> `tmp2` (
> +  `c1` int(11) DEFAULT NULL
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`tmp2` (`c1`) SELECT *
> FROM tmp
> +master-bin.000001	#	Query	#	#	COMMIT
> 
> === modified file 'mysql-test/suite/rpl/r/rpl_row_create_table.result'
> --- a/mysql-test/suite/rpl/r/rpl_row_create_table.result	2010-05-24 13:54:08 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_row_create_table.result	2010-08-17 10:05:41 +0000
> @@ -467,4 +467,10 @@ DROP VIEW IF EXISTS bug48506_t1, bug4850
>  DROP TEMPORARY TABLES t7;
>  DROP TABLES t4, t5;
>  DROP TABLES IF EXISTS bug48506_t4;
> +CREATE TABLE t1 SELECT 1;
> +CREATE TABLE IF NOT EXISTS t1 SELECT 1;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +Comparing tables master:test.t1 and slave:test.t1
> +DROP TABLE t1;
>  end of the tests
> 
> === added file 'mysql-test/suite/rpl/r/rpl_stm_create_if_not_exists.result'
> --- a/mysql-test/suite/rpl/r/rpl_stm_create_if_not_exists.result	1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/r/rpl_stm_create_if_not_exists.result	2010-08-17 10:05:41
> +0000
> @@ -0,0 +1,696 @@
> +# WL#5370 Keep forward-compatibility when changing 'CREATE TABLE IF NOT
> +# EXISTS ... SELECT' behaviour
> +#
> +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;
> +
> +
> +CREATE TABLE t2(c1 INT, c2 char(10));
> +INSERT INTO t2 VALUES(1, 'abc'), (2, 'abc');
> +
> +# The original query should be binlogged if the table does not exist.
> +# ------------------------------------------------------------------
> +
> +CREATE  TABLE IF NOT EXISTS t1 (c1 INT , c2 INT, c3 char(10), c4 INT KEY)
> +SELECT 'abc' AS c3, 1 AS c4;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; CREATE  TABLE IF NOT EXISTS t1 (c1 INT ,
> c2 INT, c3 char(10), c4 INT KEY)
> +SELECT 'abc' AS c3, 1 AS c4
> +Comparing tables master:test.t1 and slave:test.t1
> +
> +# The statement should be binlogged as two events. one is 
> +# 'CREATE  TABLE IF NOT EXISTS ..', another one is
> +# 'INSERT ... SELECT'.
> +# ------------------------------------------------------------------
> +
> +CREATE  TABLE IF NOT EXISTS t1
> +SELECT 'abc', 2;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> 'abc', 2
> +master-bin.000001	#	Query	#	#	COMMIT
> +Comparing tables master:test.t1 and slave:test.t1
> +DROP DATABASE IF EXISTS db1;
> +CREATE DATABASE db1;
> +USE db1;
> +CREATE  TABLE IF NOT EXISTS test.t1
> +SELECT 'abc', 20;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `db1`; CREATE TABLE IF NOT EXISTS `test`.`t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `db1`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> 'abc', 20
> +master-bin.000001	#	Query	#	#	COMMIT
> +Comparing tables master:test.t1 and slave:test.t1
> +USE test;
> +DROP DATABASE db1;
> +
> +# It should be binlogged as 'REPLACE ... SELECT'
> +# if the original statement has option REPLACE
> +
> +CREATE  TABLE IF NOT EXISTS t1
> +REPLACE SELECT '123', 2;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; REPLACE INTO `test`.`t1` (`c3`,`c4`)
> SELECT '123', 2
> +master-bin.000001	#	Query	#	#	COMMIT
> +Comparing tables master:test.t1 and slave:test.t1
> +
> +# It should be binlogged as 'INSERT IGNORE... SELECT'
> +# if the original statement has option IGNORE 
> +
> +CREATE  TABLE IF NOT EXISTS t1
> +IGNORE SELECT '123', 2;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT IGNORE INTO `test`.`t1` (`c3`,`c4`)
> SELECT '123', 2
> +master-bin.000001	#	Query	#	#	COMMIT
> +Comparing tables master:test.t1 and slave:test.t1
> +
> +# Nothing should be binlogged if error happens and no any row is inserted
> +
> +CREATE  TABLE IF NOT EXISTS t1
> +SELECT '123', 2;
> +ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +Comparing tables master:test.t1 and slave:test.t1
> +
> +# Verify it can binlog well when there are some braces('(')
> +
> +CREATE  TABLE IF NOT EXISTS t1
> +(SELECT '123', 3) UNION (SELECT '123', 4);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +CREATE  TABLE IF NOT EXISTS t1
> +REPLACE (SELECT 'abc', 3) UNION (SELECT 'abc', 4);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +CREATE  TABLE IF NOT EXISTS t1
> +IGNORE (SELECT '123', 3) UNION (SELECT '123', 4);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> (SELECT '123', 3) UNION (SELECT '123', 4)
> +master-bin.000001	#	Query	#	#	COMMIT
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; REPLACE INTO `test`.`t1` (`c3`,`c4`)
> (SELECT 'abc', 3) UNION (SELECT 'abc', 4)
> +master-bin.000001	#	Query	#	#	COMMIT
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT IGNORE INTO `test`.`t1` (`c3`,`c4`)
> (SELECT '123', 3) UNION (SELECT '123', 4)
> +master-bin.000001	#	Query	#	#	COMMIT
> +Comparing tables master:test.t1 and slave:test.t1
> +
> +# An error happens when the table already exists as a view.
> +
> +CREATE VIEW t3 AS SELECT * FROM t2;
> +CREATE TABLE IF NOT EXISTS t3
> +SELECT '123', 2;
> +Warnings:
> +Note	1050	Table 't3' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +DROP VIEW t3;
> +
> +# The statement can be binlogged correctly when it is in a SP/EVENT/TRIGGER
> +
> +DROP PROCEDURE IF EXISTS p1;
> +CREATE PROCEDURE p1(IN a INT)
> +CREATE  TABLE IF NOT EXISTS t1 SELECT '123', a;
> +call p1(500);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +call p1(600);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> '123',  NAME_CONST('a',500)
> +master-bin.000001	#	Query	#	#	COMMIT
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> '123',  NAME_CONST('a',600)
> +master-bin.000001	#	Query	#	#	COMMIT
> +Comparing tables master:test.t1 and slave:test.t1
> +DROP PROCEDURE p1;
> +
> +# The statement can be binlogged correctly when it is in a prepared statement
> +
> +PREPARE stm FROM "CREATE  TABLE IF NOT EXISTS t1 SELECT '123', ?";
> +SET @a= 700;
> +EXECUTE stm USING @a;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +SET @a= 800;
> +EXECUTE stm USING @a;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> '123', 700
> +master-bin.000001	#	Query	#	#	COMMIT
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> '123', 800
> +master-bin.000001	#	Query	#	#	COMMIT
> +Comparing tables master:test.t1 and slave:test.t1
> +
> +# The statement can be binlogged correctly when it is in a conditional comment
> +
> +# The whole statement in a conditional comment
> +/*!CREATE  TABLE IF NOT EXISTS t1
> +SELECT 'abc', 900*/;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> /*!SELECT 'abc', 900*/
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# There is an long comment before SELECT
> +/*!CREATE  /*blabla*/ TABLE IF NOT EXISTS t1
> +SELECT 'abc', 901*/;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> /*!SELECT 'abc', 901*/
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Conditional comment starts just from SELECT
> +CREATE  TABLE IF NOT EXISTS t1
> +/*!SELECT 'abc',*/ 902;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> /*!SELECT 'abc',*/ 902
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Only SELECT keyword is in the conditional comment
> +CREATE  TABLE IF NOT EXISTS t1
> +/*!SELECT*/ /*!'abc',*/ 904;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> /*!SELECT*/ /*!'abc',*/ 904
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Conditional comment is after SELECT keyword
> +CREATE  TABLE IF NOT EXISTS t1
> +SELECT /*!'abc',*/ 903;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> /*!'abc',*/ 903
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Conditional comment ends just before SELECT keyword
> +/*!CREATE  TABLE IF NOT EXISTS t1
> +*/SELECT 'abc', 905;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE IF NOT EXISTS `t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> 'abc', 905
> +master-bin.000001	#	Query	#	#	COMMIT
> +Comparing tables master:test.t1 and slave:test.t1
> +DROP TABLE t2;
> +DROP  TABLE t1;
> +
> +
> +CREATE TABLE t2(c1 INT, c2 char(10));
> +INSERT INTO t2 VALUES(1, 'abc'), (2, 'abc');
> +
> +# The original query should be binlogged if the table does not exist.
> +# ------------------------------------------------------------------
> +
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1 (c1 INT , c2 INT, c3 char(10), c4 INT KEY)
> +SELECT 'abc' AS c3, 1 AS c4;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS t1
> (c1 INT , c2 INT, c3 char(10), c4 INT KEY)
> +SELECT 'abc' AS c3, 1 AS c4
> +
> +# The statement should be binlogged as two events. one is 
> +# 'CREATE TEMPORARY TABLE IF NOT EXISTS ..', another one is
> +# 'INSERT ... SELECT'.
> +# ------------------------------------------------------------------
> +
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +SELECT 'abc', 2;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> 'abc', 2
> +master-bin.000001	#	Query	#	#	COMMIT
> +DROP DATABASE IF EXISTS db1;
> +CREATE DATABASE db1;
> +USE db1;
> +CREATE TEMPORARY TABLE IF NOT EXISTS test.t1
> +SELECT 'abc', 20;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `db1`; CREATE TEMPORARY TABLE IF NOT EXISTS
> `test`.`t1` (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `db1`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> 'abc', 20
> +master-bin.000001	#	Query	#	#	COMMIT
> +USE test;
> +DROP DATABASE db1;
> +
> +# It should be binlogged as 'REPLACE ... SELECT'
> +# if the original statement has option REPLACE
> +
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +REPLACE SELECT '123', 2;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; REPLACE INTO `test`.`t1` (`c3`,`c4`)
> SELECT '123', 2
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# It should be binlogged as 'INSERT IGNORE... SELECT'
> +# if the original statement has option IGNORE 
> +
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +IGNORE SELECT '123', 2;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT IGNORE INTO `test`.`t1` (`c3`,`c4`)
> SELECT '123', 2
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Nothing should be binlogged if error happens and no any row is inserted
> +
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +SELECT '123', 2;
> +ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +
> +# Verify it can binlog well when there are some braces('(')
> +
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +(SELECT '123', 3) UNION (SELECT '123', 4);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +REPLACE (SELECT 'abc', 3) UNION (SELECT 'abc', 4);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +IGNORE (SELECT '123', 3) UNION (SELECT '123', 4);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> (SELECT '123', 3) UNION (SELECT '123', 4)
> +master-bin.000001	#	Query	#	#	COMMIT
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; REPLACE INTO `test`.`t1` (`c3`,`c4`)
> (SELECT 'abc', 3) UNION (SELECT 'abc', 4)
> +master-bin.000001	#	Query	#	#	COMMIT
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT IGNORE INTO `test`.`t1` (`c3`,`c4`)
> (SELECT '123', 3) UNION (SELECT '123', 4)
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# The statement can be binlogged correctly when it is in a SP/EVENT/TRIGGER
> +
> +DROP PROCEDURE IF EXISTS p1;
> +CREATE PROCEDURE p1(IN a INT)
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1 SELECT '123', a;
> +call p1(500);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +call p1(600);
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> '123',  NAME_CONST('a',500)
> +master-bin.000001	#	Query	#	#	COMMIT
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> '123',  NAME_CONST('a',600)
> +master-bin.000001	#	Query	#	#	COMMIT
> +DROP PROCEDURE p1;
> +
> +# The statement can be binlogged correctly when it is in a prepared statement
> +
> +PREPARE stm FROM "CREATE TEMPORARY TABLE IF NOT EXISTS t1 SELECT '123', ?";
> +SET @a= 700;
> +EXECUTE stm USING @a;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +SET @a= 800;
> +EXECUTE stm USING @a;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> '123', 700
> +master-bin.000001	#	Query	#	#	COMMIT
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> '123', 800
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# The statement can be binlogged correctly when it is in a conditional comment
> +
> +# The whole statement in a conditional comment
> +/*!CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +SELECT 'abc', 900*/;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> /*!SELECT 'abc', 900*/
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# There is an long comment before SELECT
> +/*!CREATE TEMPORARY /*blabla*/ TABLE IF NOT EXISTS t1
> +SELECT 'abc', 901*/;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> /*!SELECT 'abc', 901*/
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Conditional comment starts just from SELECT
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +/*!SELECT 'abc',*/ 902;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> /*!SELECT 'abc',*/ 902
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Only SELECT keyword is in the conditional comment
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +/*!SELECT*/ /*!'abc',*/ 904;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`)
> /*!SELECT*/ /*!'abc',*/ 904
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Conditional comment is after SELECT keyword
> +CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +SELECT /*!'abc',*/ 903;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> /*!'abc',*/ 903
> +master-bin.000001	#	Query	#	#	COMMIT
> +
> +# Conditional comment ends just before SELECT keyword
> +/*!CREATE TEMPORARY TABLE IF NOT EXISTS t1
> +*/SELECT 'abc', 905;
> +Warnings:
> +Note	1050	Table 't1' already exists
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t1`
> (
> +  `c1` int(11) DEFAULT NULL,
> +  `c2` int(11) DEFAULT NULL,
> +  `c3` char(10) DEFAULT NULL,
> +  `c4` int(11) NOT NULL,
> +  PRIMARY KEY (`c4`)
> +)
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO `test`.`t1` (`c3`,`c4`) SELECT
> 'abc', 905
> +master-bin.000001	#	Query	#	#	COMMIT
> +DROP TABLE t2;
> +DROP TEMPORARY TABLE t1;
> 
> === modified file 'mysql-test/suite/rpl/t/rpl_create_if_not_exists.test'
> --- a/mysql-test/suite/rpl/t/rpl_create_if_not_exists.test	2010-01-16 07:44:24 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_create_if_not_exists.test	2010-08-17 10:05:41 +0000
> @@ -95,7 +95,9 @@ CREATE TEMPORARY TABLE t2(c1 INTEGER);
>  INSERT INTO t1 VALUES(1);
>  INSERT INTO t2 VALUES(1);
>  
> +--disable_warnings
>  CREATE TABLE IF NOT EXISTS t1(c1 INTEGER) SELECT c1 FROM t3;
> +--enable_warnings
>  CREATE TABLE t2(c1 INTEGER) SELECT c1 FROM t3;
>  
>  # In these two statements, t1 and t2 are the temporary table. there is only
> 
> === modified file 'mysql-test/suite/rpl/t/rpl_row_create_table.test'
> --- a/mysql-test/suite/rpl/t/rpl_row_create_table.test	2010-05-24 13:54:08 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_row_create_table.test	2010-08-17 10:05:41 +0000
> @@ -299,5 +299,18 @@ DROP VIEW IF EXISTS bug48506_t1, bug4850
>  DROP TEMPORARY TABLES t7;
>  DROP TABLES t4, t5;
>  DROP TABLES IF EXISTS bug48506_t4;
> +sync_slave_with_master;
> +
> +#
> +# Bug#55598 RBR: CREATE TABLE IF NOT EXISTS and INSERT written to binary log
> +# twice
> +#
> +connection master;
> +CREATE TABLE t1 SELECT 1;
> +CREATE TABLE IF NOT EXISTS t1 SELECT 1;
> +let $diff_table=test.t1;
> +source include/rpl_diff_tables.inc;
> +DROP TABLE t1;
> +
>  source include/master-slave-end.inc;
>  --echo end of the tests
> 
> === added file 'mysql-test/suite/rpl/t/rpl_stm_create_if_not_exists.test'
> --- a/mysql-test/suite/rpl/t/rpl_stm_create_if_not_exists.test	1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/t/rpl_stm_create_if_not_exists.test	2010-08-17 10:05:41
> +0000
> @@ -0,0 +1,14 @@
> +#
> +--echo # WL#5370 Keep forward-compatibility when changing 'CREATE TABLE IF NOT
> +--echo # EXISTS ... SELECT' behaviour
> +--echo #
> +
> +source include/master-slave.inc;
> +source include/have_binlog_format_statement.inc;
> +
> +source extra/rpl_tests/rpl_stm_create_if_not_exists.test;
> +
> +let $is_temporary=1;
> +source extra/rpl_tests/rpl_stm_create_if_not_exists.test;
> +
> +source include/master-slave-end.inc;
> 
> === modified file 'sql/sql_class.h'
> --- a/sql/sql_class.h	2010-07-14 08:50:17 +0000
> +++ b/sql/sql_class.h	2010-08-17 10:05:41 +0000
> @@ -2622,7 +2622,9 @@ public:
>  
> 
>  class select_insert :public select_result_interceptor {
> - public:
> +protected:
> +  virtual int write_to_binlog(bool is_trans, int errcode);
> +public:
>    TABLE_LIST *table_list;
>    TABLE *table;
>    List<Item> *fields;
> @@ -2658,6 +2660,8 @@ class select_create: public select_inser
>    MYSQL_LOCK *m_lock;
>    /* m_lock or thd->extra_lock */
>    MYSQL_LOCK **m_plock;
> +
> +  virtual int write_to_binlog(bool is_trans, int errcode);
>  public:
>    select_create (TABLE_LIST *table_arg,
>  		 HA_CREATE_INFO *create_info_par,
> @@ -2673,7 +2677,7 @@ public:
>      {}
>    int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
>  
> -  int binlog_show_create_table(TABLE **tables, uint count);
> +  int binlog_show_create_table(TABLE **tables, uint count, int errcode);
>    void store_values(List<Item> &values);
>    void send_error(uint errcode,const char *err);
>    bool send_eof();
> 
> === modified file 'sql/sql_insert.cc'
> --- a/sql/sql_insert.cc	2010-03-29 02:32:30 +0000
> +++ b/sql/sql_insert.cc	2010-08-17 10:05:41 +0000
> @@ -3265,7 +3265,7 @@ bool select_insert::send_eof()
>  
>    /*
>      Write to binlog before commiting transaction.  No statement will
> -    be written by the binlog_query() below in RBR mode.  All the
> +    be written by the write_to_binlog() below in RBR mode.  All the
>      events are in the transaction cache and will be written when
>      ha_autocommit_or_rollback() is issued below.
>    */
> @@ -3277,9 +3277,8 @@ bool select_insert::send_eof()
>        thd->clear_error();
>      else
>        errcode= query_error_code(thd, killed_status == THD::NOT_KILLED);
> -    if (thd->binlog_query(THD::ROW_QUERY_TYPE,
> -                      thd->query(), thd->query_length(),
> -                      trans_table, FALSE, errcode))
> +
> +    if (write_to_binlog(trans_table, errcode))
>      {
>        table->file->ha_release_auto_increment();
>        DBUG_RETURN(1);
> @@ -3353,9 +3352,7 @@ void select_insert::abort() {
>          {
>            int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
>            /* error of writing binary log is ignored */
> -          (void) thd->binlog_query(THD::ROW_QUERY_TYPE, thd->query(),
> -                                   thd->query_length(),
> -                                   transactional_table, FALSE, errcode);
> +          write_to_binlog(transactional_table, errcode);
>          }
>          if (!thd->current_stmt_binlog_row_based && !can_rollback_data())
>            thd->transaction.all.modified_non_trans_table= TRUE;
> @@ -3370,6 +3367,93 @@ void select_insert::abort() {
>    DBUG_VOID_RETURN;
>  }
>  
> +int select_insert::write_to_binlog(bool is_trans, int errcode)
> +{
> +  /* It is only for statement mode */
> +  if (thd->current_stmt_binlog_row_based)
> +    return 0;
> +
> +  return thd->binlog_query(THD::ROW_QUERY_TYPE,
> +                        thd->query(), thd->query_length(),
> +                        is_trans, FALSE, errcode);
> +}
> +
> +/* Override the select_insert::write_to_binlog */
> +int select_create::write_to_binlog(bool is_trans, int errcode)
> +{
> +  /* It is only for statement mode */
> +  if (thd->current_stmt_binlog_row_based)
> +    return 0;
> +
> +  /*
> +    WL#5370 Keep the compatibility between 5.1 master and 5.5 slave.
> +    Binlog a 'INSERT ... SELECT' statement only when it has the option
> +    'IF NOT EXISTS' and the table already exists as a base table.
> +  */
> +  if ((create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS) &&
> +      create_info->table_existed)
> +  {
> +    String query;
> +    int result;
> +
> +    thd->binlog_start_trans_and_stmt();
> +    /* Binlog the CREATE TABLE IF NOT EXISTS statement */
> +    result= binlog_show_create_table(&table, 1, 0);
> +    if (result)
> +      return result;
> +
> +    if (query.real_alloc(1024))
> +      return 1;
> +
> +    if (thd->lex->ignore)
> +      query.append(STRING_WITH_LEN("INSERT IGNORE INTO `"));
> +    else if (thd->lex->duplicates == DUP_REPLACE)
> +      query.append(STRING_WITH_LEN("REPLACE INTO `"));
> +    else
> +      query.append(STRING_WITH_LEN("INSERT INTO `"));
> +
> +    query.append(create_table->db, strlen(create_table->db));
> +    query.append(STRING_WITH_LEN("`.`"));
> +    query.append(create_info->alias, strlen(create_info->alias));
> +    query.append(STRING_WITH_LEN("` "));
> +
> +    /*
> +      The insert items.
> +      Field is the the rightmost columns that the rows are inster in.
> +    */
> +    query.append(STRING_WITH_LEN("("));
> +    for (Field **f= field ; *f ; f++)
> +    {
> +      if (f != field)
> +        query.append(STRING_WITH_LEN(","));
> +
> +      query.append(STRING_WITH_LEN("`"));
> +      query.append((*f)->field_name, strlen((*f)->field_name));
> +      query.append(STRING_WITH_LEN("`"));
> +    }
> +    query.append(STRING_WITH_LEN(") "));
> +
> +    /* The SELECT clause*/
> +    DBUG_ASSERT(thd->lex->create_select_pos);
> +    if (thd->lex->create_select_in_comment)
> +      query.append(STRING_WITH_LEN("/*!"));
> +    if (thd->lex->create_select_start_with_brace)
> +      query.append(STRING_WITH_LEN("("));
> +    if (query.append(thd->query() + thd->lex->create_select_pos,
> +                 thd->query_length() - thd->lex->create_select_pos))
> +      return 1;
> +
> +    /*
> +      Avoid to use thd->binlog_query() twice, otherwise it will print the unsafe
> +      warning twice.
> +    */
> +    Query_log_event ev(thd, query.c_ptr_safe(), query.length(), is_trans,
> +                       FALSE, errcode);
> +    return mysql_bin_log.write(&ev);
> +  }
> +  else
> +    return select_insert::write_to_binlog(is_trans, errcode);
> +}
>  
>  /***************************************************************************
>    CREATE TABLE (SELECT) ...
> @@ -3610,7 +3694,8 @@ select_create::prepare(List<Item> &value
>            !table->s->tmp_table &&
>            !ptr->get_create_info()->table_existed)
>        {
> -        if (int error= ptr->binlog_show_create_table(tables, count))
> +        int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
> +        if (int error= ptr->binlog_show_create_table(tables, count, errcode))
>            return error;
>        }
>        return 0;
> @@ -3651,7 +3736,10 @@ select_create::prepare(List<Item> &value
>                            ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
>                            create_table->table_name);
>        if (thd->current_stmt_binlog_row_based)
> -        binlog_show_create_table(&(create_table->table), 1);
> +      {
> +        int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
> +        binlog_show_create_table(&(create_table->table), 1, errcode);
> +      }
>        table= create_table->table;
>      }
>      else
> @@ -3719,10 +3807,10 @@ select_create::prepare(List<Item> &value
>  }
>  
>  int
> -select_create::binlog_show_create_table(TABLE **tables, uint count)
> +select_create::binlog_show_create_table(TABLE **tables, uint count, int errcode)
>  {
>    /*
> -    Note 1: In RBR mode, we generate a CREATE TABLE statement for the
> +    Note 1: We generate a CREATE TABLE statement for the
>      created table by calling store_create_info() (behaves as SHOW
>      CREATE TABLE).  In the event of an error, nothing should be
>      written to the binary log, even if the table is non-transactional;
> @@ -3738,7 +3826,6 @@ select_create::binlog_show_create_table(
>      schema that will do a close_thread_tables(), destroying the
>      statement transaction cache.
>    */
> -  DBUG_ASSERT(thd->current_stmt_binlog_row_based);
>    DBUG_ASSERT(tables && *tables && count > 0);
>  
>    char buf[2048];
> @@ -3756,7 +3843,6 @@ select_create::binlog_show_create_table(
>  
>    if (mysql_bin_log.is_open())
>    {
> -    int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
>      result= thd->binlog_query(THD::STMT_QUERY_TYPE,
>                                query.ptr(), query.length(),
>                                /* is_trans */ TRUE,
> 
> === modified file 'sql/sql_lex.h'
> --- a/sql/sql_lex.h	2010-07-29 03:00:57 +0000
> +++ b/sql/sql_lex.h	2010-08-17 10:05:41 +0000
> @@ -1817,6 +1817,23 @@ typedef struct st_lex : public Query_tab
>    */
>    bool protect_against_global_read_lock;
>  
> +  /*
> +    The following to variables are used in 'CREATE TABLE IF NOT EXISTS ...
> +    SELECT' statement. They are used to binlog the statement.
> +
> +    create_select_start_with_brace will be set if there is a '(' before
> +    the first SELECT clause
> +
> +    create_select_pos records the relative position of the SELECT clause
> +    in the whole statement.
> +
> +    create_select_in_comment will be set if SELECT keyword is in conditional
> +    comment.
> +   */
> +  bool create_select_start_with_brace;
> +  uint create_select_pos;
> +  bool create_select_in_comment;
> +
>    st_lex();
>  
>    virtual ~st_lex()
> 
> === modified file 'sql/sql_parse.cc'
> --- a/sql/sql_parse.cc	2010-07-29 03:00:57 +0000
> +++ b/sql/sql_parse.cc	2010-08-17 10:05:41 +0000
> @@ -2717,6 +2717,25 @@ mysql_execute_command(THD *thd)
>          {
>            TABLE_LIST *duplicate;
>            create_table= lex->unlink_first_table(&link_to_local);
> +
> +          if (create_table->view)
> +          {
> +            if (create_info.options & HA_LEX_CREATE_IF_NOT_EXISTS)
> +            {
> +              push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
> +                                  ER_TABLE_EXISTS_ERROR,
> +                                  ER(ER_TABLE_EXISTS_ERROR),
> +                                  create_info.alias);
> +              my_ok(thd);
> +            }
> +            else
> +            {
> +              my_error(ER_TABLE_EXISTS_ERROR, MYF(0), create_info.alias);
> +              res= 1;
> +            }
> +            goto end_with_restore_list;
> +          }
> +
>            if ((duplicate= unique_table(thd, create_table, select_tables, 0)))
>            {
>              update_non_unique_table_error(create_table, "CREATE", duplicate);
> 
> === modified file 'sql/sql_yacc.yy'
> --- a/sql/sql_yacc.yy	2010-07-19 14:30:34 +0000
> +++ b/sql/sql_yacc.yy	2010-08-17 10:05:41 +0000
> @@ -3881,17 +3881,26 @@ create2a:
>            create3 {}
>          |  opt_partitioning
>             create_select ')'
> -           { Select->set_braces(1);}
> +           {
> +             Select->set_braces(1);
> +             Lex->create_select_start_with_brace= true;
> +           }
>             union_opt {}
>          ;
>  
>  create3:
>            /* empty */ {}
>          | opt_duplicate opt_as create_select
> -          { Select->set_braces(0);}
> +          {
> +            Select->set_braces(0);
> +            Lex->create_select_start_with_brace= false;
> +          }
>            union_clause {}
>          | opt_duplicate opt_as '(' create_select ')'
> -          { Select->set_braces(1);}
> +          {
> +            Select->set_braces(1);
> +            Lex->create_select_start_with_brace= true;
> +          }
>            union_opt {}
>          ;
>  
> @@ -4516,6 +4525,19 @@ create_select:
>             
> lex->current_select->table_list.save_and_clear(&lex->save_list);
>              mysql_init_select(lex);
>              lex->current_select->parsing_place= SELECT_LIST;
> +
> +            if (lex->sql_command == SQLCOM_CREATE_TABLE &&
> +                (lex->create_info.options & HA_LEX_CREATE_IF_NOT_EXISTS))
> +            {
> +              Lex_input_stream *lip= YYLIP;
> +
> +              if (lex->spcont)
> +                lex->create_select_pos= lip->get_tok_start() -
> +                  lex->sphead->m_tmp_query;
> +              else
> +                lex->create_select_pos= lip->get_tok_start() -
> lip->get_buf();
> +              lex->create_select_in_comment= (lip->in_comment ==
> DISCARD_COMMENT);
> +            }
>            }
>            select_options select_item_list
>            {
> 
> text/bzr-bundle 类型 附件
> (bzr/li-bing.song@stripped)
> # Bazaar merge directive format 2 (Bazaar 0.90)
> # revision_id: li-bing.song@stripped
> # target_branch: file:///home/anders/work/bzrwork1/wt3/mysql-5.1-\
> #   bugteam/
> # testament_sha1: 6eb36429cbce497c31edba03bd9dcd1076ef4f43
> # timestamp: 2010-08-17 18:05:53 +0800
> # source_branch: file:///home/anders/work/bzrwork1/mysql-5.1-wl5370/
> # base_revision_id: georgi.kodinov@stripped\
> #   wu8dpos5rtoglro3
> # 
> # Begin bundle
> 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
> 
> 




Thread
bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3479) WL#5370Li-Bing.Song17 Aug
  • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3479)WL#5370He Zhenxing17 Aug
    • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3479)WL#5370Libing Song17 Aug
  • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3479)WL#5370Konstantin Osipov17 Aug
    • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3479)WL#5370Libing Song18 Aug
      • Re: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3479)WL#5370Konstantin Osipov18 Aug