--source include/have_debug.inc --source include/have_debug_sync.inc # Some parts of the test require enabled binary log. --source include/have_log_bin.inc --echo # --echo # Bug#22653180:ASSERT DD::CACHE::SHARED_MULTI_MAP:: --echo # PUT(CONST K*, CONST T*, DD::CACHE::CACHE --echo # CREATE TABLE t1(i int); --echo # Force rename_table to fail after update has been applied to dd cache SET SESSION debug="+d,abort_rename_after_update"; --echo # rename table will fail with dummy error --error ER_ERROR_ON_WRITE RENAME TABLE t1 to t2; SET SESSION debug="-d,abort_rename_after_update"; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Part of test coverage for WL#9826 "Allow RENAME TABLES under --echo # LOCK TABLES" which needs debug build and debug_sync facility. --echo # --echo # The main part of coverage for this WL resides in rename.test. --echo # This file only contains subtests which require debug/debug_sync --echo # facilities, hence their odd numbering. --enable_connect_log SET @old_lock_wait_timeout= @@lock_wait_timeout; connect (con1, localhost, root,,); SET @old_lock_wait_timeout= @@lock_wait_timeout; connection default; --echo # --echo # 1) Requirements on table locking for tables renamed and --echo # target table names. --echo # --echo # --echo # 1.2) Locking of target table. CREATE TABLE t1 (i INT); CREATE TABLE t2 (j INT); --echo # RENAME TABLE under LOCK TABLES acquires X metadata --echo # lock on target table name. connection con1; --echo # Ensure that table is cached in Table and Table Definition Caches. SELECT * FROM t1; SET DEBUG_SYNC='open_tables_after_open_and_process_table SIGNAL opened WAIT_FOR go'; --send SHOW CREATE TABLE t1 connection default; --echo # Wait until SHOW CREATE TABLE acquires SH MDL on t1 and --echo # starts waiting. SET DEBUG_SYNC='now WAIT_FOR opened'; LOCK TABLES t2 WRITE; --echo # RENAME TABLE fails due to lock timeout since it tries --echo # to acquire X metadata lock on t1, on which SH metadata --echo # lock is held in con1. SET @@lock_wait_timeout= 1; --error ER_LOCK_WAIT_TIMEOUT RENAME TABLE t2 TO t1; SET @@lock_wait_timeout= @old_lock_wait_timeout; UNLOCK TABLES; --echo # --echo # 2) Failure to acquire/upgrade locks on tables involved. --echo # --echo # Failure to upgrade metadata lock on source table to X mode. --echo # (note that con1 still holds SH lock on it). LOCK TABLE t1 WRITE; SET @@lock_wait_timeout= 1; --error ER_LOCK_WAIT_TIMEOUT RENAME TABLE t1 TO t3; SET @@lock_wait_timeout= @old_lock_wait_timeout; UNLOCK TABLES; --echo # --echo # Failure to acquire X metadata lock on target table name. LOCK TABLES t2 WRITE; SET @@lock_wait_timeout= 1; --error ER_LOCK_WAIT_TIMEOUT RENAME TABLE t2 TO t1; UNLOCK TABLES; --echo # Unblock and reap SHOW CREATE TABLE. SET DEBUG_SYNC='now SIGNAL go'; connection con1; --reap connection default; SET DEBUG_SYNC='RESET'; DROP TABLES t1, t2; --echo # --echo # 4) Effects of failed RENAME TABLES on set of locked tables and --echo # metadata locks held. --echo # --echo # 4.1) Atomic RENAME TABLES which fails at late stage should be --echo # fully rolled back. CREATE TABLE t1 (i INT) ENGINE=XENGINE; CREATE TABLE t2 (j INT) ENGINE=XENGINE; CREATE TABLE t0 (m INT) ENGINE=MyISAM; --echo # --echo # 4.3) Non-atomic RENAME TABLES which fails at late stage and --echo # is NOT fully reverted. Tables involved are removed --echo # from the set of locked tables. Metadata locks on both --echo # old and new table names are kept. LOCK TABLES t1 WRITE, t2 WRITE, t0 WRITE; SET @@debug='+d,injecting_fault_writing'; --replace_regex /(errno: .*)/(errno: #)/ --error ER_ERROR_ON_WRITE RENAME TABLES t0 TO t00, t1 TO t01; SET @@debug='-d,injecting_fault_writing'; --echo # Tables are not available under both old and new names. --error ER_TABLE_NOT_LOCKED SELECT * FROM t0; --error ER_TABLE_NOT_LOCKED SELECT * FROM t00; --error ER_TABLE_NOT_LOCKED SELECT * FROM t1; --error ER_TABLE_NOT_LOCKED SELECT * FROM t01; --echo # Untouched table is still available. SELECT * FROM t2; connection con1; --echo # Access by old and new names from other connections should be --echo # blocked. # Disable prepared statements, since for them the below check # works differently. The prepare phase of statements execution # acquires weaker S metadata lock (which do not conflict with # SNRW locks held by LOCK TABLE WRITE) and manages to discover # that tables with old name don't exist. --disable_ps_protocol SET @@lock_wait_timeout= 1; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t0; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t00; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t1; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t01; --echo # And access to untouched table too. --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t2; SET @@lock_wait_timeout= @old_lock_wait_timeout; --enable_ps_protocol connection default; UNLOCK TABLES; DROP TABLES t00, t01, t2; --echo # --echo # 5) RENAME TABLES under LOCK TABLES and views. --echo # --echo # 5.1) Requirements on locking is similar to tables. CREATE TABLE t1 (i INT); CREATE TABLE t2 (j INT); CREATE VIEW v1 AS SELECT * FROM t1; CREATE VIEW v2 AS SELECT * FROM t2; --echo # --echo # RENAME TABLE on view under LOCK TABLES acquires X metadata --echo # lock on target name. connection con1; SET DEBUG_SYNC='open_tables_after_open_and_process_table SIGNAL opened WAIT_FOR go'; --send SHOW CREATE VIEW v2 connection default; --echo # Wait until SHOW CREATE VIEW acquires SH MDL on v2 and --echo # starts waiting. SET DEBUG_SYNC='now WAIT_FOR opened'; LOCK TABLES v1 WRITE; --echo # RENAME TABLE fails due to lock timeout since it tries --echo # to acquire X metadata lock on v2, on which SH metadata --echo # lock is held in con1. SET @@lock_wait_timeout= 1; --error ER_LOCK_WAIT_TIMEOUT RENAME TABLE v1 TO v2; SET @@lock_wait_timeout= @old_lock_wait_timeout; UNLOCK TABLES; --echo # Unblock and reap SHOW CREATE VIEW. SET DEBUG_SYNC='now SIGNAL go'; connection con1; --reap connection default; SET DEBUG_SYNC='RESET'; DROP VIEW v1; DROP VIEW v2; DROP TABLES t1, t2; --echo # --echo # 7) RENAME TABLES under LOCK TABLES which moves tables --echo # between schemas. --echo # --echo # --echo # 7.4) Non-atomic RENAME TABLES which moves table to different chema, --echo # fails at late stage and is NOT fully reverted. Tables involved --echo # are removed from the set of locked tables. Metadata locks on --echo # old, new table name and new schema are kept. CREATE TABLE t1 (i INT) ENGINE=XENGINE; CREATE TABLE t0 (l INT) ENGINE=MyISAM; CREATE DATABASE mysqltest; LOCK TABLES t0 WRITE, t1 WRITE; SET @@debug='+d,injecting_fault_writing'; --replace_regex /(errno: .*)/(errno: #)/ --error ER_ERROR_ON_WRITE RENAME TABLES t0 TO mysqltest.t0, t1 TO t01; SET @@debug='-d,injecting_fault_writing'; --echo # Tables are not available under both old and new names. --error ER_TABLE_NOT_LOCKED SELECT * FROM t0; --error ER_TABLE_NOT_LOCKED SELECT * FROM mysqltest.t0; --error ER_TABLE_NOT_LOCKED SELECT * FROM t1; --error ER_TABLE_NOT_LOCKED SELECT * FROM t01; connection con1; --echo # Access by old and new names from other connections should be --echo # blocked. # Disable prepared statements, since for them the below check # works differently. The prepare phase of statements execution # acquires weaker S metadata lock (which do not conflict with # SNRW locks held by LOCK TABLE WRITE) and manages to discover # that tables with old name don't exist. --disable_ps_protocol SET @@lock_wait_timeout= 1; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t0; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM mysqltest.t0; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t1; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t01; --echo # New schema is IX locked. --error ER_LOCK_WAIT_TIMEOUT ALTER DATABASE mysqltest CHARACTER SET latin1; SET @@lock_wait_timeout= @old_lock_wait_timeout; --enable_ps_protocol connection default; UNLOCK TABLES; DROP TABLES t01; DROP DATABASE mysqltest; --echo # Clean-up. connection con1; disconnect con1; --source include/wait_until_disconnected.inc connection default; --disable_connect_log --source suite/xengine/include/check_xengine_log_error.inc