Hi Alfranio,
First, just an observation. This fix is not addressing the reported
behavior.
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 .
2. sql/log.cc
- hunk#2 => Merge condition added with previous in the source
code.
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
REQUESTS
--------
n/a
SUGGESTIONS
-----------
1. In the commit message, please make it more clear. Check
detailed the suggestions in the DETAILS section.
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).
> {
> DBUG_PRINT("info", ("Using trans_log: cache: %d, trans_log_pos: %lu",
> event_info->get_cache_stmt(),
>
--
Luís