List:Commits« Previous MessageNext Message »
From:Luís Soares Date:July 13 2009 11:51pm
Subject:Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)
Bug#28976
View as plain text  
Hi Alfranio,

Just replying to your comments.

Cheers,
Luís


On Sat, 2009-07-11 at 01:09 +0100, Alfranio Correia wrote:
> Luís Soares wrote:
> > Hi Alfranio,
> >
> >   First, just an observation. This fix is not addressing the reported
> > behavior.
> >   
> I don't agree with your observation but you could say that the fix does
> "fully" address the issue reported. If this is what you meant to say
> I agree with you because it only addresses the issue for statement
> based replication.

Yes, it does not fully address the issue reported. It only takes care of
a very small part of it.

> However, this is what we agreed to do, although I would prefer to
> push the patch for WL#2687.

Yes, WL#2687 should prove to be the definite answer to these problems.

> >   Having that said, lets move to the review comments.
> >
> > Cheers,
> > Luís
> >
> > STATUS
> > ------
> >   
> >   Not approved.
> >
> > REQUIRED CHANGES
> > ----------------
> >
> >   1. sql/log.cc
> >
> >     - hunk#1 => Unused variable ret .
> >   
> ok.
> >   2. sql/log.cc
> >   
> >     - hunk#2 => Merge condition added with previous in the source
> >                 code.
> >   
> Done, although it is easier to read, on the contrary.
> >   3. Fix failing test cases. On my local mtr run (which has not
> >      ended yet), I have several tests failing:
> >
> >     - rpl.rpl_concurrency_error
> >     - rpl.rpl_innodb_mixed_dml 
> >     - binlog.binlog_row_mix_innodb_myisam 
> >     - binlog.binlog_stm_mix_innodb_myisam 
> >     - main.commit_1innodb
> >   
> Fixed. I did not want to waste time fixing test cases and
> cluttering the cset with such fixes.
> > REQUESTS
> > --------
> >  
> >   n/a
> >
> > SUGGESTIONS
> > -----------
> >
> >   1. In the commit message, please make it more clear. Check
> >      detailed the suggestions in the DETAILS section.
> >   
> ok. done.
> > DETAILS
> > -------
> >
> > On Fri, 2009-07-10 at 11:39 +0000, Alfranio Correia wrote:
> >   
> >> #At
> file:///home/acorreia/workspace.sun/repository.mysql/bzrwork/bug-28976/mysql-5.1-bugteam/
> based on revid:joro@stripped
> >>
> >>  3018 Alfranio Correia	2009-07-10
> >>       BUG#28976 Mixing trans and non-trans tables in one transaction results
> in incorrect
> >>       binlog
> >>       
> >>       Mixing transactional (T) and non-transactional (N) tables on behalf of
> a
> >>       transaction may lead to inconsistencies among masters and slaves. The
> problem
> >>       stems from the fact that although modifications done to
> non-transactional tables
> >>       on behalf of a transaction become immediately visible to the other
> connections it
> >>       does not immediately gets to the binary log and therefore consistency
> is broken.
> >>     
> >
> > immediately get ...
> >
> >   
> >>   
> >>       After the WL#2687, it will be safe to use either the MIXED or ROW mode
> to do such
> >>       mix. Changes to non-transactional tables will immediately get to the
> binary log
> >>       as rows. Under the STATEMENT mode, however, changing non-transactional
> tables
> >>       before transactional ones is the only possible safe mix. This happen
> because it
> >>     
> >
> > This happen*s*
> >
> >   
> >>       is as if such changes had not been executed on the behalf of a
> transaction.
> >>       On the other hand, other combinations may hide a causal dependency,
> thus making
> >>       impossible to immediately write statements with non-transactional
> tables to the
> >>       binary log before committing or rolling back the transaction.
> >>     
> >
> > I don't think this paragraph is really necessary here ^^^, is it? Maybe
> > just reference it in the first one with: "[...] consistency is broken.
> > These are well known issues (BUG#XXX, BUG#YYYY, BUG#ZZZZ and of course
> > this one). The ultimate solution will be provided by WL#YYYY".
> >
> > Also, maybe make a clear statement in the bug report that the patch
> > won't solve the problem, it will only fix two small issues. Full fix -
> > at least the one possible fix - is provided by WL#2687.
> >
> >   
> >>       In this bug, with fix two issues regarding the mix of T statements and
> N
> >>       statements on behalf of a transaction when in STATEMENT mode.
> >>     
> >
> > Sentence above needs a minor rewrite to become clear (perhaps replace
> > with -> we?).
> >
> >   
> >>       
> >>       First, multi-level (e.g. a statement that fires a trigger) or
> multi-table table
> >>       statements (e.g. update t1, t2...) were not handled correctly. In such
> cases,
> >>       only the flag "modified_non_trans_table" is not enough to reflect that
> both a N
> >>       and T tables were changed. To circumvent this issue, we also check if
> an engine
> >>       is registered in the handler's list and changed something meaning that
> a M table
> >>       was modified.
> >>     
> >
> > M table is unclear and lacks previous definition. Maybe: 
> >
> > "First [...] were not handled correctly (lets call these M statements)."
> >
> > "[...] that an M statement was modified"? 
> >
> > What do you say?
> >
> >   
> >>       Second, the fix for BUG#43929 introduced a regression issue. In a
> nutshell,
> >>       when a N statement fails on behalf of a transaction, it is written to
> the binary
> >>       log with the error code appended. Unfortunately, after BUG#43929, this
> scenario
> >>       was flushing the transactional cache (i.e. the cache where changes a
> stored while
> >>       processing a transaction before being written to the binary log upon a
> commit
> >>       or rollback) although a commit or a rollback was not issued. To fix
> this issue,
> >>       we avoid flushing the transactional cache when a commit or rollback is
> not issued.
> >>     
> >
> > This paragraph is a bit unclear. Maybe simply state that when an N
> > statement was failing inside an M transaction boundaries, the
> > transactional cache would be flushed causing mismatch between execution
> > and logging histories.
> >
> >   
> >>     added:
> >>       mysql-test/suite/rpl/include/rpl_mixed_engines.inc
> >>       mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result
> >>       mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test
> >>     modified:
> >>       sql/log.cc
> >> === added file 'mysql-test/suite/rpl/include/rpl_mixed_engines.inc'
> >> --- a/mysql-test/suite/rpl/include/rpl_mixed_engines.inc	1970-01-01 00:00:00
> +0000
> >> +++ b/mysql-test/suite/rpl/include/rpl_mixed_engines.inc	2009-07-10 11:39:21
> +0000
> >> @@ -0,0 +1,710 @@
> >>
> +###################################################################################
> >> +# This test checks if transactions that mixes transactional and
> non-transactional
> >> +# tables are correctly handled in statement mode. In an nutshell, we have
> what 
> >> +# follows:
> >> +#
> >> +# 1) "B T T C" generates in binlog the "B T T C" entries.
> >> +#
> >> +# 2) "B T T R"  generates in binlog an "empty" entry.
> >> +#
> >> +# 3) "B T N C" generates in binlog the "B T N C" entries.
> >> +#
> >> +# 4) "B T N R" generates in binlog the "B T N R" entries.
> >> +#
> >> +# 5) "T" generates in binlog the "B T C" entry.
> >> +#
> >> +# 6) "N" generates in binlog the "N" entry.
> >> +#
> >> +# 7) "M" generates in binglog the "B M C" entries.
> >> +#
> >> +# 8) "B N N T C" generates in binglog the "N N B T C" entries.
> >> +#
> >> +# 9) "B N N T R" generates in binlog the "N N B T R" entries.
> >> +#
> >> +# 10) "B N N C" generates in binglog the "N N" entries.
> >> +#
> >> +# 11) "B N N R" generates in binlog the "N N" entries.
> >> +#
> >> +# 12) "B M T C" generates in the binlog the "B M T C" entries.
> >> +#
> >> +# 13) "B M T R" generates in the binlog the "B M T R" entries.
> >>
> +###################################################################################
> >> + 
> >> +--echo
> ###################################################################################
> >> +--echo #                                   CONFIGURATION
> >> +--echo
> ###################################################################################
> >> +connection master;
> >> +
> >> +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;
> >> +
> >> +connection slave;
> >> +
> >> +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;
> >> +
> >> +connection master;
> >> +
> >> +DELIMITER |;
> >> +
> >> +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|
> >> +
> >> +DELIMITER ;|
> >> +
> >> +--echo
> ###################################################################################
> >> +--echo #                 MIXING TRANSACTIONAL and NON-TRANSACTIONAL TABLES
> >> +--echo
> ###################################################################################
> >> +connection master;
> >> +
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #1) "B T T C" generates in binlog the "B T T C" entries.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #1.e) "B T T C" with error in T generates in binlog the "B T T C"
> entries.
> >> +--echo #
> >> +INSERT INTO tt_1 VALUES ("new text -2", -2, "new text -2");
> >> +BEGIN;
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_1 VALUES ("new text -1", -1, "new text -1"), ("new text -2",
> -2, "new text -2");
> >> +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");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_2 VALUES ("new text -4", -4, "new text -4"), ("new text -5",
> -5, "new text -5");
> >> +COMMIT;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #2) "B T T R"  generates in binlog an "empty" entry.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #2.e) "B T T R"  with error in T generates in binlog an "empty"
> entry.
> >> +--echo #
> >> +INSERT INTO tt_1 VALUES ("new text -7", -7, "new text -7");
> >> +BEGIN;
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_1 VALUES ("new text -6", -6, "new text -6"), ("new text -7",
> -7, "new text -7");
> >> +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");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_2 VALUES ("new text -9", -9, "new text -9"), ("new text
> -10", -10, "new text -10");
> >> +ROLLBACK;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #3) "B T N C" generates in binlog the "B T N C" entries.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #3.e) "B T N C" with error in either T or N generates in binlog the
> "B T N C" entries.
> >> +--echo #
> >> +INSERT INTO tt_1 VALUES ("new text -12", -12, "new text -12");
> >> +BEGIN;
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_1 VALUES ("new text -11", -11, "new text -11"), ("new text
> -12", -12, "new text -12");
> >> +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");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO nt_1 VALUES ("new text -15", -15, "new text -15"), ("new text
> -16", -16, "new text -16");
> >> +COMMIT;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #4) "B T N R" generates in binlog the "B T N R" entries.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #4.e) "B T N R" with error in either T or N generates in binlog the
> "B T N R" entries.
> >> +--echo #
> >> +INSERT INTO tt_1 VALUES ("new text -17", -17, "new text -17");
> >> +BEGIN;
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_1 VALUES ("new text -16", -16, "new text -16"), ("new text
> -17", -17, "new text -17");
> >> +INSERT INTO nt_1 VALUES ("new text -18", -18, "new text -18");
> >> +ROLLBACK;
> >> +
> >> +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");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO nt_1 VALUES ("new text -20", -20, "new text -20"), ("new text
> -21", -21, "new text -21");
> >> +ROLLBACK;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #5) "T" generates in binlog the "B T C" entry.
> >> +--echo #
> >> +INSERT INTO tt_1 VALUES ("new text 8", 8, "new text 8");
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #5.e) "T" with error in T generates in binlog an "empty" entry.
> >> +--echo #
> >> +INSERT INTO tt_1 VALUES ("new text -1", -1, "new text -1");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_1 VALUES ("new text -1", -1, "new text -1"), ("new text
> -22", -22, "new text -22");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_1 VALUES ("new text -23", -23, "new text -23"), ("new text
> -1", -1, "new text -1");
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #6) "N" generates in binlog the "N" entry.
> >> +--echo #
> >> +INSERT INTO nt_1 VALUES ("new text 9", 9, "new text 9");
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #6.e) "N" with error in N generates in binlog an empty entry if the
> error
> >> +--echo # happens in the first tuple. Otherwise, generates the "N" entry
> and
> >> +--echo # the error is appended.
> >> +--echo #
> >> +INSERT INTO nt_1 VALUES ("new text -1", -1, "new text -1");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO nt_1 VALUES ("new text -1", -1, "new text -1");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO nt_1 VALUES ("new text -24", -24, "new text -24"), ("new text
> -1", -1, "new text -1");
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #7) "M" generates in binglog the "B M C" entries.
> >> +--echo #
> >> +
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #7.e) "M" with error in M generates in binglog the "B M R" entries.
> >> +--echo #
> >> +
> >> +INSERT INTO nt_3 VALUES ("new text -26", -26, '');
> >> +SELECT * FROM tt_3;
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_3 VALUES ("new text -25", -25, ''), ("new text -26", -26,
> '');
> >> +SELECT * FROM tt_3;
> >> +
> >> +INSERT INTO tt_4 VALUES ("new text -26", -26, '');
> >> +SELECT * FROM nt_4;
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO nt_4 VALUES ("new text -25", -25, ''), ("new text -26", -26,
> '');
> >> +SELECT * FROM nt_4;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #8) "B N N T C" generates in binglog the "N N B T C" entries.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo #
> >> +--echo #8.e) "B N N T R" See 6.e and 9.e.
> >> +--echo #
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #9) "B N N T R" generates in binlog the "N N B T R" entries.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #9.e) "B N N T R" with error in N generates in binlog the "N N B T
> R" entries.
> >> +--echo #
> >> +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");
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO nt_2 VALUES ("new text -26", -26, "new text -26"), ("new text
> -25", -25, "new text -25");
> >> +INSERT INTO tt_1 VALUES ("new text -27", -27, "new text -27");
> >> +ROLLBACK;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #10) "B N N C" generates in binglog the "N N" entries.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo #
> >> +--echo #10.e) "B N N C" See 6.e and 9.e.
> >> +--echo #
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #11) "B N N R" generates in binlog the "N N" entries.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo #
> >> +--echo #11.e) "B N N R" See 6.e and 9.e.
> >> +--echo #
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #12) "B M T C" generates in the binlog the "B M T C" entries.
> >> +--echo #
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #12.e) "B M T C" with error in M generates in the binlog the "B M T
> C" entries.
> >> +--echo #  
> >> +
> >> +--echo # There is a bug in the slave that needs to be fixed before
> enabling
> >> +--echo # this part of the test. A bug report will be filed referencing
> this
> >> +--echo # test case.
> >> +#
> >> +#BEGIN;
> >> +#INSERT INTO nt_3 VALUES ("new text -28", -28, '');
> >> +#--error ER_DUP_ENTRY
> >> +#INSERT INTO tt_3 VALUES ("new text -27", -27, ''), ("new text -28", -28,
> '');
> >> +#INSERT INTO tt_1 VALUES ("new text -27", -27, '');
> >> +#COMMIT;
> >> +#
> >> +#BEGIN;
> >> +#INSERT INTO tt_4 VALUES ("new text -28", -28, '');
> >> +#--error ER_DUP_ENTRY
> >> +#INSERT INTO nt_4 VALUES ("new text -27", -27, ''), ("new text -28", -28,
> '');
> >> +#INSERT INTO tt_1 VALUES ("new text -28", -28, '');
> >> +#COMMIT;
> >> +#
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #13) "B M T R" generates in the binlog the "B M T R" entries
> >> +--echo #
> >> +
> >> +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;
> >> +
> >> +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;
> >> +
> >> +BEGIN;
> >> +INSERT INTO tt_3 VALUES("new text 2700", 2700, f1());
> >> +INSERT INTO tt_1 VALUES ("new text 2800", 2800, '');
> >> +ROLLBACK;
> >> +
> >> +BEGIN;
> >> +INSERT INTO tt_3 VALUES(2900, 2900, f2());
> >> +INSERT INTO tt_1 VALUES ("new text 3000", 3000, '');
> >> +ROLLBACK;
> >> +
> >> +BEGIN;
> >> +INSERT INTO nt_4 VALUES ("new text 3100", 3100, '');
> >> +INSERT INTO tt_1 VALUES ("new text 3200", 3200, '');
> >> +ROLLBACK;
> >> +
> >> +BEGIN;
> >> +INSERT INTO nt_4 VALUES("new text 3300", 3300, f1());
> >> +INSERT INTO tt_1 VALUES ("new text 3400", 3400, '');
> >> +ROLLBACK;
> >> +
> >> +BEGIN;
> >> +INSERT INTO nt_4 VALUES("new text 3500", 3500, f2());
> >> +INSERT INTO tt_1 VALUES ("new text 3600", 3600, '');
> >> +ROLLBACK;
> >> +
> >> +BEGIN;
> >> +CALL pc_i_tt_3(3700, "Testing...");
> >> +INSERT INTO tt_1 VALUES ("new text 3700", 3700, '');
> >> +ROLLBACK;
> >> +
> >> +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;
> >> +
> >> +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;
> >> +
> >> +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;
> >> +
> >> +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;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +--echo
> >> +--echo
> >> +--echo
> >> +--echo
> >> +let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1);
> >> +--echo #
> >> +--echo #13.e) "B M T R" with error in M generates in the binlog the "B M T
> R" entries.
> >> +--echo #
> >> +
> >> +BEGIN;
> >> +INSERT INTO nt_3 VALUES ("new text -30", -30, '');
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO tt_3 VALUES ("new text -29", -29, ''), ("new text -30", -30,
> '');
> >> +INSERT INTO tt_1 VALUES ("new text -30", -30, '');
> >> +ROLLBACK;
> >> +
> >> +BEGIN;
> >> +INSERT INTO tt_4 VALUES ("new text -30", -30, '');
> >> +--error ER_DUP_ENTRY
> >> +INSERT INTO nt_4 VALUES ("new text -29", -29, ''), ("new text -30", -30,
> '');
> >> +INSERT INTO tt_1 VALUES ("new text -31", -31, '');
> >> +ROLLBACK;
> >> +
> >> +--source include/show_binlog_events.inc
> >> +
> >> +connection master;
> >> +sync_slave_with_master;
> >> +
> >> +--exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert
> --no-create-info test > $MYSQLTEST_VARDIR/tmp/test-master.sql
> >> +--exec $MYSQL_DUMP_SLAVE --compact --order-by-primary
> --skip-extended-insert --no-create-info test > $MYSQLTEST_VARDIR/tmp/test-slave.sql
> >> +--diff_files $MYSQLTEST_VARDIR/tmp/test-master.sql
> $MYSQLTEST_VARDIR/tmp/test-slave.sql
> >> +
> >> +--echo
> ###################################################################################
> >> +--echo #                                        CLEAN
> >> +--echo
> ###################################################################################
> >> +
> >> +connection master;
> >> +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;
> >> +
> >> +sync_slave_with_master;
> >>
> >> === added file 'mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result'
> >> --- a/mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result	1970-01-01
> 00:00:00 +0000
> >> +++ b/mysql-test/suite/rpl/r/rpl_stm_mixing_engines.result	2009-07-10
> 11:39:21 +0000
> >> @@ -0,0 +1,848 @@
> >> +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	#	#	BEGIN
> >> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new
> text 6", 6, "new text 6")
> >> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_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	#	#	BEGIN
> >> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new
> text -14", -14, "new text -14")
> >> +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	#	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	#	#	BEGIN
> >> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new
> text 7", 7, "new text 7")
> >> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO nt_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	#	#	BEGIN
> >> +master-bin.000001	#	Query	#	#	use `test`; INSERT INTO tt_1 VALUES ("new
> text -19", -19, "new text -19")
> >> +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	#	#	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.
> >> +show binlog events from <binlog_start>;
> >> +Log_name	Pos	Event_type	Server_id	End_log_pos	Info
> >> +
> >> +
> >> +
> >> +
> >> +#
> >> +#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_mixing_engines.test'
> >> --- a/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test	1970-01-01 00:00:00
> +0000
> >> +++ b/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test	2009-07-10 11:39:21
> +0000
> >> @@ -0,0 +1,5 @@
> >> +--source include/have_binlog_format_statement.inc
> >> +--source include/master-slave.inc
> >> +--source include/have_innodb.inc
> >> +
> >> +--source suite/rpl/include/rpl_mixed_engines.inc
> >>
> >> === modified file 'sql/log.cc'
> >> --- a/sql/log.cc	2009-06-19 08:24:43 +0000
> >> +++ b/sql/log.cc	2009-07-10 11:39:21 +0000
> >> @@ -1264,6 +1264,18 @@ int LOGGER::set_handlers(uint error_log_
> >>    return 0;
> >>  }
> >>  
> >> +static bool stmt_has_updated_trans_table(THD *thd)
> >> +{
> >> +  bool ret= FALSE;
> >>     
> >
> > Unused warning ^^^ .
> >
> >   
> >> +  Ha_trx_info *ha_info;
> >> +
> >> +  for (ha_info= thd->transaction.stmt.ha_list; ha_info; ha_info=
> ha_info->next())
> >> +  {
> >> +    if (ha_info->is_trx_read_write())
> >> +      return (TRUE);
> >> +  }
> >> +  return (FALSE);
> >> +}
> >>  
> >>   /*
> >>    Save position of binary log transaction cache.
> >> @@ -1578,8 +1590,11 @@ static int binlog_rollback(handlerton *h
> >>        transactional table in that statement as well, which needs to be
> >>        rolled back on the slave.
> >>      */
> >> -    Query_log_event qev(thd, STRING_WITH_LEN("ROLLBACK"), TRUE, TRUE, 0);
> >> -    error= binlog_end_trans(thd, trx_data, &qev, all);
> >> +    if (all || !(thd->options & (OPTION_BEGIN |
> OPTION_NOT_AUTOCOMMIT)))
> >> +    {
> >>     
> >
> > Why wasn't this ^^^, made as part of the previous condition? Please,
> > merge them.
> >
> >   
> >> +      Query_log_event qev(thd, STRING_WITH_LEN("ROLLBACK"), TRUE, TRUE,
> 0);
> >> +      error= binlog_end_trans(thd, trx_data, &qev, all);
> >> +    }
> >>    }
> >>    else
> >>    {
> >> @@ -4044,7 +4059,8 @@ 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)
> >> +      if (event_info->get_cache_stmt() || trans_log_pos != 0 ||
> >> +          stmt_has_updated_trans_table(thd))
> >>     
> >
> > I wonder if we should have a modified_trans_table flag (similar to the
> > modified_non_trans_table).
> >   
> I would prefer a new flag as I had in previous patches but
> Andrei did not like the idea. So let's keep things as you have
> here.
> 
> >   
> >>        {
> >>          DBUG_PRINT("info", ("Using trans_log: cache: %d, trans_log_pos:
> %lu",
> >>                              event_info->get_cache_stmt(),
> >>
> >>     
> Cheers.
-- 
Luís

Thread
bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)Bug#28976Alfranio Correia10 Jul
  • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)Bug#28976He Zhenxing10 Jul
    • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)Bug#28976Alfranio Correia10 Jul
      • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)Bug#28976Alfranio Correia11 Jul
  • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)Bug#28976Luís Soares10 Jul
    • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)Bug#28976Alfranio Correia11 Jul
      • Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)Bug#28976Luís Soares14 Jul