# # Test file for InnoDB tests that require the debug sync facility # --source include/have_innodb.inc --source include/have_debug.inc --source include/have_debug_sync.inc # Save the initial number of concurrent sessions. --source include/count_sessions.inc --echo # --echo # Bug 42074 concurrent optimize table and --echo # alter table = Assertion failed: thd->is_error() --echo # --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings --echo # Create InnoDB table CREATE TABLE t1 (id INT) engine=innodb; connect (con2, localhost, root); --echo # Connection 1 --echo # Start optimizing table connection default; SET DEBUG_SYNC='ha_admin_try_alter SIGNAL optimize_started WAIT_FOR table_altered'; --send OPTIMIZE TABLE t1 --echo # Connection 2 --echo # Change table to engine=memory connection con2; SET DEBUG_SYNC='now WAIT_FOR optimize_started'; ALTER TABLE t1 engine=memory; SET DEBUG_SYNC='now SIGNAL table_altered'; --echo # Connection 1 --echo # Complete optimization connection default; --reap disconnect con2; DROP TABLE t1; SET DEBUG_SYNC='RESET'; --echo # --echo # Bug#47459 Assertion in Diagnostics_area::set_eof_status on --echo # OPTIMIZE TABLE --echo # --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings connect (con1, localhost, root); connection default; CREATE TABLE t1(a INT) ENGINE= InnoDB; --echo # Connection con1 connection con1; SET DEBUG_SYNC= "ha_admin_open_ltable SIGNAL opening WAIT_FOR dropped"; --echo # Sending: --send OPTIMIZE TABLE t1 --echo # Connection default connection default; SET DEBUG_SYNC= "now WAIT_FOR opening"; DROP TABLE t1; SET DEBUG_SYNC= "now SIGNAL dropped"; --echo # Connection con1 connection con1; --echo # Reaping: OPTIMIZE TABLE t1 --reap --echo # Connection default connection default; disconnect con1; SET DEBUG_SYNC= "RESET"; --echo # --echo # Bug#53757 assert in mysql_truncate_by_delete --echo # --disable_warnings DROP TABLE IF EXISTS t1, t2; --enable_warnings CREATE TABLE t1(a INT) Engine=InnoDB; CREATE TABLE t2(id INT); INSERT INTO t1 VALUES (1), (2); connect (con1, localhost, root); INSERT INTO t2 VALUES(connection_id()); SET DEBUG_SYNC= "open_and_process_table SIGNAL opening WAIT_FOR killed"; --echo # Sending: (not reaped since connection is killed later) --send TRUNCATE t1 connection default; SET DEBUG_SYNC= "now WAIT_FOR opening"; SELECT ((@id := id) - id) FROM t2; KILL @id; SET DEBUG_SYNC= "now SIGNAL killed"; DROP TABLE t1, t2; disconnect con1; --source include/wait_until_count_sessions.inc SET DEBUG_SYNC= "RESET"; --echo # --echo # Bug#58933 Assertion `thd- >is_error()' fails on shutdown with ongoing --echo # OPTIMIZE TABLE --echo # --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings CREATE TABLE t1 (a INT) ENGINE=InnoDB; INSERT INTO t1 VALUES (1), (2); --echo # Connection con1 connect (con1,localhost,root); let $ID= `SELECT connection_id()`; SET DEBUG_SYNC= 'ha_admin_open_ltable SIGNAL waiting WAIT_FOR killed'; --echo # Sending: --send OPTIMIZE TABLE t1 --echo # Connection default connection default; SET DEBUG_SYNC= 'now WAIT_FOR waiting'; --replace_result $ID ID eval KILL QUERY $ID; SET DEBUG_SYNC= 'now SIGNAL killed'; --echo # Connection con1 connection con1; --echo # Reaping: OPTIMIZE TABLE t1 --reap --echo # Connection default connection default; DROP TABLE t1; SET DEBUG_SYNC= 'RESET'; disconnect con1; --echo # --echo # Bug#42230 during add index, cannot do queries on storage engines --echo # that implement add_index --echo # --disable_warnings DROP DATABASE IF EXISTS db1; DROP TABLE IF EXISTS t1; --enable_warnings connect(con1,localhost,root); connect(con2,localhost,root); --echo # Test 1: Secondary index, should not block reads (original test case). --echo # Connection default connection default; CREATE DATABASE db1; CREATE TABLE db1.t1(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, value INT) engine=innodb; INSERT INTO db1.t1(value) VALUES (1), (2); SET DEBUG_SYNC= "alter_table_manage_keys SIGNAL manage WAIT_FOR query"; --echo # Sending: --send ALTER TABLE db1.t1 ADD INDEX(value) --echo # Connection con1 connection con1; SET DEBUG_SYNC= "now WAIT_FOR manage"; # Neither of these two statements should be blocked USE db1; SELECT * FROM t1; SET DEBUG_SYNC= "now SIGNAL query"; --echo # Connection default connection default; --echo # Reaping: ALTER TABLE db1.t1 ADD INDEX(value) --reap DROP DATABASE db1; --echo # Test 2: Primary index (implicit), should block reads. CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL) engine=innodb; SET DEBUG_SYNC= "alter_table_manage_keys SIGNAL manage WAIT_FOR query"; --echo # Sending: --send ALTER TABLE t1 ADD UNIQUE INDEX(a) --echo # Connection con1 connection con1; SET DEBUG_SYNC= "now WAIT_FOR manage"; USE test; --echo # Sending: --send SELECT * FROM t1 --echo # Connection con2 connection con2; --echo # Waiting for SELECT to be blocked by the metadata lock on t1 let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist WHERE state= 'Waiting for table metadata lock' AND info='SELECT * FROM t1'; --source include/wait_condition.inc SET DEBUG_SYNC= "now SIGNAL query"; --echo # Connection default connection default; --echo # Reaping: ALTER TABLE t1 ADD UNIQUE INDEX(a) --reap --echo # Connection con1 connection con1; --echo # Reaping: SELECT * FROM t1 --reap --echo # Test 3: Primary index (explicit), should block reads. --echo # Connection default connection default; ALTER TABLE t1 DROP INDEX a; SET DEBUG_SYNC= "alter_table_manage_keys SIGNAL manage WAIT_FOR query"; --echo # Sending: --send ALTER TABLE t1 ADD PRIMARY KEY (a) --echo # Connection con1 connection con1; SET DEBUG_SYNC= "now WAIT_FOR manage"; --echo # Sending: --send SELECT * FROM t1 --echo # Connection con2 connection con2; --echo # Waiting for SELECT to be blocked by the metadata lock on t1 let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist WHERE state= 'Waiting for table metadata lock' AND info='SELECT * FROM t1'; --source include/wait_condition.inc SET DEBUG_SYNC= "now SIGNAL query"; --echo # Connection default connection default; --echo # Reaping: ALTER TABLE t1 ADD PRIMARY KEY (a) --reap --echo # Connection con1 connection con1; --echo # Reaping: SELECT * FROM t1 --reap --echo # Test 4: Secondary unique index, should not block reads. --echo # Connection default connection default; SET DEBUG_SYNC= "alter_table_manage_keys SIGNAL manage WAIT_FOR query"; --echo # Sending: --send ALTER TABLE t1 ADD UNIQUE (b) --echo # Connection con1 connection con1; SET DEBUG_SYNC= "now WAIT_FOR manage"; SELECT * FROM t1; SET DEBUG_SYNC= "now SIGNAL query"; --echo # Connection default connection default; --echo # Reaping: ALTER TABLE t1 ADD UNIQUE (b) --reap disconnect con1; disconnect con2; SET DEBUG_SYNC= "RESET"; DROP TABLE t1; --echo # --echo # Bug#11853126 RE-ENABLE CONCURRENT READS WHILE CREATING SECONDARY INDEX --echo # IN INNODB --echo # --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL) engine=innodb; INSERT INTO t1 VALUES (1, 12345), (2, 23456); --echo # Connection con1 --connect (con1,localhost,root) SET SESSION debug_dbug= "+d,alter_table_rollback_new_index"; --error ER_UNKNOWN_ERROR ALTER TABLE t1 ADD PRIMARY KEY(a); SELECT * FROM t1; --echo # Connection default --connection default SELECT * FROM t1; DROP TABLE t1; disconnect con1; # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc