135 lines
4.5 KiB
Plaintext
135 lines
4.5 KiB
Plaintext
--source include/have_debug.inc
|
|
--source include/have_debug_sync.inc
|
|
--source include/have_myisam.inc
|
|
|
|
# Some parts of the test require enabled binary log.
|
|
--source include/have_log_bin.inc
|
|
|
|
--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 # 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=InnoDB;
|
|
CREATE TABLE t2 (j INT) ENGINE=InnoDB;
|
|
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 # 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=InnoDB;
|
|
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;
|