Loading mysql-test/include/show_binlog_events.inc +9 −3 Original line number Diff line number Diff line --let $binlog_start=98 --replace_column 5 # --replace_regex /\/\* xid=.* \*\//\/* XID *\// # $binlog_start can be set by caller or take a default value if (!$binlog_start) { let $binlog_start=98; } --replace_result $binlog_start <binlog_start> --replace_column 2 # 4 # 5 # --replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /file_id=[0-9]+/file_id=#/ --eval show binlog events from $binlog_start mysql-test/r/rpl_auto_increment_bug33029.result 0 → 100644 +167 −0 Original line number Diff line number Diff line 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; DROP TABLE IF EXISTS t1, t2; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; DROP TRIGGER IF EXISTS tr1; DROP FUNCTION IF EXISTS f1; CREATE TABLE t1 (id INT AUTO_INCREMENT PRIMARY KEY); CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY); CREATE PROCEDURE p1() BEGIN DECLARE ins_count INT DEFAULT 10; WHILE ins_count > 0 DO INSERT INTO t1 VALUES (NULL); SET ins_count = ins_count - 1; END WHILE; DELETE FROM t1 WHERE id = 1; DELETE FROM t1 WHERE id = 2; DELETE FROM t2 WHERE id = 1; DELETE FROM t2 WHERE id = 2; END// CREATE PROCEDURE p2() BEGIN INSERT INTO t1 VALUES (NULL); DELETE FROM t1 WHERE id = f1(3); DELETE FROM t1 WHERE id = f1(4); DELETE FROM t2 WHERE id = 3; DELETE FROM t2 WHERE id = 4; END// CREATE TRIGGER tr1 BEFORE DELETE ON t1 FOR EACH ROW BEGIN INSERT INTO t2 VALUES (NULL); END// CREATE FUNCTION f1 (i int) RETURNS int BEGIN INSERT INTO t2 VALUES (NULL); RETURN i; END// CALL p1(); show binlog events from <binlog_start>; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Intvar # # INSERT_ID=1 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=2 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=3 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=4 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=5 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=6 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=7 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=8 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=9 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=10 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Query # # use `test`; DELETE FROM t1 WHERE id = 1 master-bin.000001 # Query # # use `test`; DELETE FROM t1 WHERE id = 2 master-bin.000001 # Query # # use `test`; DELETE FROM t2 WHERE id = 1 master-bin.000001 # Query # # use `test`; DELETE FROM t2 WHERE id = 2 # Result on master SELECT * FROM t1; id 3 4 5 6 7 8 9 10 SELECT * FROM t2; id # Result on slave SELECT * FROM t1; id 3 4 5 6 7 8 9 10 SELECT * FROM t2; id DROP TRIGGER tr1; CALL p2(); show binlog events from <binlog_start>; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Intvar # # INSERT_ID=11 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Query # # use `test`; DELETE FROM t1 WHERE id = f1(3) master-bin.000001 # Query # # use `test`; DELETE FROM t1 WHERE id = f1(4) master-bin.000001 # Query # # use `test`; DELETE FROM t2 WHERE id = 3 master-bin.000001 # Query # # use `test`; DELETE FROM t2 WHERE id = 4 # Result on master SELECT * FROM t1; id 5 6 7 8 9 10 11 SELECT * FROM t2; id 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # Result on slave SELECT * FROM t1; id 5 6 7 8 9 10 11 SELECT * FROM t2; id 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 DROP TABLE IF EXISTS t1, t2; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; DROP FUNCTION IF EXISTS f1; DROP TRIGGER IF EXISTS tr1; Warnings: Note 1360 Trigger does not exist mysql-test/t/rpl_auto_increment_bug33029.test 0 → 100644 +107 −0 Original line number Diff line number Diff line # BUG#33029 5.0 to 5.1 replication fails on dup key when inserting # using a trig in SP # For all 5.0 up to 5.0.58 exclusive, and 5.1 up to 5.1.12 exclusive, # if one statement in a SP generated AUTO_INCREMENT value by the top # statement, all statements after it would be considered generated # AUTO_INCREMENT value by the top statement, and a erroneous INSERT_ID # value might be associated with these statement, which could cause # duplicate entry error and stop the slave. source include/master-slave.inc; --disable_warnings DROP TABLE IF EXISTS t1, t2; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; DROP TRIGGER IF EXISTS tr1; DROP FUNCTION IF EXISTS f1; --enable_warnings CREATE TABLE t1 (id INT AUTO_INCREMENT PRIMARY KEY); CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY); delimiter //; CREATE PROCEDURE p1() BEGIN DECLARE ins_count INT DEFAULT 10; WHILE ins_count > 0 DO INSERT INTO t1 VALUES (NULL); SET ins_count = ins_count - 1; END WHILE; DELETE FROM t1 WHERE id = 1; DELETE FROM t1 WHERE id = 2; DELETE FROM t2 WHERE id = 1; DELETE FROM t2 WHERE id = 2; END// CREATE PROCEDURE p2() BEGIN INSERT INTO t1 VALUES (NULL); DELETE FROM t1 WHERE id = f1(3); DELETE FROM t1 WHERE id = f1(4); DELETE FROM t2 WHERE id = 3; DELETE FROM t2 WHERE id = 4; END// CREATE TRIGGER tr1 BEFORE DELETE ON t1 FOR EACH ROW BEGIN INSERT INTO t2 VALUES (NULL); END// CREATE FUNCTION f1 (i int) RETURNS int BEGIN INSERT INTO t2 VALUES (NULL); RETURN i; END// delimiter ;// # the $binlog_start will be used by the show_binlog_events.inc, so # that we can skip binlog events we don't care let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); CALL p1(); source include/show_binlog_events.inc; echo # Result on master; SELECT * FROM t1; SELECT * FROM t2; sync_slave_with_master; echo # Result on slave; SELECT * FROM t1; SELECT * FROM t2; connection master; DROP TRIGGER tr1; # the $binlog_start will be used by the show_binlog_events.inc, so # that we can skip binlog events we don't care let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); CALL p2(); source include/show_binlog_events.inc; echo # Result on master; SELECT * FROM t1; SELECT * FROM t2; sync_slave_with_master; echo # Result on slave; SELECT * FROM t1; SELECT * FROM t2; # clean up connection master; DROP TABLE IF EXISTS t1, t2; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; DROP FUNCTION IF EXISTS f1; DROP TRIGGER IF EXISTS tr1; sync_slave_with_master; sql/sql_class.cc +7 −0 Original line number Diff line number Diff line Loading @@ -622,6 +622,13 @@ void THD::cleanup_after_query() { clear_next_insert_id= 0; next_insert_id= 0; /* BUG#33029, if one statement in a SP set this member to 1, all statment after this statement in the SP would be considered used INSERT_ID value, reset this member after each query to fix this. */ insert_id_used= 0; } /* Reset rand_used so that detection of calls to rand() will save random Loading Loading
mysql-test/include/show_binlog_events.inc +9 −3 Original line number Diff line number Diff line --let $binlog_start=98 --replace_column 5 # --replace_regex /\/\* xid=.* \*\//\/* XID *\// # $binlog_start can be set by caller or take a default value if (!$binlog_start) { let $binlog_start=98; } --replace_result $binlog_start <binlog_start> --replace_column 2 # 4 # 5 # --replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /file_id=[0-9]+/file_id=#/ --eval show binlog events from $binlog_start
mysql-test/r/rpl_auto_increment_bug33029.result 0 → 100644 +167 −0 Original line number Diff line number Diff line 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; DROP TABLE IF EXISTS t1, t2; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; DROP TRIGGER IF EXISTS tr1; DROP FUNCTION IF EXISTS f1; CREATE TABLE t1 (id INT AUTO_INCREMENT PRIMARY KEY); CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY); CREATE PROCEDURE p1() BEGIN DECLARE ins_count INT DEFAULT 10; WHILE ins_count > 0 DO INSERT INTO t1 VALUES (NULL); SET ins_count = ins_count - 1; END WHILE; DELETE FROM t1 WHERE id = 1; DELETE FROM t1 WHERE id = 2; DELETE FROM t2 WHERE id = 1; DELETE FROM t2 WHERE id = 2; END// CREATE PROCEDURE p2() BEGIN INSERT INTO t1 VALUES (NULL); DELETE FROM t1 WHERE id = f1(3); DELETE FROM t1 WHERE id = f1(4); DELETE FROM t2 WHERE id = 3; DELETE FROM t2 WHERE id = 4; END// CREATE TRIGGER tr1 BEFORE DELETE ON t1 FOR EACH ROW BEGIN INSERT INTO t2 VALUES (NULL); END// CREATE FUNCTION f1 (i int) RETURNS int BEGIN INSERT INTO t2 VALUES (NULL); RETURN i; END// CALL p1(); show binlog events from <binlog_start>; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Intvar # # INSERT_ID=1 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=2 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=3 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=4 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=5 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=6 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=7 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=8 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=9 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Intvar # # INSERT_ID=10 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Query # # use `test`; DELETE FROM t1 WHERE id = 1 master-bin.000001 # Query # # use `test`; DELETE FROM t1 WHERE id = 2 master-bin.000001 # Query # # use `test`; DELETE FROM t2 WHERE id = 1 master-bin.000001 # Query # # use `test`; DELETE FROM t2 WHERE id = 2 # Result on master SELECT * FROM t1; id 3 4 5 6 7 8 9 10 SELECT * FROM t2; id # Result on slave SELECT * FROM t1; id 3 4 5 6 7 8 9 10 SELECT * FROM t2; id DROP TRIGGER tr1; CALL p2(); show binlog events from <binlog_start>; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Intvar # # INSERT_ID=11 master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (NULL) master-bin.000001 # Query # # use `test`; DELETE FROM t1 WHERE id = f1(3) master-bin.000001 # Query # # use `test`; DELETE FROM t1 WHERE id = f1(4) master-bin.000001 # Query # # use `test`; DELETE FROM t2 WHERE id = 3 master-bin.000001 # Query # # use `test`; DELETE FROM t2 WHERE id = 4 # Result on master SELECT * FROM t1; id 5 6 7 8 9 10 11 SELECT * FROM t2; id 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # Result on slave SELECT * FROM t1; id 5 6 7 8 9 10 11 SELECT * FROM t2; id 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 DROP TABLE IF EXISTS t1, t2; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; DROP FUNCTION IF EXISTS f1; DROP TRIGGER IF EXISTS tr1; Warnings: Note 1360 Trigger does not exist
mysql-test/t/rpl_auto_increment_bug33029.test 0 → 100644 +107 −0 Original line number Diff line number Diff line # BUG#33029 5.0 to 5.1 replication fails on dup key when inserting # using a trig in SP # For all 5.0 up to 5.0.58 exclusive, and 5.1 up to 5.1.12 exclusive, # if one statement in a SP generated AUTO_INCREMENT value by the top # statement, all statements after it would be considered generated # AUTO_INCREMENT value by the top statement, and a erroneous INSERT_ID # value might be associated with these statement, which could cause # duplicate entry error and stop the slave. source include/master-slave.inc; --disable_warnings DROP TABLE IF EXISTS t1, t2; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; DROP TRIGGER IF EXISTS tr1; DROP FUNCTION IF EXISTS f1; --enable_warnings CREATE TABLE t1 (id INT AUTO_INCREMENT PRIMARY KEY); CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY); delimiter //; CREATE PROCEDURE p1() BEGIN DECLARE ins_count INT DEFAULT 10; WHILE ins_count > 0 DO INSERT INTO t1 VALUES (NULL); SET ins_count = ins_count - 1; END WHILE; DELETE FROM t1 WHERE id = 1; DELETE FROM t1 WHERE id = 2; DELETE FROM t2 WHERE id = 1; DELETE FROM t2 WHERE id = 2; END// CREATE PROCEDURE p2() BEGIN INSERT INTO t1 VALUES (NULL); DELETE FROM t1 WHERE id = f1(3); DELETE FROM t1 WHERE id = f1(4); DELETE FROM t2 WHERE id = 3; DELETE FROM t2 WHERE id = 4; END// CREATE TRIGGER tr1 BEFORE DELETE ON t1 FOR EACH ROW BEGIN INSERT INTO t2 VALUES (NULL); END// CREATE FUNCTION f1 (i int) RETURNS int BEGIN INSERT INTO t2 VALUES (NULL); RETURN i; END// delimiter ;// # the $binlog_start will be used by the show_binlog_events.inc, so # that we can skip binlog events we don't care let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); CALL p1(); source include/show_binlog_events.inc; echo # Result on master; SELECT * FROM t1; SELECT * FROM t2; sync_slave_with_master; echo # Result on slave; SELECT * FROM t1; SELECT * FROM t2; connection master; DROP TRIGGER tr1; # the $binlog_start will be used by the show_binlog_events.inc, so # that we can skip binlog events we don't care let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); CALL p2(); source include/show_binlog_events.inc; echo # Result on master; SELECT * FROM t1; SELECT * FROM t2; sync_slave_with_master; echo # Result on slave; SELECT * FROM t1; SELECT * FROM t2; # clean up connection master; DROP TABLE IF EXISTS t1, t2; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; DROP FUNCTION IF EXISTS f1; DROP TRIGGER IF EXISTS tr1; sync_slave_with_master;
sql/sql_class.cc +7 −0 Original line number Diff line number Diff line Loading @@ -622,6 +622,13 @@ void THD::cleanup_after_query() { clear_next_insert_id= 0; next_insert_id= 0; /* BUG#33029, if one statement in a SP set this member to 1, all statment after this statement in the SP would be considered used INSERT_ID value, reset this member after each query to fix this. */ insert_id_used= 0; } /* Reset rand_used so that detection of calls to rand() will save random Loading