include/master-slave.inc [connection master] DROP DATABASE IF EXISTS db1; DROP DATABASE IF EXISTS db2; CREATE DATABASE db1; CREATE DATABASE db2; use db1; CREATE TABLE db1.t1 (a INT) ENGINE=InnoDB; CREATE TABLE db1.t2 (s CHAR(255)) ENGINE=MyISAM; include/stop_slave.inc [on master] CREATE PROCEDURE db1.p1 () BEGIN INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (5); END// CREATE PROCEDURE db1.p2 () BEGIN INSERT INTO t1 VALUES (6); INSERT INTO t1 VALUES (7); INSERT INTO t1 VALUES (8); INSERT INTO t1 VALUES (9); INSERT INTO t1 VALUES (10); INSERT INTO t2 VALUES ('executed db1.p2()'); END// INSERT INTO db1.t2 VALUES ('before call db1.p1()'); use test; BEGIN; CALL db1.p1(); COMMIT; INSERT INTO db1.t2 VALUES ('after call db1.p1()'); SELECT * FROM db1.t1; a 1 2 3 4 5 SELECT * FROM db1.t2; s before call db1.p1() after call db1.p1() [on slave] start slave until master_log_file='master-bin.000001', master_log_pos=MASTER_POS; include/wait_for_slave_sql_to_stop.inc # # If we got non-zero here, then we're suffering BUG#43263 # SELECT 0 as 'Must be 0'; Must be 0 0 SELECT * from db1.t1; a 1 2 3 4 5 SELECT * from db1.t2; s before call db1.p1() [on master] INSERT INTO db1.t2 VALUES ('before call db1.p2()'); BEGIN; CALL db1.p2(); ROLLBACK; INSERT INTO db1.t2 VALUES ('after call db1.p2()'); SELECT * FROM db1.t1; a 1 2 3 4 5 SELECT * FROM db1.t2; s before call db1.p1() after call db1.p1() before call db1.p2() executed db1.p2() after call db1.p2() [on slave] start slave until master_log_file='master-bin.000001', master_log_pos=MASTER_POS; include/wait_for_slave_sql_to_stop.inc # # If we got non-zero here, then we're suffering BUG#43263 # SELECT 0 as 'Must be 0'; Must be 0 0 SELECT * from db1.t1; a 1 2 3 4 5 SELECT * from db1.t2; s before call db1.p1() executed db1.p2() START SLAVE; include/wait_for_slave_sql_to_start.inc # # SAVEPOINT and ROLLBACK TO have the same problem in BUG#43263 # This was reported by BUG#50407 [on master] SET SESSION AUTOCOMMIT=0 BEGIN; INSERT INTO db1.t1 VALUES(20); # # Verify whether this statement is binlogged correctly /*comment*/ SAVEPOINT has_comment; USE db1; INSERT INTO db1.t1 VALUES(30); INSERT INTO db1.t2 VALUES("in savepoint has_comment"); USE db2; SavePoint mixed_cases; USE db1; INSERT INTO db1.t2 VALUES("in savepoint mixed_cases"); INSERT INTO db1.t1 VALUES(40); USE db2; ROLLBACK TO mixed_cases; Warnings: Warning 1196 Some non-transactional changed tables couldn't be rolled back ROLLBACK TO has_comment; Warnings: Warning 1196 Some non-transactional changed tables couldn't be rolled back USE db1; INSERT INTO db1.t2 VALUES("after rollback to"); INSERT INTO db1.t1 VALUES(50); USE db2; COMMIT; show binlog events from ; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # use `test`; INSERT INTO db1.t1 VALUES(20) master-bin.000001 # Query # # SAVEPOINT `has_comment` master-bin.000001 # Query # # use `db1`; INSERT INTO db1.t1 VALUES(30) master-bin.000001 # Query # # use `db1`; INSERT INTO db1.t2 VALUES("in savepoint has_comment") master-bin.000001 # Query # # SAVEPOINT `mixed_cases` master-bin.000001 # Query # # use `db1`; INSERT INTO db1.t2 VALUES("in savepoint mixed_cases") master-bin.000001 # Query # # use `db1`; INSERT INTO db1.t1 VALUES(40) master-bin.000001 # Query # # ROLLBACK TO `mixed_cases` master-bin.000001 # Query # # ROLLBACK TO `has_comment` master-bin.000001 # Query # # use `db1`; INSERT INTO db1.t2 VALUES("after rollback to") master-bin.000001 # Query # # use `db1`; INSERT INTO db1.t1 VALUES(50) master-bin.000001 # Xid # # COMMIT /* XID */ [on slave] # # Verify INSERT statements in savepoints are executed, for MyISAM table # is not effected by ROLLBACK TO SELECT * FROM db1.t2 WHERE s LIKE '% savepoint %'; s in savepoint has_comment in savepoint mixed_cases # # Verify INSERT statements on the Innodb table are rolled back; SELECT * FROM db1.t1 WHERE a IN (30, 40); a # # Clean up # DROP DATABASE db1; DROP DATABASE db2; include/rpl_end.inc