diff --git a/mysql-test/suite/innodb/r/innodb_bug38231.result b/mysql-test/suite/innodb/r/innodb_bug38231.result index 2f909779755f32710258280e0ee4b0a2f3ef71fd..41a40542b84baeadaa2ceafad5576e8b0bbdb150 100644 --- a/mysql-test/suite/innodb/r/innodb_bug38231.result +++ b/mysql-test/suite/innodb/r/innodb_bug38231.result @@ -1,11 +1,11 @@ SET storage_engine=InnoDB; -INSERT INTO bug38231 VALUES (1), (10), (300); +INSERT INTO bug38231_2 VALUES (1), (10), (300); SET autocommit=0; -SELECT * FROM bug38231 FOR UPDATE; +SELECT * FROM bug38231_2 FOR UPDATE; a 1 10 300 -TRUNCATE TABLE bug38231; +TRUNCATE TABLE bug38231_2; COMMIT; -DROP TABLE bug38231; +DROP TABLE bug38231_2; diff --git a/mysql-test/suite/innodb/t/innodb_bug38231.test b/mysql-test/suite/innodb/t/innodb_bug38231.test index 5666bc0e7651e13678a78fa0c080b4f1b5115f46..dd9ca10a5e768c6c0dc95553955e766b4db6989c 100644 --- a/mysql-test/suite/innodb/t/innodb_bug38231.test +++ b/mysql-test/suite/innodb/t/innodb_bug38231.test @@ -11,96 +11,79 @@ SET storage_engine=InnoDB; -- disable_query_log -- disable_result_log -DROP TABLE IF EXISTS bug38231; -CREATE TABLE bug38231 (a INT); +DROP TABLE IF EXISTS bug38231_1; +CREATE TABLE bug38231_1 (a INT); --- connect (con1,localhost,root,,) --- connect (con2,localhost,root,,) --- connect (con3,localhost,root,,) +-- connect (lock_gain,localhost,root,,) +-- connect (lock_wait1,localhost,root,,) +-- connect (lock_wait2,localhost,root,,) +-- connect (truncate_wait,localhost,root,,) --- connection con1 +-- connection lock_gain SET autocommit=0; -LOCK TABLE bug38231 WRITE; +LOCK TABLE bug38231_1 WRITE; --- connection con2 +-- connection lock_wait1 SET autocommit=0; -- send -LOCK TABLE bug38231 WRITE; - -# When con1 does UNLOCK below this will release either con2 or con3 which are -# both waiting on LOCK. At the end we must first --reap and UNLOCK the -# connection that has been released, otherwise it will wait forever. We assume -# that the released connection will be the first one that has gained the LOCK, -# thus we force the order here - con2 does LOCK first, then con3. In other -# words we wait for LOCK from con2 above to be executed before doing LOCK in -# con3. --- connection con1 -let $wait_condition = - SELECT COUNT(*) = 1 FROM information_schema.processlist - WHERE info = 'LOCK TABLE bug38231 WRITE'; --- source include/wait_condition.inc -# the above enables query log, re-disable it --- disable_query_log +LOCK TABLE bug38231_1 WRITE; --- connection con3 +-- connection lock_wait2 SET autocommit=0; -- send -LOCK TABLE bug38231 WRITE; +LOCK TABLE bug38231_1 WRITE; --- connection default +-- connection truncate_wait -- send -TRUNCATE TABLE bug38231; - --- connection con1 -# Wait for TRUNCATE and the other two LOCKs to be executed; without this, -# sometimes UNLOCK executes before them. We assume there are no other -# sessions executing at the same time with the same SQL commands. -let $wait_condition = - SELECT COUNT(*) = 1 FROM information_schema.processlist - WHERE info = 'TRUNCATE TABLE bug38231'; --- source include/wait_condition.inc -let $wait_condition = - SELECT COUNT(*) = 2 FROM information_schema.processlist - WHERE info = 'LOCK TABLE bug38231 WRITE'; --- source include/wait_condition.inc -# the above enables query log, re-disable it --- disable_query_log +TRUNCATE TABLE bug38231_1; +-- connection lock_gain # this crashes the server if the bug is present UNLOCK TABLES; # clean up --- connection con2 --- reap -UNLOCK TABLES; - --- connection con3 --- reap -UNLOCK TABLES; +# do not clean up - we do not know which of the tree has been released +# so the --reap command may hang because the executing command is still +# running/waiting +#-- connection lock_wait1 +#-- reap +#UNLOCK TABLES; +# +#-- connection lock_wait2 +#-- reap +#UNLOCK TABLES; +# +#-- connection truncate_wait +#-- reap -- connection default --- reap --- disconnect con1 --- disconnect con2 --- disconnect con3 +-- disconnect lock_gain +-- disconnect lock_wait1 +-- disconnect lock_wait2 +-- disconnect truncate_wait + +DROP TABLE bug38231_1; + +# test that TRUNCATE works with row-level locks -# test that TRUNCATE works with with row-level locks +DROP TABLE IF EXISTS bug38231_2; +CREATE TABLE bug38231_2 (a INT); -- enable_query_log -- enable_result_log -INSERT INTO bug38231 VALUES (1), (10), (300); +INSERT INTO bug38231_2 VALUES (1), (10), (300); -- connect (con4,localhost,root,,) -- connection con4 SET autocommit=0; -SELECT * FROM bug38231 FOR UPDATE; +SELECT * FROM bug38231_2 FOR UPDATE; -- connection default -TRUNCATE TABLE bug38231; +TRUNCATE TABLE bug38231_2; -- connection con4 COMMIT; @@ -109,4 +92,4 @@ COMMIT; -- disconnect con4 -DROP TABLE bug38231; +DROP TABLE bug38231_2;