Loading mysql-test/r/innodb-big.result +66 −0 Original line number Diff line number Diff line Loading @@ -32,3 +32,69 @@ select sum(id) from t3; sum(id) 2199024304128 drop table t1,t2,t3,t4; CREATE TABLE t1 (f1 int NOT NULL) ENGINE=InnoDB; CREATE TABLE t2 (f2 int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; CREATE TRIGGER t1_bi before INSERT ON t1 FOR EACH ROW BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @a:= 'deadlock'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; INSERT INTO t2 (f2) VALUES (1); DELETE FROM t2 WHERE f2 = 1; END;| CREATE PROCEDURE proc24989() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @b:= 'deadlock'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; INSERT INTO t2 (f2) VALUES (1); DELETE FROM t2 WHERE f2 = 1; END;| create procedure proc24989_2() deterministic begin declare continue handler for sqlexception select 'Outer handler' as 'exception'; insert into t1 values(1); select "continued"; end| start transaction; insert into t1 values(1); start transaction; insert into t2 values(123); insert into t1 values(1); insert into t1 values(1); ERROR 40001: Deadlock found when trying to get lock; try restarting transaction select @a; @a NULL select * from t2; f2 commit; start transaction; insert into t1 values(1); start transaction; insert into t2 values(123); call proc24989(); insert into t1 values(1); select @a,@b; @a @b exception deadlock select * from t2; f2 commit; start transaction; insert into t1 values(1); start transaction; insert into t2 values(123); call proc24989_2(); insert into t1 values(1); commit; exception Outer handler continued continued select * from t2; f2 drop procedure proc24989; drop procedure proc24989_2; drop table t1,t2; mysql-test/t/bigint.test +1 −1 Original line number Diff line number Diff line Loading @@ -307,6 +307,6 @@ select -(9223372036854775808); select -((9223372036854775808)); select -(-(9223372036854775808)); --disable_metadata --endble_ps_protocol --enable_ps_protocol select --9223372036854775808, ---9223372036854775808, ----9223372036854775808; select -(-9223372036854775808), -(-(-9223372036854775808)); mysql-test/t/innodb-big.test +106 −0 Original line number Diff line number Diff line Loading @@ -44,3 +44,109 @@ INSERT INTO t3 SELECT concat(id),id from t2 ORDER BY -id; INSERT INTO t4 SELECT * from t3 ORDER BY concat(a); select sum(id) from t3; drop table t1,t2,t3,t4; # # Bug#24989: The DEADLOCK error is improperly handled by InnoDB. # CREATE TABLE t1 (f1 int NOT NULL) ENGINE=InnoDB; CREATE TABLE t2 (f2 int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; DELIMITER |; CREATE TRIGGER t1_bi before INSERT ON t1 FOR EACH ROW BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @a:= 'deadlock'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; INSERT INTO t2 (f2) VALUES (1); DELETE FROM t2 WHERE f2 = 1; END;| CREATE PROCEDURE proc24989() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @b:= 'deadlock'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; INSERT INTO t2 (f2) VALUES (1); DELETE FROM t2 WHERE f2 = 1; END;| create procedure proc24989_2() deterministic begin declare continue handler for sqlexception select 'Outer handler' as 'exception'; insert into t1 values(1); select "continued"; end| DELIMITER ;| connect (con1,localhost,root,,); connect (con2,localhost,root,,); connection con1; start transaction; insert into t1 values(1); connection con2; start transaction; insert into t2 values(123); send insert into t1 values(1); connection con1; --sleep 1 insert into t1 values(1); connection con2; --error 1213 reap; select @a; # check that the whole transaction was rolled back select * from t2; connection con1; commit; start transaction; insert into t1 values(1); connection con2; start transaction; insert into t2 values(123); send call proc24989(); connection con1; --sleep 1 insert into t1 values(1); connection con2; reap; select @a,@b; # check that the whole transaction was rolled back select * from t2; connection con1; commit; start transaction; insert into t1 values(1); connection con2; start transaction; insert into t2 values(123); send call proc24989_2(); connection con1; --sleep 1 insert into t1 values(1); commit; connection con2; reap; # check that the whole transaction was rolled back select * from t2; disconnect con1; disconnect con2; connection default; drop procedure proc24989; drop procedure proc24989_2; drop table t1,t2; sql/ha_innodb.cc +3 −9 Original line number Diff line number Diff line Loading @@ -455,9 +455,7 @@ convert_error_code_to_mysql( tell it also to MySQL so that MySQL knows to empty the cached binlog for this transaction */ if (thd) { ha_rollback(thd); } mark_transaction_to_rollback(thd, TRUE); return(HA_ERR_LOCK_DEADLOCK); Loading @@ -467,9 +465,7 @@ convert_error_code_to_mysql( latest SQL statement in a lock wait timeout. Previously, we rolled back the whole transaction. */ if (thd && row_rollback_on_timeout) { ha_rollback(thd); } mark_transaction_to_rollback(thd, row_rollback_on_timeout); return(HA_ERR_LOCK_WAIT_TIMEOUT); Loading Loading @@ -521,9 +517,7 @@ convert_error_code_to_mysql( tell it also to MySQL so that MySQL knows to empty the cached binlog for this transaction */ if (thd) { ha_rollback(thd); } mark_transaction_to_rollback(thd, TRUE); return(HA_ERR_LOCK_TABLE_FULL); } else { Loading sql/handler.cc +5 −0 Original line number Diff line number Diff line Loading @@ -821,6 +821,9 @@ int ha_rollback_trans(THD *thd, bool all) } } #endif /* USING_TRANSACTIONS */ if (all) thd->transaction_rollback_request= FALSE; /* If a non-transactional table was updated, warn; don't warn if this is a slave thread (because when a slave thread executes a ROLLBACK, it has Loading Loading @@ -858,6 +861,8 @@ int ha_autocommit_or_rollback(THD *thd, int error) if (ha_commit_stmt(thd)) error=1; } else if (thd->transaction_rollback_request && !thd->in_sub_stmt) (void) ha_rollback(thd); else (void) ha_rollback_stmt(thd); Loading Loading
mysql-test/r/innodb-big.result +66 −0 Original line number Diff line number Diff line Loading @@ -32,3 +32,69 @@ select sum(id) from t3; sum(id) 2199024304128 drop table t1,t2,t3,t4; CREATE TABLE t1 (f1 int NOT NULL) ENGINE=InnoDB; CREATE TABLE t2 (f2 int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; CREATE TRIGGER t1_bi before INSERT ON t1 FOR EACH ROW BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @a:= 'deadlock'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; INSERT INTO t2 (f2) VALUES (1); DELETE FROM t2 WHERE f2 = 1; END;| CREATE PROCEDURE proc24989() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @b:= 'deadlock'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; INSERT INTO t2 (f2) VALUES (1); DELETE FROM t2 WHERE f2 = 1; END;| create procedure proc24989_2() deterministic begin declare continue handler for sqlexception select 'Outer handler' as 'exception'; insert into t1 values(1); select "continued"; end| start transaction; insert into t1 values(1); start transaction; insert into t2 values(123); insert into t1 values(1); insert into t1 values(1); ERROR 40001: Deadlock found when trying to get lock; try restarting transaction select @a; @a NULL select * from t2; f2 commit; start transaction; insert into t1 values(1); start transaction; insert into t2 values(123); call proc24989(); insert into t1 values(1); select @a,@b; @a @b exception deadlock select * from t2; f2 commit; start transaction; insert into t1 values(1); start transaction; insert into t2 values(123); call proc24989_2(); insert into t1 values(1); commit; exception Outer handler continued continued select * from t2; f2 drop procedure proc24989; drop procedure proc24989_2; drop table t1,t2;
mysql-test/t/bigint.test +1 −1 Original line number Diff line number Diff line Loading @@ -307,6 +307,6 @@ select -(9223372036854775808); select -((9223372036854775808)); select -(-(9223372036854775808)); --disable_metadata --endble_ps_protocol --enable_ps_protocol select --9223372036854775808, ---9223372036854775808, ----9223372036854775808; select -(-9223372036854775808), -(-(-9223372036854775808));
mysql-test/t/innodb-big.test +106 −0 Original line number Diff line number Diff line Loading @@ -44,3 +44,109 @@ INSERT INTO t3 SELECT concat(id),id from t2 ORDER BY -id; INSERT INTO t4 SELECT * from t3 ORDER BY concat(a); select sum(id) from t3; drop table t1,t2,t3,t4; # # Bug#24989: The DEADLOCK error is improperly handled by InnoDB. # CREATE TABLE t1 (f1 int NOT NULL) ENGINE=InnoDB; CREATE TABLE t2 (f2 int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; DELIMITER |; CREATE TRIGGER t1_bi before INSERT ON t1 FOR EACH ROW BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @a:= 'deadlock'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; INSERT INTO t2 (f2) VALUES (1); DELETE FROM t2 WHERE f2 = 1; END;| CREATE PROCEDURE proc24989() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @b:= 'deadlock'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; INSERT INTO t2 (f2) VALUES (1); DELETE FROM t2 WHERE f2 = 1; END;| create procedure proc24989_2() deterministic begin declare continue handler for sqlexception select 'Outer handler' as 'exception'; insert into t1 values(1); select "continued"; end| DELIMITER ;| connect (con1,localhost,root,,); connect (con2,localhost,root,,); connection con1; start transaction; insert into t1 values(1); connection con2; start transaction; insert into t2 values(123); send insert into t1 values(1); connection con1; --sleep 1 insert into t1 values(1); connection con2; --error 1213 reap; select @a; # check that the whole transaction was rolled back select * from t2; connection con1; commit; start transaction; insert into t1 values(1); connection con2; start transaction; insert into t2 values(123); send call proc24989(); connection con1; --sleep 1 insert into t1 values(1); connection con2; reap; select @a,@b; # check that the whole transaction was rolled back select * from t2; connection con1; commit; start transaction; insert into t1 values(1); connection con2; start transaction; insert into t2 values(123); send call proc24989_2(); connection con1; --sleep 1 insert into t1 values(1); commit; connection con2; reap; # check that the whole transaction was rolled back select * from t2; disconnect con1; disconnect con2; connection default; drop procedure proc24989; drop procedure proc24989_2; drop table t1,t2;
sql/ha_innodb.cc +3 −9 Original line number Diff line number Diff line Loading @@ -455,9 +455,7 @@ convert_error_code_to_mysql( tell it also to MySQL so that MySQL knows to empty the cached binlog for this transaction */ if (thd) { ha_rollback(thd); } mark_transaction_to_rollback(thd, TRUE); return(HA_ERR_LOCK_DEADLOCK); Loading @@ -467,9 +465,7 @@ convert_error_code_to_mysql( latest SQL statement in a lock wait timeout. Previously, we rolled back the whole transaction. */ if (thd && row_rollback_on_timeout) { ha_rollback(thd); } mark_transaction_to_rollback(thd, row_rollback_on_timeout); return(HA_ERR_LOCK_WAIT_TIMEOUT); Loading Loading @@ -521,9 +517,7 @@ convert_error_code_to_mysql( tell it also to MySQL so that MySQL knows to empty the cached binlog for this transaction */ if (thd) { ha_rollback(thd); } mark_transaction_to_rollback(thd, TRUE); return(HA_ERR_LOCK_TABLE_FULL); } else { Loading
sql/handler.cc +5 −0 Original line number Diff line number Diff line Loading @@ -821,6 +821,9 @@ int ha_rollback_trans(THD *thd, bool all) } } #endif /* USING_TRANSACTIONS */ if (all) thd->transaction_rollback_request= FALSE; /* If a non-transactional table was updated, warn; don't warn if this is a slave thread (because when a slave thread executes a ROLLBACK, it has Loading Loading @@ -858,6 +861,8 @@ int ha_autocommit_or_rollback(THD *thd, int error) if (ha_commit_stmt(thd)) error=1; } else if (thd->transaction_rollback_request && !thd->in_sub_stmt) (void) ha_rollback(thd); else (void) ha_rollback_stmt(thd); Loading