List:Commits« Previous MessageNext Message »
From:Libing Song Date:November 15 2009 2:49pm
Subject:Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3160)
Bug#46364
View as plain text  
Hi Alfranio,

Nice work, but a problem need to be clarified.

The option --ignore-causality introduces an another problem in SBM.
The following statements will cause a inconsistency between master and 
slave.

CREATE TABLE t1(c1 INTEGER) ENGINE=Innodb;
CREATE TABLE t2(c1 INTEGER) ENGINE=MyISAM;
BEGIN ;
INSERT INTO t1 VALUES (1),(2);
INSERT INTO t2 SELECT * FROM t1;
COMMIT;

so, I think that locking the N_table before starting a transaction is 
better.
Maybe It is difficult to implement, however give users a advice is easy.

I propose --ignore-causality is a session variable which can be changed 
at runtime,
if it has to be used.
this will reduce the option's influence.

Alfranio Correia wrote:
> #At
> file:///home/acorreia/workspace.sun/repository.mysql/bzrwork/bug-46364/mysql-5.1-bugteam/
> based on revid:azundris@stripped
>
>  3160 Alfranio Correia	2009-11-03
>       BUG#46364 MyISAM transbuffer problems (NTM problem)
>       
>       It is well-known that due to concurrency issues, a slave can become
>       inconsistent when a transaction contains updates to both transaction and
>       non-transactional tables in statement and mixed modes.
>       
>       In a nutshell, the current code-base tries to preserve causality among the
>       statements by not writing non-transactional statements directly to the
>       binary log. Unfortunately, modifications done to non-transactional tables
>       on behalf of a transaction become immediately visible to other connections
>       but may not immediately get into the binary log and therefore consistency
>       may be broken.
>       
>       In general, it is impossible to automatically detect causality/dependency
>       among statements by just analyzing the statements sent to the server. This
>       happen because dependency may be hidden in the application code and it is
>       necessary to know a Pryor all the statements processed in the context of
>       a transaction such as in a procedure. Moreover, even for the few cases that
>       we could automatically address in the server, the computation effort
>       required could make the approach infeasible.
>       
>       So, in this patch we introduce the option "ignore-causality" that can be
>       used to bypass the current behavior in order to write directly to binary
>       log statements that change non-transactional tables.
>
>     added:
>       mysql-test/suite/rpl/r/rpl_stm_causality_mixing_engines.result
>       mysql-test/suite/rpl/t/rpl_stm_causality_mixing_engines-master.opt
>       mysql-test/suite/rpl/t/rpl_stm_causality_mixing_engines.test
>     modified:
>       sql/log.cc
>       sql/mysql_priv.h
>       sql/mysqld.cc
>       sql/set_var.cc
> === added file 'mysql-test/suite/rpl/r/rpl_stm_causality_mixing_engines.result'
> --- a/mysql-test/suite/rpl/r/rpl_stm_causality_mixing_engines.result	1970-01-01
> 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_stm_causality_mixing_engines.result	2009-11-03
> 22:24:42 +0000
> @@ -0,0 +1,870 @@
> +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;
> +###################################################################################
> +#                                   CONFIGURATION
> +###################################################################################
> +SET SQL_LOG_BIN=0;
> +CREATE TABLE nt_1 (a text, b int PRIMARY KEY, c text) ENGINE = MyISAM;
> +CREATE TABLE nt_2 (a text, b int PRIMARY KEY, c text) ENGINE = MyISAM;
> +CREATE TABLE nt_3 (a text, b int PRIMARY KEY, c text) ENGINE = MyISAM;
> +CREATE TABLE nt_4 (a text, b int PRIMARY KEY, c text) ENGINE = MyISAM;
> +CREATE TABLE tt_1 (a text, b int PRIMARY KEY, c text) ENGINE = Innodb;
> +CREATE TABLE tt_2 (a text, b int PRIMARY KEY, c text) ENGINE = Innodb;
> +CREATE TABLE tt_3 (a text, b int PRIMARY KEY, c text) ENGINE = Innodb;
> +CREATE TABLE tt_4 (a text, b int PRIMARY KEY, c text) ENGINE = Innodb;
> +SET SQL_LOG_BIN=1;
> +SET SQL_LOG_BIN=0;
> +CREATE TABLE nt_1 (a text, b int PRIMARY KEY, c text) ENGINE = MyISAM;
> +CREATE TABLE nt_2 (a text, b int PRIMARY KEY, c text) ENGINE = MyISAM;
> +CREATE TABLE nt_3 (a text, b int PRIMARY KEY, c text) ENGINE = MyISAM;
> +CREATE TABLE nt_4 (a text, b int PRIMARY KEY, c text) ENGINE = MyISAM;
> +CREATE TABLE tt_1 (a text, b int PRIMARY KEY, c text) ENGINE = Innodb;
> +CREATE TABLE tt_2 (a text, b int PRIMARY KEY, c text) ENGINE = Innodb;
> +CREATE TABLE tt_3 (a text, b int PRIMARY KEY, c text) ENGINE = Innodb;
> +CREATE TABLE tt_4 (a text, b int PRIMARY KEY, c text) ENGINE = Innodb;
> +SET SQL_LOG_BIN=1;
> +CREATE FUNCTION f1 () RETURNS VARCHAR(64)
> +BEGIN
> +RETURN "Testing...";
> +END|
> +CREATE FUNCTION f2 () RETURNS VARCHAR(64)
> +BEGIN
> +RETURN f1();
> +END|
> +CREATE PROCEDURE pc_i_tt_3 (IN x INT, IN y VARCHAR(64))
> +BEGIN
> +INSERT INTO tt_3 VALUES (y,x,x);
> +END|
> +CREATE TRIGGER tr_i_tt_3_to_nt_3 BEFORE INSERT ON tt_3 FOR EACH ROW
> +BEGIN
> +INSERT INTO nt_3 VALUES (NEW.a, NEW.b, NEW.c);
> +END|
> +CREATE TRIGGER tr_i_nt_4_to_tt_4 BEFORE INSERT ON nt_4 FOR EACH ROW
> +BEGIN
> +INSERT INTO tt_4 VALUES (NEW.a, NEW.b, NEW.c);
> +END|
> +###################################################################################
> +#                 MIXING TRANSACTIONAL and NON-TRANSACTIONAL TABLES
> +###################################################################################
> +#
> +#1) "B T T C" generates in binlog the "B T T C" entries.
> +#
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text 4", 4, "new text 4");
> +INSERT INTO tt_2 VALUES ("new text 4", 4, "new text 4");
> +COMMIT;
> +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`; INSERT INTO tt_1 VALUES ("new text 4", 4,
> "new text 4")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_2 VALUES ("new text 4", 4,
> "new text 4")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#1.e) "B T T C" with error in T generates in binlog the "B T T C" entries.
> +#
> +INSERT INTO tt_1 VALUES ("new text -2", -2, "new text -2");
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text -1", -1, "new text -1"), ("new text -2", -2, "new
> text -2");
> +ERROR 23000: Duplicate entry '-2' for key 'PRIMARY'
> +INSERT INTO tt_2 VALUES ("new text -3", -3, "new text -3");
> +COMMIT;
> +BEGIN;
> +INSERT INTO tt_2 VALUES ("new text -5", -5, "new text -5");
> +INSERT INTO tt_2 VALUES ("new text -4", -4, "new text -4"), ("new text -5", -5, "new
> text -5");
> +ERROR 23000: Duplicate entry '-5' for key 'PRIMARY'
> +COMMIT;
> +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`; INSERT INTO tt_1 VALUES ("new text -2",
> -2, "new text -2")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_2 VALUES ("new text -3",
> -3, "new text -3")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_2 VALUES ("new text -5",
> -5, "new text -5")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#2) "B T T R"  generates in binlog an "empty" entry.
> +#
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text 5", 5, "new text 5");
> +INSERT INTO tt_2 VALUES ("new text 5", 5, "new text 5");
> +ROLLBACK;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +
> +
> +
> +
> +#
> +#2.e) "B T T R"  with error in T generates in binlog an "empty" entry.
> +#
> +INSERT INTO tt_1 VALUES ("new text -7", -7, "new text -7");
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text -6", -6, "new text -6"), ("new text -7", -7, "new
> text -7");
> +ERROR 23000: Duplicate entry '-7' for key 'PRIMARY'
> +INSERT INTO tt_2 VALUES ("new text -8", -8, "new text -8");
> +ROLLBACK;
> +BEGIN;
> +INSERT INTO tt_2 VALUES ("new text -10", -10, "new text -10");
> +INSERT INTO tt_2 VALUES ("new text -9", -9, "new text -9"), ("new text -10", -10,
> "new text -10");
> +ERROR 23000: Duplicate entry '-10' for key 'PRIMARY'
> +ROLLBACK;
> +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`; INSERT INTO tt_1 VALUES ("new text -7",
> -7, "new text -7")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#3) "B T N C" generates in binlog the "B T N C" entries.
> +#
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text 6", 6, "new text 6");
> +INSERT INTO nt_1 VALUES ("new text 6", 6, "new text 6");
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text 6", 6,
> "new text 6")
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 6", 6,
> "new text 6")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#3.e) "B T N C" with error in either T or N generates in binlog the "B T N C"
> entries.
> +#
> +INSERT INTO tt_1 VALUES ("new text -12", -12, "new text -12");
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text -11", -11, "new text -11"), ("new text -12", -12,
> "new text -12");
> +ERROR 23000: Duplicate entry '-12' for key 'PRIMARY'
> +INSERT INTO nt_1 VALUES ("new text -13", -13, "new text -13");
> +COMMIT;
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text -14", -14, "new text -14");
> +INSERT INTO nt_1 VALUES ("new text -16", -16, "new text -16");
> +INSERT INTO nt_1 VALUES ("new text -15", -15, "new text -15"), ("new text -16", -16,
> "new text -16");
> +ERROR 23000: Duplicate entry '-16' for key 'PRIMARY'
> +COMMIT;
> +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`; INSERT INTO tt_1 VALUES ("new text -12",
> -12, "new text -12")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -13",
> -13, "new text -13")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -16",
> -16, "new text -16")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -15",
> -15, "new text -15"), ("new text -16", -16, "new text -16")
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text -14",
> -14, "new text -14")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#4) "B T N R" generates in binlog the "B T N R" entries.
> +#
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text 7", 7, "new text 7");
> +INSERT INTO nt_1 VALUES ("new text 7", 7, "new text 7");
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text 7", 7,
> "new text 7")
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 7", 7,
> "new text 7")
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +
> +
> +
> +
> +#
> +#4.e) "B T N R" with error in either T or N generates in binlog the "B T N R"
> entries.
> +#
> +INSERT INTO tt_1 VALUES ("new text -17", -17, "new text -17");
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text -16", -16, "new text -16"), ("new text -17", -17,
> "new text -17");
> +ERROR 23000: Duplicate entry '-17' for key 'PRIMARY'
> +INSERT INTO nt_1 VALUES ("new text -18", -18, "new text -18");
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +INSERT INTO tt_1 VALUES ("new text -19", -19, "new text -19");
> +INSERT INTO nt_1 VALUES ("new text -21", -21, "new text -21");
> +INSERT INTO nt_1 VALUES ("new text -20", -20, "new text -20"), ("new text -21", -21,
> "new text -21");
> +ERROR 23000: Duplicate entry '-21' for key 'PRIMARY'
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +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`; INSERT INTO tt_1 VALUES ("new text -17",
> -17, "new text -17")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -18",
> -18, "new text -18")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -21",
> -21, "new text -21")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -20",
> -20, "new text -20"), ("new text -21", -21, "new text -21")
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text -19",
> -19, "new text -19")
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +
> +
> +
> +
> +#
> +#5) "T" generates in binlog the "B T C" entry.
> +#
> +INSERT INTO tt_1 VALUES ("new text 8", 8, "new text 8");
> +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`; INSERT INTO tt_1 VALUES ("new text 8", 8,
> "new text 8")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#5.e) "T" with error in T generates in binlog an "empty" entry.
> +#
> +INSERT INTO tt_1 VALUES ("new text -1", -1, "new text -1");
> +INSERT INTO tt_1 VALUES ("new text -1", -1, "new text -1"), ("new text -22", -22,
> "new text -22");
> +ERROR 23000: Duplicate entry '-1' for key 'PRIMARY'
> +INSERT INTO tt_1 VALUES ("new text -23", -23, "new text -23"), ("new text -1", -1,
> "new text -1");
> +ERROR 23000: Duplicate entry '-1' for key 'PRIMARY'
> +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`; INSERT INTO tt_1 VALUES ("new text -1",
> -1, "new text -1")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#6) "N" generates in binlog the "N" entry.
> +#
> +INSERT INTO nt_1 VALUES ("new text 9", 9, "new text 9");
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text 9", 9,
> "new text 9")
> +
> +
> +
> +
> +#
> +#6.e) "N" with error in N generates in binlog an empty entry if the error
> +# happens in the first tuple. Otherwise, generates the "N" entry and
> +# the error is appended.
> +#
> +INSERT INTO nt_1 VALUES ("new text -1", -1, "new text -1");
> +INSERT INTO nt_1 VALUES ("new text -1", -1, "new text -1");
> +ERROR 23000: Duplicate entry '-1' for key 'PRIMARY'
> +INSERT INTO nt_1 VALUES ("new text -24", -24, "new text -24"), ("new text -1", -1,
> "new text -1");
> +ERROR 23000: Duplicate entry '-1' for key 'PRIMARY'
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -1",
> -1, "new text -1")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -24",
> -24, "new text -24"), ("new text -1", -1, "new text -1")
> +
> +
> +
> +
> +#
> +#7) "M" generates in binglog the "B M C" entries.
> +#
> +DELETE FROM nt_1;
> +INSERT INTO nt_1 SELECT * FROM tt_1;
> +DELETE FROM tt_1;
> +INSERT INTO tt_1 SELECT * FROM nt_1;
> +INSERT INTO tt_3 VALUES ("new text 000", 000, '');
> +INSERT INTO tt_3 VALUES("new text 100", 100, f1());
> +INSERT INTO nt_4 VALUES("new text 100", 100, f1());
> +INSERT INTO tt_3 VALUES("new text 200", 200, f2());
> +INSERT INTO nt_4 VALUES ("new text 300", 300, '');
> +INSERT INTO nt_4 VALUES ("new text 400", 400, f1());
> +INSERT INTO nt_4 VALUES ("new text 500", 500, f2());
> +CALL pc_i_tt_3(600, "Testing...");
> +UPDATE nt_3, nt_4, tt_3, tt_4 SET nt_3.a= "new text 1", nt_4.a= "new text 1",
> tt_3.a= "new text 1", tt_4.a= "new text 1" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +UPDATE tt_3, tt_4, nt_3, nt_4 SET tt_3.a= "new text 2", tt_4.a= "new text 2",
> nt_3.a= "new text 2", nt_4.a = "new text 2" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a= "new text 3", nt_3.a= "new text 3",
> nt_4.a= "new text 3", tt_4.a = "new text 3" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a= "new text 4", nt_3.a= "new text 4",
> nt_4.a= "new text 4", tt_4.a = "new text 4" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; DELETE FROM nt_1
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 SELECT * FROM tt_1
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; DELETE FROM tt_1
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 SELECT * FROM nt_1
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES ("new text 000",
> 000, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES("new text 100",
> 100, f1())
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES("new text 100",
> 100, f1())
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES("new text 200",
> 200, f2())
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES ("new text 300",
> 300, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES ("new text 400",
> 400, f1())
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES ("new text 500",
> 500, f2())
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES (
> NAME_CONST('y',_latin1'Testing...' COLLATE 'latin1_swedish_ci'), NAME_CONST('x',600),
> NAME_CONST('x',600))
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE nt_3, nt_4, tt_3, tt_4 SET nt_3.a=
> "new text 1", nt_4.a= "new text 1", tt_3.a= "new text 1", tt_4.a= "new text 1" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, tt_4, nt_3, nt_4 SET tt_3.a=
> "new text 2", tt_4.a= "new text 2", nt_3.a= "new text 2", nt_4.a = "new text 2" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a=
> "new text 3", nt_3.a= "new text 3", nt_4.a= "new text 3", tt_4.a = "new text 3" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a=
> "new text 4", nt_3.a= "new text 4", nt_4.a= "new text 4", tt_4.a = "new text 4" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#7.e) "M" with error in M generates in binglog the "B M R" entries.
> +#
> +INSERT INTO nt_3 VALUES ("new text -26", -26, '');
> +SELECT * FROM tt_3;
> +a	b	c
> +new text 000	0	
> +new text 4	100	Testing...
> +new text 200	200	Testing...
> +Testing...	600	600
> +INSERT INTO tt_3 VALUES ("new text -25", -25, ''), ("new text -26", -26, '');
> +ERROR 23000: Duplicate entry '-26' for key 'PRIMARY'
> +SELECT * FROM tt_3;
> +a	b	c
> +new text 000	0	
> +new text 4	100	Testing...
> +new text 200	200	Testing...
> +Testing...	600	600
> +INSERT INTO tt_4 VALUES ("new text -26", -26, '');
> +SELECT * FROM nt_4;
> +a	b	c
> +new text 4	100	Testing...
> +new text 300	300	
> +new text 400	400	Testing...
> +new text 500	500	Testing...
> +INSERT INTO nt_4 VALUES ("new text -25", -25, ''), ("new text -26", -26, '');
> +ERROR 23000: Duplicate entry '-26' for key 'PRIMARY'
> +SELECT * FROM nt_4;
> +a	b	c
> +new text 4	100	Testing...
> +new text 300	300	
> +new text 400	400	Testing...
> +new text 500	500	Testing...
> +new text -25	-25	
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_3 VALUES ("new text -26",
> -26, '')
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES ("new text -25",
> -25, ''), ("new text -26", -26, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_4 VALUES ("new text -26",
> -26, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES ("new text -25",
> -25, ''), ("new text -26", -26, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +
> +
> +
> +
> +#
> +#8) "B N N T C" generates in binglog the "N N B T C" entries.
> +#
> +BEGIN;
> +INSERT INTO nt_1 VALUES ("new text 10", 10, "new text 10");
> +INSERT INTO nt_2 VALUES ("new text 10", 10, "new text 10");
> +INSERT INTO tt_1 VALUES ("new text 10", 10, "new text 10");
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text 10",
> 10, "new text 10")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_2 VALUES ("new text 10",
> 10, "new text 10")
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 10",
> 10, "new text 10")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#8.e) "B N N T R" See 6.e and 9.e.
> +#
> +
> +
> +
> +
> +#
> +#9) "B N N T R" generates in binlog the "N N B T R" entries.
> +#
> +BEGIN;
> +INSERT INTO nt_1 VALUES ("new text 11", 11, "new text 11");
> +INSERT INTO nt_2 VALUES ("new text 11", 11, "new text 11");
> +INSERT INTO tt_1 VALUES ("new text 11", 11, "new text 11");
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text 11",
> 11, "new text 11")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_2 VALUES ("new text 11",
> 11, "new text 11")
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 11",
> 11, "new text 11")
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +
> +
> +
> +
> +#
> +#9.e) "B N N T R" with error in N generates in binlog the "N N B T R" entries.
> +#
> +BEGIN;
> +INSERT INTO nt_1 VALUES ("new text -25", -25, "new text -25");
> +INSERT INTO nt_2 VALUES ("new text -25", -25, "new text -25");
> +INSERT INTO nt_2 VALUES ("new text -26", -26, "new text -26"), ("new text -25", -25,
> "new text -25");
> +ERROR 23000: Duplicate entry '-25' for key 'PRIMARY'
> +INSERT INTO tt_1 VALUES ("new text -27", -27, "new text -27");
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text -25",
> -25, "new text -25")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_2 VALUES ("new text -25",
> -25, "new text -25")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_2 VALUES ("new text -26",
> -26, "new text -26"), ("new text -25", -25, "new text -25")
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text -27",
> -27, "new text -27")
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +
> +
> +
> +
> +#
> +#10) "B N N C" generates in binglog the "N N" entries.
> +#
> +BEGIN;
> +INSERT INTO nt_1 VALUES ("new text 12", 12, "new text 12");
> +INSERT INTO nt_2 VALUES ("new text 12", 12, "new text 12");
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text 12",
> 12, "new text 12")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_2 VALUES ("new text 12",
> 12, "new text 12")
> +
> +
> +
> +
> +#
> +#10.e) "B N N C" See 6.e and 9.e.
> +#
> +
> +
> +
> +
> +#
> +#11) "B N N R" generates in binlog the "N N" entries.
> +#
> +BEGIN;
> +INSERT INTO nt_1 VALUES ("new text 13", 13, "new text 13");
> +INSERT INTO nt_2 VALUES ("new text 13", 13, "new text 13");
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 VALUES ("new text 13",
> 13, "new text 13")
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_2 VALUES ("new text 13",
> 13, "new text 13")
> +
> +
> +
> +
> +#
> +#11.e) "B N N R" See 6.e and 9.e.
> +#
> +
> +
> +
> +
> +#
> +#12) "B M T C" generates in the binlog the "B M T C" entries.
> +#
> +DELETE FROM nt_1;
> +BEGIN;
> +INSERT INTO nt_1 SELECT * FROM tt_1;
> +INSERT INTO tt_2 VALUES ("new text 14", 14, "new text 14");
> +COMMIT;
> +DELETE FROM tt_1;
> +BEGIN;
> +INSERT INTO tt_1 SELECT * FROM nt_1;
> +INSERT INTO tt_2 VALUES ("new text 15", 15, "new text 15");
> +COMMIT;
> +BEGIN;
> +INSERT INTO tt_3 VALUES ("new text 700", 700, '');
> +INSERT INTO tt_1 VALUES ("new text 800", 800, '');
> +COMMIT;
> +BEGIN;
> +INSERT INTO tt_3 VALUES("new text 900", 900, f1());
> +INSERT INTO tt_1 VALUES ("new text 1000", 1000, '');
> +COMMIT;
> +BEGIN;
> +INSERT INTO tt_3 VALUES(1100, 1100, f2());
> +INSERT INTO tt_1 VALUES ("new text 1200", 1200, '');
> +COMMIT;
> +BEGIN;
> +INSERT INTO nt_4 VALUES ("new text 1300", 1300, '');
> +INSERT INTO tt_1 VALUES ("new text 1400", 1400, '');
> +COMMIT;
> +BEGIN;
> +INSERT INTO nt_4 VALUES("new text 1500", 1500, f1());
> +INSERT INTO tt_1 VALUES ("new text 1600", 1600, '');
> +COMMIT;
> +BEGIN;
> +INSERT INTO nt_4 VALUES("new text 1700", 1700, f2());
> +INSERT INTO tt_1 VALUES ("new text 1800", 1800, '');
> +COMMIT;
> +BEGIN;
> +CALL pc_i_tt_3(1900, "Testing...");
> +INSERT INTO tt_1 VALUES ("new text 2000", 2000, '');
> +COMMIT;
> +BEGIN;
> +UPDATE nt_3, nt_4, tt_3, tt_4 SET nt_3.a= "new text 5", nt_4.a= "new text 5",
> tt_3.a= "new text 5", tt_4.a= "new text 5" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +INSERT INTO tt_1 VALUES ("new text 2100", 2100, '');
> +COMMIT;
> +BEGIN;
> +UPDATE tt_3, tt_4, nt_3, nt_4 SET tt_3.a= "new text 6", tt_4.a= "new text 6",
> nt_3.a= "new text 6", nt_4.a = "new text 6" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +INSERT INTO tt_1 VALUES ("new text 2200", 2200, '');
> +COMMIT;
> +BEGIN;
> +UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a= "new text 7", nt_3.a= "new text 7",
> nt_4.a= "new text 7", tt_4.a = "new text 7" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +INSERT INTO tt_1 VALUES ("new text 2300", 2300, '');
> +COMMIT;
> +BEGIN;
> +UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a= "new text 8", nt_3.a= "new text 8",
> nt_4.a= "new text 8", tt_4.a = "new text 8" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +INSERT INTO tt_1 VALUES ("new text 2400", 2400, '');
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; DELETE FROM nt_1
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 SELECT * FROM tt_1
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_2 VALUES ("new text 14",
> 14, "new text 14")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; DELETE FROM tt_1
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 SELECT * FROM nt_1
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_2 VALUES ("new text 15",
> 15, "new text 15")
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES ("new text 700",
> 700, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 800",
> 800, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES("new text 900",
> 900, f1())
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 1000",
> 1000, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES(1100, 1100, f2())
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 1200",
> 1200, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES ("new text 1300",
> 1300, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 1400",
> 1400, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES("new text 1500",
> 1500, f1())
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 1600",
> 1600, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES("new text 1700",
> 1700, f2())
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 1800",
> 1800, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES (
> NAME_CONST('y',_latin1'Testing...' COLLATE 'latin1_swedish_ci'), NAME_CONST('x',1900),
> NAME_CONST('x',1900))
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 2000",
> 2000, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE nt_3, nt_4, tt_3, tt_4 SET nt_3.a=
> "new text 5", nt_4.a= "new text 5", tt_3.a= "new text 5", tt_4.a= "new text 5" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 2100",
> 2100, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, tt_4, nt_3, nt_4 SET tt_3.a=
> "new text 6", tt_4.a= "new text 6", nt_3.a= "new text 6", nt_4.a = "new text 6" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 2200",
> 2200, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a=
> "new text 7", nt_3.a= "new text 7", nt_4.a= "new text 7", tt_4.a = "new text 7" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 2300",
> 2300, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a=
> "new text 8", nt_3.a= "new text 8", nt_4.a= "new text 8", tt_4.a = "new text 8" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 2400",
> 2400, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#12.e) "B M T C" with error in M generates in the binlog the "B M T C" entries.
> +#  
> +# There is a bug in the slave that needs to be fixed before enabling
> +# this part of the test. A bug report will be filed referencing this
> +# test case.
> +BEGIN;
> +INSERT INTO nt_3 VALUES ("new text -28", -28, '');
> +INSERT INTO tt_3 VALUES ("new text -27", -27, ''), ("new text -28", -28, '');
> +ERROR 23000: Duplicate entry '-28' for key 'PRIMARY'
> +INSERT INTO tt_1 VALUES ("new text -27", -27, '');
> +COMMIT;
> +BEGIN;
> +INSERT INTO tt_4 VALUES ("new text -28", -28, '');
> +INSERT INTO nt_4 VALUES ("new text -27", -27, ''), ("new text -28", -28, '');
> +ERROR 23000: Duplicate entry '-28' for key 'PRIMARY'
> +INSERT INTO tt_1 VALUES ("new text -28", -28, '');
> +COMMIT;
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_3 VALUES ("new text -28",
> -28, '')
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES ("new text -27",
> -27, ''), ("new text -28", -28, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text -27",
> -27, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_4 VALUES ("new text -28",
> -28, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES ("new text -27",
> -27, ''), ("new text -28", -28, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text -28",
> -28, '')
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +
> +
> +
> +
> +#
> +#13) "B M T R" generates in the binlog the "B M T R" entries
> +#
> +DELETE FROM nt_1;
> +BEGIN;
> +INSERT INTO nt_1 SELECT * FROM tt_1;
> +INSERT INTO tt_2 VALUES ("new text 17", 17, "new text 17");
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +DELETE FROM tt_1;
> +BEGIN;
> +INSERT INTO tt_1 SELECT * FROM nt_1;
> +INSERT INTO tt_2 VALUES ("new text 18", 18, "new text 18");
> +ROLLBACK;
> +INSERT INTO tt_1 SELECT * FROM nt_1;
> +BEGIN;
> +INSERT INTO tt_3 VALUES ("new text 2500", 2500, '');
> +INSERT INTO tt_1 VALUES ("new text 2600", 2600, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +INSERT INTO tt_3 VALUES("new text 2700", 2700, f1());
> +INSERT INTO tt_1 VALUES ("new text 2800", 2800, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +INSERT INTO tt_3 VALUES(2900, 2900, f2());
> +INSERT INTO tt_1 VALUES ("new text 3000", 3000, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +INSERT INTO nt_4 VALUES ("new text 3100", 3100, '');
> +INSERT INTO tt_1 VALUES ("new text 3200", 3200, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +INSERT INTO nt_4 VALUES("new text 3300", 3300, f1());
> +INSERT INTO tt_1 VALUES ("new text 3400", 3400, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +INSERT INTO nt_4 VALUES("new text 3500", 3500, f2());
> +INSERT INTO tt_1 VALUES ("new text 3600", 3600, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +CALL pc_i_tt_3(3700, "Testing...");
> +INSERT INTO tt_1 VALUES ("new text 3700", 3700, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +UPDATE nt_3, nt_4, tt_3, tt_4 SET nt_3.a= "new text 9", nt_4.a= "new text 9",
> tt_3.a= "new text 9", tt_4.a= "new text 9" where nt_3.b = nt_4.b and nt_4.b = tt_3.b and
> tt_3.b = tt_4.b and tt_4.b = 100;
> +INSERT INTO tt_1 VALUES ("new text 3800", 3800, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +UPDATE tt_3, tt_4, nt_3, nt_4 SET tt_3.a= "new text 10", tt_4.a= "new text 10",
> nt_3.a= "new text 10", nt_4.a = "new text 10" where nt_3.b = nt_4.b and nt_4.b = tt_3.b
> and tt_3.b = tt_4.b and tt_4.b = 100;
> +INSERT INTO tt_1 VALUES ("new text 3900", 3900, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a= "new text 11", nt_3.a= "new text 11",
> nt_4.a= "new text 11", tt_4.a = "new text 11" where nt_3.b = nt_4.b and nt_4.b = tt_3.b
> and tt_3.b = tt_4.b and tt_4.b = 100;
> +INSERT INTO tt_1 VALUES ("new text 4000", 4000, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a= "new text 12", nt_3.a= "new text 12",
> nt_4.a= "new text 12", tt_4.a = "new text 12" where nt_3.b = nt_4.b and nt_4.b = tt_3.b
> and tt_3.b = tt_4.b and tt_4.b = 100;
> +INSERT INTO tt_1 VALUES ("new text 4100", 4100, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; DELETE FROM nt_1
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_1 SELECT * FROM tt_1
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_2 VALUES ("new text 17",
> 17, "new text 17")
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; DELETE FROM tt_1
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 SELECT * FROM nt_1
> +master-bin.000001	#	Xid	#	#	COMMIT /* XID */
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES ("new text 2500",
> 2500, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 2600",
> 2600, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES("new text 2700",
> 2700, f1())
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 2800",
> 2800, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES(2900, 2900, f2())
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 3000",
> 3000, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES ("new text 3100",
> 3100, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 3200",
> 3200, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES("new text 3300",
> 3300, f1())
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 3400",
> 3400, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES("new text 3500",
> 3500, f2())
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 3600",
> 3600, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES (
> NAME_CONST('y',_latin1'Testing...' COLLATE 'latin1_swedish_ci'), NAME_CONST('x',3700),
> NAME_CONST('x',3700))
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 3700",
> 3700, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE nt_3, nt_4, tt_3, tt_4 SET nt_3.a=
> "new text 9", nt_4.a= "new text 9", tt_3.a= "new text 9", tt_4.a= "new text 9" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 3800",
> 3800, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, tt_4, nt_3, nt_4 SET tt_3.a=
> "new text 10", tt_4.a= "new text 10", nt_3.a= "new text 10", nt_4.a = "new text 10" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 3900",
> 3900, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a=
> "new text 11", nt_3.a= "new text 11", nt_4.a= "new text 11", tt_4.a = "new text 11" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 4000",
> 4000, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; UPDATE tt_3, nt_3, nt_4, tt_4 SET tt_3.a=
> "new text 12", nt_3.a= "new text 12", nt_4.a= "new text 12", tt_4.a = "new text 12" where
> nt_3.b = nt_4.b and nt_4.b = tt_3.b and tt_3.b = tt_4.b and tt_4.b = 100
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text 4100",
> 4100, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +
> +
> +
> +
> +#
> +#13.e) "B M T R" with error in M generates in the binlog the "B M T R" entries.
> +#
> +BEGIN;
> +INSERT INTO nt_3 VALUES ("new text -30", -30, '');
> +INSERT INTO tt_3 VALUES ("new text -29", -29, ''), ("new text -30", -30, '');
> +ERROR 23000: Duplicate entry '-30' for key 'PRIMARY'
> +INSERT INTO tt_1 VALUES ("new text -30", -30, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +BEGIN;
> +INSERT INTO tt_4 VALUES ("new text -30", -30, '');
> +INSERT INTO nt_4 VALUES ("new text -29", -29, ''), ("new text -30", -30, '');
> +ERROR 23000: Duplicate entry '-30' for key 'PRIMARY'
> +INSERT INTO tt_1 VALUES ("new text -31", -31, '');
> +ROLLBACK;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show binlog events from <binlog_start>;
> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_3 VALUES ("new text -30",
> -30, '')
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_3 VALUES ("new text -29",
> -29, ''), ("new text -30", -30, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text -30",
> -30, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +master-bin.000001	#	Query	#	#	BEGIN
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_4 VALUES ("new text -30",
> -30, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_4 VALUES ("new text -29",
> -29, ''), ("new text -30", -30, '')
> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new text -31",
> -31, '')
> +master-bin.000001	#	Query	#	#	ROLLBACK
> +###################################################################################
> +#                                        CLEAN
> +###################################################################################
> +DROP TABLE tt_1;
> +DROP TABLE tt_2;
> +DROP TABLE tt_3;
> +DROP TABLE tt_4;
> +DROP TABLE nt_1;
> +DROP TABLE nt_2;
> +DROP TABLE nt_3;
> +DROP TABLE nt_4;
> +DROP PROCEDURE pc_i_tt_3;
> +DROP FUNCTION f1;
> +DROP FUNCTION f2;
>
> === added file 'mysql-test/suite/rpl/t/rpl_stm_causality_mixing_engines-master.opt'
> --- a/mysql-test/suite/rpl/t/rpl_stm_causality_mixing_engines-master.opt	1970-01-01
> 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_stm_causality_mixing_engines-master.opt	2009-11-03
> 22:24:42 +0000
> @@ -0,0 +1 @@
> +--ignore-causality
>
> === added file 'mysql-test/suite/rpl/t/rpl_stm_causality_mixing_engines.test'
> --- a/mysql-test/suite/rpl/t/rpl_stm_causality_mixing_engines.test	1970-01-01
> 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_stm_causality_mixing_engines.test	2009-11-03
> 22:24:42 +0000
> @@ -0,0 +1,5 @@
> +--source include/have_binlog_format_statement.inc
> +--source include/master-slave.inc
> +--source include/have_innodb.inc
> +
> +--source extra/rpl_tests/rpl_mixing_engines.test
>
> === modified file 'sql/log.cc'
> --- a/sql/log.cc	2009-10-23 00:03:41 +0000
> +++ b/sql/log.cc	2009-11-03 22:24:42 +0000
> @@ -4076,6 +4076,30 @@ bool MYSQL_BIN_LOG::write(Log_event *eve
>       to write to the binlog cache in that case to handle updates to mixed
>       trans/non-trans table types the best possible in binlogging)
>        - or if the event asks for it (cache_stmt == TRUE).
> +    
> +     However, we do not use the cache if the option ignore-causality is set,
> +     the current statement is logged as statement and there are no updates to
> +     transactional tables. This is a feature added to the code to avoid the
> +     well-known problems when a transaction contains updates to both transaction
> +     and non-transactional tables in statement and mixed modes.
> +   
> +     In a nutshell, the default behavior tries to preserve causality among the
> +     statements by not writing non-transactional statements directly to the
> +     binary log. Unfortunately, modifications done to non-transactional tables
> +     on behalf of a transaction become immediately visible to other connections
> +     but may not immediately get into the binary log and therefore consistency
> +     may be broken.
> +
> +     In general, it is impossible to automatically detect causality/dependency
> +     among statements by just analyzing the statements sent to the server. This
> +     happen because dependency may be hidden in the application code and it is
> +     necessary to know a priori all the statements processed in the context of
> +     a transaction such as in a procedure. Moreover, even for the few cases that
> +     we could automatically address in the server, the computation effort
> +     required could make the approach infeasible. 
> +
> +     So, we always tries to preserve causality/dependency unless the option
> +     ignore-causality is specified.
>      */
>      if (opt_using_transactions && thd)
>      {
> @@ -4086,8 +4110,10 @@ bool MYSQL_BIN_LOG::write(Log_event *eve
>          (binlog_trx_data*) thd_get_ha_data(thd, binlog_hton);
>        IO_CACHE *trans_log= &trx_data->trans_log;
>        my_off_t trans_log_pos= my_b_tell(trans_log);
> -      if (event_info->get_cache_stmt() || trans_log_pos != 0 ||
> -          stmt_has_updated_trans_table(thd))
> +      if ((event_info->get_cache_stmt() || trans_log_pos != 0 ||
> +           stmt_has_updated_trans_table(thd)) &&
> +          (thd->current_stmt_binlog_row_based ||
> stmt_has_updated_trans_table(thd)
> +          || !ignore_causality))
>        {
>          DBUG_PRINT("info", ("Using trans_log: cache: %d, trans_log_pos: %lu",
>                              event_info->get_cache_stmt(),
>
> === modified file 'sql/mysql_priv.h'
> --- a/sql/mysql_priv.h	2009-10-27 13:20:34 +0000
> +++ b/sql/mysql_priv.h	2009-11-03 22:24:42 +0000
> @@ -2017,6 +2017,7 @@ extern uint opt_large_page_size;
>  #ifdef MYSQL_SERVER
>  extern char *opt_logname, *opt_slow_logname;
>  extern const char *log_output_str;
> +extern bool ignore_causality;
>  
>  extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log;
>  extern LOGGER logger;
>
> === modified file 'sql/mysqld.cc'
> --- a/sql/mysqld.cc	2009-10-27 13:20:34 +0000
> +++ b/sql/mysqld.cc	2009-11-03 22:24:42 +0000
> @@ -560,6 +560,7 @@ ulong slow_launch_threads = 0, sync_binl
>  ulong expire_logs_days = 0;
>  ulong rpl_recovery_rank=0;
>  const char *log_output_str= "FILE";
> +bool ignore_causality;
>  
>  time_t server_start_time, flush_status_time;
>  
> @@ -3870,6 +3871,12 @@ with --log-bin instead.");
>      { 
>        DBUG_ASSERT(global_system_variables.binlog_format != BINLOG_FORMAT_UNSPEC);
>      }
> +  if (ignore_causality && !opt_bin_log)
> +  {
> +    sql_print_error("You need to use --log-bin to make "
> +                    "--ignore-causality work.");
> +    unireg_abort(1);
> +  }
>  
>    /* Check that we have not let the format to unspecified at this point */
>    DBUG_ASSERT((uint)global_system_variables.binlog_format <=
> @@ -5692,7 +5699,8 @@ enum options_mysqld
>    OPT_SLAVE_EXEC_MODE,
>    OPT_GENERAL_LOG_FILE,
>    OPT_SLOW_QUERY_LOG_FILE,
> -  OPT_IGNORE_BUILTIN_INNODB
> +  OPT_IGNORE_BUILTIN_INNODB,
> +  OPT_IGNORE_CAUSALITY
>  };
>  
>  
> @@ -7031,6 +7039,10 @@ The minimum value for this variable is 4
>     (uchar**) &max_system_variables.net_wait_timeout, 0, GET_ULONG,
>     REQUIRED_ARG, NET_WAIT_TIMEOUT, 1, IF_WIN(INT_MAX32/1000, LONG_TIMEOUT),
>     0, 1, 0},
> +  {"ignore-causality", OPT_IGNORE_CAUSALITY,
> +   "Specify whether to immediatily write to non-transactional statements to the
> binary log thus ignoring any causality among the statements.",
> +   (uchar**) &ignore_causality, (uchar**) &ignore_causality, 0, GET_BOOL,
> NO_ARG, 0,
> +    0, 0, 0, 0, 0},
>    {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
>  };
>  
>
> === modified file 'sql/set_var.cc'
> --- a/sql/set_var.cc	2009-09-29 15:38:40 +0000
> +++ b/sql/set_var.cc	2009-11-03 22:24:42 +0000
> @@ -171,7 +171,9 @@ sys_auto_increment_offset(&vars, "auto_i
>  
>  static sys_var_bool_ptr	sys_automatic_sp_privileges(&vars,
> "automatic_sp_privileges",
>  					      &sp_automatic_privileges);
> -
> +static sys_var_const            sys_ignore_causality(&vars, "ignore-causality",
> +                                             OPT_GLOBAL, SHOW_BOOL,
> +                                             (uchar*) &ignore_causality);
>  static sys_var_const            sys_back_log(&vars, "back_log",
>                                               OPT_GLOBAL, SHOW_LONG,
>                                               (uchar*) &back_log);
>
>   
> ------------------------------------------------------------------------
>
>


-- 
Your Sincerely,
Libing Song
==================================
MySQL Replication Team
Software Engineer
Certified (ISC)2 CISSP

Email : Li-Bing.Song@stripped
Skype : libing.song
MSN   : slb_database@stripped
Phone : +86 010-6505-4020 ext. 319
Mobile: +86 138-1144-2038
==================================

Thread
bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3160)Bug#46364Alfranio Correia3 Nov
  • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3160)Bug#46364Libing Song15 Nov
    • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3160)Bug#46364Alfranio Correia16 Nov
      • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3160)Bug#46364Alfranio Correia24 Nov