970 lines
35 KiB
Plaintext
970 lines
35 KiB
Plaintext
###########################################################
|
||
#
|
||
# WL#7957: MDL FOR TABLESPACES
|
||
# ============================
|
||
#
|
||
# We have the following tablespace DDL operations that acquire
|
||
# exclusive MDL locks on tablespaces:
|
||
#
|
||
# CREATE, ALTER and DROP TABLESPACE
|
||
#
|
||
# Then, we have the following non-tablespace related DDL
|
||
# operations that acquire intention exclusive locks on
|
||
# tablespaces:
|
||
#
|
||
# CREATE, ALTER, RENAME, TRUNCATE, LOCK, DROP TABLE
|
||
#
|
||
# and
|
||
#
|
||
# CREATE, DROP INDEX
|
||
#
|
||
# Below are test cases to verify that:
|
||
#
|
||
# 1. We can *not* run DDL statements manipulating the same
|
||
# tablespace concurrently.
|
||
# 2. We can run different DDL statements manipulating different
|
||
# tablespaces concurrently.
|
||
# 3. We can run different DDL statements accessing different
|
||
# tables in the same tablespace concurrently.
|
||
# 4. We can *not* run DDL statements on tables in a given
|
||
# tablespace concurrently with DDL operations on the
|
||
# same tablespace.
|
||
# 5. Verify that dropping a schema with tables in various
|
||
# tablespaces cannot run concurrentlty with dropping the
|
||
# tablespaces.
|
||
# 6. Verify that tablespace IX locks are not acquired in
|
||
# the context of 'FLUSH TABLE WITH READ LOCK',
|
||
# 'FLUSH TABLE FOR EXPORT' or 'LOCK TABLE READ'.
|
||
# 7. Verify that statements 'FLUSH TABLE WITH READ LOCK',
|
||
# 'FLUSH TABLE FOR EXPORT' and 'LOCK TABLE READ'
|
||
# can run concurrently with DDL operations on the
|
||
# tablespace.
|
||
# 8. Verify that tablespace IX locks are acquired in
|
||
# the context of 'LOCK TABLE WRITE'.
|
||
# 9. Verify that table DML (e.g. SELECT ... FOR UPDATE)
|
||
# can run concurrently with DDL on the tablespace.
|
||
# 10. Verify that MDL with prepared statements works as
|
||
# expected, using a prepared ALTER TABLE.
|
||
# 11. Verify that a non-empty tablespace cannot be dropped.
|
||
# 12. Verify that the tablespace name length is checked
|
||
# properly.
|
||
# 13. Extend test coverage:
|
||
# i) Run tablespace DDL within lock tables mode.
|
||
# ii) Run tablespace DDL when the global read lock
|
||
# is taken.
|
||
# iii) Provoke timeout for table DDL waiting for
|
||
# tablespace MDL IX lock.
|
||
# iv) Provoke timeout for tablespace DDL waiting for
|
||
# tablespace MDL X lock.
|
||
# 14. Verify that CREATE TABLE ... LIKE statements are
|
||
# handled correctly, both with and without source
|
||
# tables in general tablespaces.
|
||
# 15. Verify that explicit invalid tablespace names make
|
||
# table related DDL be rejected. Verify that implicit
|
||
# invalid tablespace names (e.g., present in an .FRM
|
||
# file from a previous MySQL version) are ignored.
|
||
# 16. Verify correct P_S information.
|
||
###########################################################
|
||
#
|
||
# Test setup: Create reusable connections:
|
||
#
|
||
connect con1, localhost, root;
|
||
connect con2, localhost, root;
|
||
connect con3, localhost, root;
|
||
connect con4, localhost, root;
|
||
connect con5, localhost, root;
|
||
###########################################################
|
||
# TC1. Verify that we can *not* run DDL statements manipulating
|
||
# the same tablespace concurrently.
|
||
#
|
||
#
|
||
# Start executing CREATE TABLESPACE, but wait after
|
||
# getting the MDL X lock on the tablespace name.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
#
|
||
# Start executing ALTER TABLESPACE.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_2.ibd';
|
||
#
|
||
# Verify that the ALTER TABLESPACE is waiting for an MDL
|
||
# X lock on the tablespace name (not logged). Then, signal
|
||
# con1 to make the CREATE TABLESPACE proceed.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
connection con2;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
connection default;
|
||
DROP TABLESPACE ts1;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC2. Verify that we can run different DDL statements
|
||
# manipulating different tablespaces concurrently.
|
||
#
|
||
#
|
||
# First, create a tablespace.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
#
|
||
# Start executing CREATE TABLESPACE, but wait after
|
||
# getting the MDL X lock on the tablespace name.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
CREATE TABLESPACE ts2 ADD DATAFILE 'ts2.ibd';
|
||
#
|
||
# Wait for con1 to get its X lock, then start executing
|
||
# ALTER TABLESPACE, but wait after getting the MDL X
|
||
# lock on the tablespace name.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con2
|
||
WAIT_FOR cont_con2';
|
||
ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_2.ibd';
|
||
#
|
||
# Verify that both con1 and con2 have X locks. This will be the
|
||
# case when con2 signals got_lock_con2.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con2';
|
||
#
|
||
# Then, signal both con1 to and con2 to make the execution
|
||
# proceed.
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con2';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
connection con2;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
connection default;
|
||
DROP TABLESPACE ts1;
|
||
DROP TABLESPACE ts2;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC3. Verify that we can run different DDL statements
|
||
# accessing different tables in the same tablespace
|
||
# concurrently.
|
||
# +
|
||
#
|
||
# TC4. Verify that we can *not* run DDL statements on tables
|
||
# in a given tablespace concurrently with DDL operations
|
||
# on the same tablespace.
|
||
#
|
||
#
|
||
# First, create tablespaces ts1 and ts2, and tables in the
|
||
# tablespaces.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLESPACE ts2 ADD DATAFILE 'ts2_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
CREATE TABLE t2 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
CREATE TABLE t3 (pk INTEGER PRIMARY KEY) TABLESPACE ts2;
|
||
#
|
||
# On connection con1, truncate the table in ts2, but wait after
|
||
# getting IX lock on the tablespace.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
TRUNCATE TABLE t3;
|
||
#
|
||
# On connection con2, alter table t1 to use ts2 instead of ts1,
|
||
# but wait after getting IX lock on the tablespace.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock_con2
|
||
WAIT_FOR cont_con2';
|
||
ALTER TABLE t1 TABLESPACE ts2;
|
||
#
|
||
# On connection con3, drop table t2, but wait after getting
|
||
# IX lock on the tablespace.
|
||
connection con3;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con2';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock_con3
|
||
WAIT_FOR cont_con3';
|
||
DROP TABLE t2;
|
||
#
|
||
# On connection con4, do DROP TABLESPACE ts1, which will
|
||
# wait for X lock on the tablepsace name.
|
||
connection con4;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con3';
|
||
SET DEBUG_SYNC= 'now SIGNAL waiting_con4';
|
||
DROP TABLESPACE ts1;
|
||
#
|
||
# On connection con5, do ALTER TABLESPACE ts2, which will
|
||
# wait for X lock on the tablespace name.
|
||
connection con5;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR waiting_con4';
|
||
ALTER TABLESPACE ts2 ADD DATAFILE 'ts2_2.ibd';
|
||
#
|
||
# Back on the default connection, we can start unwinding the
|
||
# situation. First, verify that we have two threads waiting for
|
||
# MDL locks on tablespaces.
|
||
connection default;
|
||
#
|
||
# Next, we signal con2 and con3 to continue. This will make
|
||
# all MDL IX locks on s1 be released, which again will make
|
||
# con4 finish. Thus, we verify that we have only one thread
|
||
# left waiting for MDL lcoks on tablespaces.
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con2';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con3';
|
||
#
|
||
# Finally, signal con1 to finish, which will make all MDL
|
||
# locks on s2 be released. This, in its turn, will make
|
||
# con5 be able to continue and finish. We verify this by
|
||
# checking that we have no threads left waiting for MDL
|
||
# locks on tablespaces.
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
connection con2;
|
||
connection con3;
|
||
connection con4;
|
||
connection con5;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
connection default;
|
||
DROP TABLE t1;
|
||
DROP TABLE t3;
|
||
DROP TABLESPACE ts2;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC5. Verify that dropping a schema with tables in various
|
||
# tablespaces cannot run concurrentlty with dropping the
|
||
# tablespaces.
|
||
#
|
||
#
|
||
# First create two tablespaces and a schema with two tables
|
||
# in it, but put the tables in different tablespaces.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd';
|
||
CREATE TABLESPACE ts2 ADD DATAFILE 'ts2.ibd';
|
||
CREATE SCHEMA s1;
|
||
CREATE TABLE s1.t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
CREATE TABLE s1.t2 (pk INTEGER PRIMARY KEY) TABLESPACE ts2;
|
||
#
|
||
# Next, on connection con1, issue a DROP SCHEMA but halt it
|
||
# after the tablespace locks have been acquired.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
DROP SCHEMA s1;
|
||
#
|
||
# Then, on connection con2 and con3, issue DROP TABLESPACE
|
||
# statements to drop the tablespaces of the two tables in
|
||
# the schema being dropped.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
SET DEBUG_SYNC= 'now SIGNAL go_con3';
|
||
DROP TABLESPACE ts1;
|
||
connection con3;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR go_con3';
|
||
DROP TABLESPACE ts2;
|
||
#
|
||
# Verify that the two DROP TABLESPACE statements are stuck
|
||
# waiting for MDL locks.
|
||
connection default;
|
||
#
|
||
# Signal connection con1 to make it continue dropping the
|
||
# schema.
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Verify that the DROP TABLESPACE statements eventually get
|
||
# the MDL locks.
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
connection con2;
|
||
connection con3;
|
||
connection default;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC6. Verify that tablespace IX locks are not acquired in
|
||
# the context of 'FLUSH TABLE WITH READ LOCK',
|
||
# 'FLUSH TABLE FOR EXPORT' or 'LOCK TABLE READ'.
|
||
#
|
||
# First, create tablespaces ts1, ts2 and ts3, and tables in the
|
||
# tablespaces.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLESPACE ts2 ADD DATAFILE 'ts2_1.ibd';
|
||
CREATE TABLESPACE ts3 ADD DATAFILE 'ts3_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
CREATE TABLE t2 (pk INTEGER PRIMARY KEY) TABLESPACE ts2;
|
||
CREATE TABLE t3 (pk INTEGER PRIMARY KEY) TABLESPACE ts3;
|
||
#
|
||
# Set a trap in the sync point after acquiring tablespace IX
|
||
# locks, and execute FLUSH TABLE WITH READ LOCK.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table HIT_LIMIT 1';
|
||
FLUSH TABLE t1 WITH READ LOCK;
|
||
#
|
||
# Set a trap in the sync point after acquiring tablespace IX
|
||
# locks, and execute FLUSH TABLE FOR EXPORT.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table HIT_LIMIT 1';
|
||
FLUSH TABLE t2 FOR EXPORT;
|
||
#
|
||
# Set a trap in the sync point after acquiring tablespace IX
|
||
# locks, and execute LOCK TABLE READ.
|
||
connection con3;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table HIT_LIMIT 1';
|
||
LOCK TABLE t3 READ;
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
Warnings:
|
||
Warning 1235 InnoDB: This version of MySQL doesn't yet support 'FLUSH TABLES FOR EXPORT on table `test`.`t1` in a general tablespace.'
|
||
UNLOCK TABLES;
|
||
connection con2;
|
||
Warnings:
|
||
Warning 1235 InnoDB: This version of MySQL doesn't yet support 'FLUSH TABLES FOR EXPORT on table `test`.`t2` in a general tablespace.'
|
||
UNLOCK TABLES;
|
||
connection con3;
|
||
UNLOCK TABLES;
|
||
connection default;
|
||
DROP TABLE t1;
|
||
DROP TABLESPACE ts1;
|
||
DROP TABLE t2;
|
||
DROP TABLESPACE ts2;
|
||
DROP TABLE t3;
|
||
DROP TABLESPACE ts3;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC7. Verify that statements 'FLUSH TABLE WITH READ LOCK',
|
||
# 'FLUSH TABLE FOR EXPORT' and 'LOCK TABLE READ'
|
||
# can run concurrently with operations on the
|
||
# tablespace.
|
||
#
|
||
# First, create tablespaces ts1, ts2 and ts3, and tables in the
|
||
# tablespaces.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLESPACE ts2 ADD DATAFILE 'ts2_1.ibd';
|
||
CREATE TABLESPACE ts3 ADD DATAFILE 'ts3_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
CREATE TABLE t2 (pk INTEGER PRIMARY KEY) TABLESPACE ts2;
|
||
CREATE TABLE t3 (pk INTEGER PRIMARY KEY) TABLESPACE ts3;
|
||
#
|
||
# Do a tablespace operation on ts1, and park it after getting
|
||
# the tablespace X lock.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_2.ibd';
|
||
#
|
||
# Do a tablespace operation on ts2, and park it after getting
|
||
# the tablespace X lock.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con2
|
||
WAIT_FOR cont_con2';
|
||
ALTER TABLESPACE ts2 ADD DATAFILE 'ts2_2.ibd';
|
||
#
|
||
# Do a tablespace operation on ts3, and park it after getting
|
||
# the tablespace X lock.
|
||
connection con3;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con2';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con3
|
||
WAIT_FOR cont_con3';
|
||
ALTER TABLESPACE ts3 ADD DATAFILE 'ts3_2.ibd';
|
||
#
|
||
# Execute statements that should not be blocked
|
||
# even with parked tablespace DDL statements
|
||
# holding tablespace name X locks.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con3';
|
||
FLUSH TABLE t1 WITH READ LOCK;
|
||
Warnings:
|
||
Warning 1235 InnoDB: This version of MySQL doesn't yet support 'FLUSH TABLES FOR EXPORT on table `test`.`t1` in a general tablespace.'
|
||
UNLOCK TABLES;
|
||
FLUSH TABLE t2 FOR EXPORT;
|
||
Warnings:
|
||
Warning 1235 InnoDB: This version of MySQL doesn't yet support 'FLUSH TABLES FOR EXPORT on table `test`.`t2` in a general tablespace.'
|
||
UNLOCK TABLES;
|
||
LOCK TABLE t3 READ;
|
||
UNLOCK TABLES;
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con2';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con3';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
connection con2;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
connection con3;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
connection default;
|
||
DROP TABLE t1;
|
||
DROP TABLESPACE ts1;
|
||
DROP TABLE t2;
|
||
DROP TABLESPACE ts2;
|
||
DROP TABLE t3;
|
||
DROP TABLESPACE ts3;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC8. Verify that tablespace IX locks are acquired in
|
||
# the context of 'LOCK TABLE WRITE'.
|
||
#
|
||
# First, create tablespace ts1 with one table.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
#
|
||
# Set a trap in the sync point after acquiring tablespace IX
|
||
# locks, and execute LOCK TABLE WRITE.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
LOCK TABLE t1 WRITE;
|
||
#
|
||
# Wait for con1 to get lock, then signal it to continue.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
UNLOCK TABLES;
|
||
connection default;
|
||
DROP TABLE t1;
|
||
DROP TABLESPACE ts1;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC9. Verify that table DML (e.g. SELECT ... FOR UPDATE)
|
||
# can run concurrently with DDL on the tablespace.
|
||
#
|
||
# First, create tablespace ts1 with one table and one row.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
INSERT INTO t1 (pk) VALUES (1);
|
||
#
|
||
# Set a trap in the sync point after acquiring tablespace X
|
||
# lock, and execute ALTER TABLESPACE.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_2.ibd';
|
||
#
|
||
# Wait for con1 to get lock, then do DML.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
SELECT * FROM t1 FOR UPDATE;
|
||
pk
|
||
1
|
||
SET DEBUG_SYNC= 'now SIGNAL done_con2';
|
||
#
|
||
# Wait for con2 to finish, then signal con1 to continue.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR done_con2';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
connection default;
|
||
DROP TABLE t1;
|
||
DROP TABLESPACE ts1;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC10. Verify that MDL with prepared statements works as
|
||
# expected, using a prepared ALTER TABLE.
|
||
#
|
||
# First, create tablespace ts1 with one table.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
#
|
||
# Set a trap in the sync point after acquiring tablespace IX
|
||
# lock, and prepare a statement. Set a new sync point after
|
||
# preparing, now expecting the sync point to be reached, and
|
||
# execute the prepared statement.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table HIT_LIMIT 1';
|
||
PREPARE stmt1 FROM 'ALTER TABLE t1 ADD COLUMN (i INTEGER)';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
EXECUTE stmt1;
|
||
#
|
||
# Wait for con1 to get the lock while executing, then signal
|
||
# it to continue.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
DEALLOCATE PREPARE stmt1;
|
||
connection default;
|
||
DROP TABLE t1;
|
||
DROP TABLESPACE ts1;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC11. Verify that a non-empty tablespace cannot be dropped.
|
||
#
|
||
#
|
||
# First, create a tablespace ts1 with one table.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
#
|
||
# Dropping ts1 should fail.
|
||
DROP TABLESPACE ts1;
|
||
ERROR HY000: Failed to drop TABLESPACE ts1
|
||
#
|
||
# Initiate a drop of table t1 and park it after
|
||
# acquiring IX lock on ts1.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
DROP TABLE t1;
|
||
#
|
||
# Initiate a drop of tablespace ts1 as soon as con1
|
||
# got its lock.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1 NO_CLEAR_EVENT';
|
||
DROP TABLESPACE ts1;
|
||
#
|
||
# Verify that the tablespace drop is waiting
|
||
# for X lock on ts1.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1 NO_CLEAR_EVENT';
|
||
#
|
||
# Let the table drop continue, and verify that the
|
||
# tablespace drop is not waiting anymore.
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
connection con2;
|
||
connection default;
|
||
DROP TABLESPACE ts1;
|
||
ERROR HY000: Failed to drop TABLESPACE ts1
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC12. Verify that the tablespace name length is checked
|
||
# properly.
|
||
#
|
||
#
|
||
# Set UTF8 character set to allow multi byte characters.
|
||
SET CHARACTER SET UTF8;
|
||
#
|
||
# An empty tablespace name should be rejected.
|
||
CREATE TABLESPACE `` ADD DATAFILE 'x.ibd';
|
||
ERROR 42000: Incorrect tablespace name ``
|
||
#
|
||
# A tablespace name up to 64 1-byte characters should be accepted.
|
||
CREATE TABLESPACE xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ADD DATAFILE 'x.ibd';
|
||
DROP TABLESPACE xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
|
||
#
|
||
# A tablespace name of 65 1-byte characters should be rejected.
|
||
CREATE TABLESPACE xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ADD DATAFILE 'x.ibd';
|
||
ERROR 42000: Identifier name 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' is too long
|
||
#
|
||
# A tablespace name up to 64 2-byte characters should be accepted.
|
||
CREATE TABLESPACE `¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥` ADD DATAFILE 'x.ibd';
|
||
DROP TABLESPACE `¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥`;
|
||
#
|
||
# A tablespace name of 65 2-byte characters should be rejected.
|
||
CREATE TABLESPACE `¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥` ADD DATAFILE 'x.ibd';
|
||
ERROR 42000: Identifier name '¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥' is too long
|
||
#
|
||
# A tablespace name up to 64 3-byte characters should be accepted.
|
||
CREATE TABLESPACE `€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€` ADD DATAFILE 'x.ibd';
|
||
DROP TABLESPACE `€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€`;
|
||
#
|
||
# A tablespace name of 65 3-byte characters should be rejected.
|
||
CREATE TABLESPACE `€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€` ADD DATAFILE 'x.ibd';
|
||
ERROR 42000: Identifier name '€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€' is too long
|
||
#
|
||
# A tablespace name containing supplementary UTF characters should be rejected.
|
||
CREATE TABLESPACE `a𐍈` ADD DATAFILE 'x.ibd';
|
||
ERROR HY000: Invalid utf8 character string: 'a\xF0\x90\x8D\x88'
|
||
###########################################################
|
||
# TC13. Extend test coverage:
|
||
# i) Run tablespace DDL within lock tables mode.
|
||
# ii) Run tablespace DDL when the global read lock
|
||
# is taken.
|
||
# iii) Provoke timeout for table DDL waiting for
|
||
# tablespace MDL IX lock.
|
||
# iv) Provoke timeout for tablespace DDL waiting for
|
||
# tablespace MDL X lock.
|
||
#
|
||
#
|
||
# First, create a tablespace ts1 with one table.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
#
|
||
# Run LOCK TABLE followed by tablespace DDL,
|
||
# which should fail due to thd->locked_tables_mode.
|
||
LOCK TABLE t1 READ;
|
||
ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_2.ibd';
|
||
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
|
||
UNLOCK TABLES;
|
||
#
|
||
# Run FLUSH TABLES WITH READ LOCK followed by tablespace
|
||
# DDL, which should fail due to global read lock.
|
||
FLUSH TABLES WITH READ LOCK;
|
||
ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_2.ibd';
|
||
ERROR HY000: Can't execute the query because you have a conflicting read lock
|
||
UNLOCK TABLES;
|
||
#
|
||
# In connection 1, run tablespace DDL and park it
|
||
# after getting MDL X lock on the tablespace name.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_2.ibd';
|
||
#
|
||
# Run table DDL concurrently with a short
|
||
# lock wait timeout. Should be aborted due
|
||
# to timeout.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
SET @start_session_value= @@session.lock_wait_timeout;
|
||
SET @@session.lock_wait_timeout= 1;
|
||
DROP TABLE t1;
|
||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# In connection 1, run table DDL and park it
|
||
# after getting MDL IX lock on the tablespace name.
|
||
connection con1;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
DROP TABLE t1;
|
||
#
|
||
# Run tablespace DDL concurrently with a short
|
||
# lock wait timeout. Should be aborted due
|
||
# to timeout.
|
||
connection default;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
DROP TABLESPACE ts1;
|
||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC, reset
|
||
# lock_wait_timeout and drop objects.
|
||
connection con1;
|
||
connection default;
|
||
SET @@session.lock_wait_timeout= @start_session_value;
|
||
DROP TABLESPACE ts1;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC14. Verify that CREATE TABLE ... LIKE statements are
|
||
# handled correctly, both with and without source
|
||
# tables in general tablespaces.
|
||
#
|
||
# First, create a tablespace ts1 with one table, and
|
||
# another table without an explicit tablespace clause.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLE t1_src (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
CREATE TABLE t2_src (pk INTEGER PRIMARY KEY);
|
||
#
|
||
# Create tables like the source tables, then show the
|
||
# definitions, and drop the tables.
|
||
CREATE TABLE t1_new LIKE t1_src;
|
||
SHOW CREATE TABLE t1_new;
|
||
Table Create Table
|
||
t1_new CREATE TABLE `t1_new` (
|
||
`pk` int(11) NOT NULL,
|
||
PRIMARY KEY (`pk`)
|
||
) /*!50100 TABLESPACE `ts1` */ ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||
DROP TABLE t1_new;
|
||
CREATE TABLE t2_new LIKE t2_src;
|
||
SHOW CREATE TABLE t2_new;
|
||
Table Create Table
|
||
t2_new CREATE TABLE `t2_new` (
|
||
`pk` int(11) NOT NULL,
|
||
PRIMARY KEY (`pk`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||
DROP TABLE t2_new;
|
||
#
|
||
# Reset DEBUG_SYNC and drop objects.
|
||
connection default;
|
||
DROP TABLE t1_src;
|
||
DROP TABLE t2_src;
|
||
DROP TABLESPACE ts1;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC15. Verify that explicit invalid tablespace names make
|
||
# table related DDL be rejected. Verify that implicit
|
||
# invalid tablespace names (e.g., present in an .FRM
|
||
# file from a previous MySQL version) are ignored.
|
||
#
|
||
# First, create a tablespace ts1 with one table.
|
||
connection default;
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
CREATE TABLE t1 (pk INTEGER PRIMARY KEY) TABLESPACE ts1;
|
||
#
|
||
# Alter table t1 to use a tablespace with an empty name.
|
||
ALTER TABLE t1 TABLESPACE ``;
|
||
ERROR 42000: Incorrect tablespace name ``
|
||
#
|
||
# Alter table t1 to use a tablespace with a name which is
|
||
# too long.
|
||
ALTER TABLE t1 TABLESPACE `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`;
|
||
ERROR 42000: Identifier name 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' is too long
|
||
#
|
||
# Create table t2 using a tablespace with an empty name.
|
||
CREATE TABLE t2 (pk INTEGER PRIMARY KEY) TABLESPACE ``;
|
||
ERROR 42000: Incorrect tablespace name ``
|
||
#
|
||
# Create table t2 using a tablespace with an name which is
|
||
# too long.
|
||
CREATE TABLE t2 (pk INTEGER PRIMARY KEY) TABLESPACE `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`;
|
||
ERROR 42000: Identifier name 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' is too long
|
||
#
|
||
# Copy files for a table with an invalid name.
|
||
#
|
||
# A SHOW CREATE TABLE will omit the tablespace name in
|
||
# the output.
|
||
SHOW CREATE TABLE table_with_invalid_tablespace_name;
|
||
Table Create Table
|
||
table_with_invalid_tablespace_name CREATE TABLE `table_with_invalid_tablespace_name` (
|
||
`pk` int(11) NOT NULL,
|
||
PRIMARY KEY (`pk`)
|
||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||
FLUSH TABLES;
|
||
#
|
||
# A normal SELECT will behave as usual.
|
||
SELECT * FROM table_with_invalid_tablespace_name;
|
||
pk
|
||
FLUSH TABLES;
|
||
#
|
||
# CREATE TABLE LIKE will omit the invalid tablespace name
|
||
# when creating the new table.
|
||
CREATE TABLE table_like LIKE table_with_invalid_tablespace_name;
|
||
FLUSH TABLES;
|
||
SHOW CREATE TABLE table_like;
|
||
Table Create Table
|
||
table_like CREATE TABLE `table_like` (
|
||
`pk` int(11) NOT NULL,
|
||
PRIMARY KEY (`pk`)
|
||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||
#
|
||
# ALTER TABLE will ignore the invalid tablespace name.
|
||
ALTER TABLE table_with_invalid_tablespace_name ENGINE=InnoDB;
|
||
FLUSH TABLES;
|
||
SHOW CREATE TABLE table_with_invalid_tablespace_name;
|
||
Table Create Table
|
||
table_with_invalid_tablespace_name CREATE TABLE `table_with_invalid_tablespace_name` (
|
||
`pk` int(11) NOT NULL,
|
||
PRIMARY KEY (`pk`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||
#
|
||
# Reset DEBUG_SYNC and drop objects.
|
||
connection default;
|
||
DROP TABLE t1;
|
||
DROP TABLE table_with_invalid_tablespace_name;
|
||
DROP TABLE table_like;
|
||
DROP TABLESPACE ts1;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
# TC16. Verify correct P_S information.
|
||
#
|
||
#
|
||
# Start executing CREATE TABLESPACE, but wait after
|
||
# getting the MDL X lock on the tablespace name.
|
||
connection con1;
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name
|
||
SIGNAL got_lock_con1
|
||
WAIT_FOR cont_con1';
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd';
|
||
#
|
||
# Start executing ALTER TABLESPACE.
|
||
connection con2;
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock_con1';
|
||
ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_2.ibd';
|
||
#
|
||
# Verify that the ALTER TABLESPACE is waiting for an MDL
|
||
# X lock on the tablespace name (not logged). Then, verify
|
||
# that we are also seeing the correct entries in the P_S MDL
|
||
# and events_waits_current tables. Further, signal con1 to
|
||
# make the CREATE TABLESPACE proceed.
|
||
connection default;
|
||
SELECT object_type, object_name, lock_type, lock_duration, lock_status
|
||
FROM performance_schema.metadata_locks
|
||
WHERE object_type LIKE 'TABLESPACE'
|
||
ORDER BY lock_status;
|
||
object_type object_name lock_type lock_duration lock_status
|
||
TABLESPACE ts1 EXCLUSIVE TRANSACTION GRANTED
|
||
TABLESPACE ts1 EXCLUSIVE TRANSACTION PENDING
|
||
SELECT event_name, object_name, object_type, operation
|
||
FROM performance_schema.events_waits_current
|
||
WHERE object_type LIKE 'TABLESPACE';
|
||
event_name object_name object_type operation
|
||
wait/lock/metadata/sql/mdl ts1 TABLESPACE metadata lock
|
||
SET DEBUG_SYNC= 'now SIGNAL cont_con1';
|
||
#
|
||
# Now, the tablespace MDL information will eventually be
|
||
# gone from both I_S and P_S, except it will remain in the
|
||
# P_S event wait history.
|
||
SELECT event_name, object_name, object_type, operation
|
||
FROM performance_schema.events_waits_history
|
||
WHERE object_type LIKE 'TABLESPACE' AND object_name LIKE 'ts1';
|
||
event_name object_name object_type operation
|
||
wait/lock/metadata/sql/mdl ts1 TABLESPACE metadata lock
|
||
#
|
||
# Reap the connections, reset DEBUG_SYNC and drop objects.
|
||
connection con1;
|
||
connection con2;
|
||
ERROR 42000: The storage engine for the table doesn't support ALTER TABLESPACE
|
||
connection default;
|
||
DROP TABLESPACE ts1;
|
||
SET DEBUG_SYNC= 'RESET';
|
||
###########################################################
|
||
#
|
||
# Test teardown: Disconnect
|
||
#
|
||
connection con1;
|
||
disconnect con1;
|
||
connection con2;
|
||
disconnect con2;
|
||
connection con3;
|
||
disconnect con3;
|
||
connection con4;
|
||
disconnect con4;
|
||
connection con5;
|
||
disconnect con5;
|
||
connection default;
|
||
# Bug#21376265 - ENHANCEMENT: ACQUIRE MDL LOCKS ON ALL TABLESPACE
|
||
# REFERRED BY A STATEMENT
|
||
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd';
|
||
CREATE TABLE t1 (
|
||
a INT NOT NULL,
|
||
PRIMARY KEY (a)
|
||
)
|
||
ENGINE=InnoDB
|
||
PARTITION BY RANGE (a)
|
||
PARTITIONS 1
|
||
(PARTITION P1 VALUES LESS THAN (2) TABLESPACE ts1);
|
||
Warnings:
|
||
Warning 1681 'InnoDB : A table partition in a shared tablespace' is deprecated and will be removed in a future release.
|
||
#############################################
|
||
# Case1: Checking TRUNCATE TABLE
|
||
# Sending 'TRUNCATE TABLE t1;'
|
||
SET DEBUG_SYNC= 'RESET';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock
|
||
WAIT_FOR cont';
|
||
TRUNCATE TABLE t1;;
|
||
# Verify that the tablespace name is locked.
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont';
|
||
# Reaping 'TRUNCATE TABLE t1'
|
||
#############################################
|
||
# Case2: Checking RENAME TABLE
|
||
# Sending 'RENAME TABLE t1 to t2;'
|
||
SET DEBUG_SYNC= 'RESET';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock
|
||
WAIT_FOR cont';
|
||
RENAME TABLE t1 to t2;;
|
||
# Verify that the tablespace name is locked.
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont';
|
||
# Reaping 'RENAME TABLE t1 to t2'
|
||
#############################################
|
||
# Case4: Checking CREATE TABLE
|
||
SET DEBUG_SYNC= 'RESET';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock
|
||
WAIT_FOR cont';
|
||
CREATE TABLE t3 ( a INT NOT NULL, PRIMARY KEY (a)) ENGINE=InnoDB PARTITION BY RANGE (a) PARTITIONS 1 (PARTITION P1 VALUES LESS THAN (2) TABLESPACE ts1);;
|
||
# Verify that the tablespace name is locked.
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont';
|
||
# Reaping 'CREATE TABLE'
|
||
Warnings:
|
||
Warning 1681 'InnoDB : A table partition in a shared tablespace' is deprecated and will be removed in a future release.
|
||
#############################################
|
||
# Case5: Checking CREATE TABLE LIKE
|
||
SET DEBUG_SYNC= 'RESET';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock
|
||
WAIT_FOR cont';
|
||
CREATE TABLE t4 LIKE t3;;
|
||
# Verify that the tablespace name is locked.
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont';
|
||
# Reaping 'CREATE TABLE LIKE'
|
||
Warnings:
|
||
Warning 1681 'InnoDB : A table partition in a shared tablespace' is deprecated and will be removed in a future release.
|
||
#############################################
|
||
# Case6: Checking ALTER TABLE ... PARTITION
|
||
CREATE TABLESPACE ts2 ADD DATAFILE 'ts2.ibd';
|
||
SET DEBUG_SYNC= 'RESET';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock
|
||
WAIT_FOR cont';
|
||
ALTER TABLE t2 ADD PARTITION (partition p2 values less than (4) tablespace ts2);;
|
||
# Verify that the tablespace name is locked.
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont';
|
||
# Reaping 'ALTER TABLE'
|
||
Warnings:
|
||
Warning 1681 'InnoDB : A table partition in a shared tablespace' is deprecated and will be removed in a future release.
|
||
#############################################
|
||
# Case7: Checking LOCK TABLE t2 WRITE
|
||
SET DEBUG_SYNC= 'RESET';
|
||
SET DEBUG_SYNC= 'after_wait_locked_tablespace_name_for_table
|
||
SIGNAL got_lock
|
||
WAIT_FOR cont';
|
||
LOCK TABLE t2 WRITE;
|
||
# Verify that the tablespace name is locked.
|
||
SET DEBUG_SYNC= 'now WAIT_FOR got_lock';
|
||
SET DEBUG_SYNC= 'now SIGNAL cont';
|
||
# Reaping 'LOCK TABLE'
|
||
UNLOCK TABLES;
|
||
#############################################
|
||
# Case8 - A tablespace name 65 3-byte characters should
|
||
# be rejected, when specified for table partition.
|
||
CREATE TABLE t5 (
|
||
a INT NOT NULL,
|
||
PRIMARY KEY (a)
|
||
)
|
||
ENGINE=InnoDB
|
||
PARTITION BY RANGE (a)
|
||
PARTITIONS 1
|
||
(PARTITION P1 VALUES LESS THAN (2) TABLESPACE
|
||
`€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€`);
|
||
ERROR 42000: Identifier name '€€€€€€€€€€€€€€<E282AC>' is too long
|
||
ALTER TABLE t2 ADD PARTITION (
|
||
partition p2 values less than (4) tablespace
|
||
`€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€`);
|
||
ERROR 42000: Identifier name '€€€€€€€€€€€€€€<E282AC>' is too long
|
||
# Cleanup
|
||
SET DEBUG_SYNC= 'RESET';
|
||
DROP TABLE t2;
|
||
DROP TABLE t3;
|
||
DROP TABLE t4;
|
||
DROP TABLESPACE ts1;
|
||
DROP TABLESPACE ts2;
|