List:Commits« Previous MessageNext Message »
From:Alfranio Correia Date:July 11 2009 12:09am
Subject:Re: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:3018)
Bug#28976
View as plain text  
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.

However, this is what we agreed to do, although I would prefer to
push the patch for WL#2687.
>   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.
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