################################################################################ # t/partition_special_innodb.test # # # # Purpose: # # different Tests # # InnoDB branch # # # #------------------------------------------------------------------------------# # Original Author: HH # # Original Date: 2006-08-01 # # Change Author: MattiasJ # # Change Date: 2008-08-20 # # Change: added test for bug#34604 # ################################################################################ # # NOTE: PLEASE DO NOT ADD NOT INNODB SPECIFIC TESTCASES HERE ! # TESTCASES WHICH MUST BE APPLIED TO ALL STORAGE ENGINES MUST BE ADDED IN # THE SOURCED FILES ONLY. # # Please read the README at the end of inc/partition.pre before changing # any of the variables. # #------------------------------------------------------------------------------# # General not engine specific settings and requirements ##### Options, for debugging support ##### let $debug= 0; # The server must support partitioning. --source include/have_partition.inc #------------------------------------------------------------------------------# # Engine specific settings and requirements ##### Storage engine to be tested --source include/have_innodb.inc let $engine= 'InnoDB'; #------------------------------------------------------------------------------# # Execute the tests to be applied to all storage engines --source suite/parts/inc/partition_key_4col.inc --source suite/parts/inc/partition_key_8col.inc --source suite/parts/inc/partition_key_16col.inc --source suite/parts/inc/partition_key_32col.inc #------------------------------------------------------------------------------# # Execute storage engine specific tests --echo # Bug#34604 - Assertion 'inited==RND' failed in handler::ha_rnd_end CREATE TABLE t1 ( a INT AUTO_INCREMENT, b VARCHAR(255), PRIMARY KEY (a)) ENGINE = InnoDB PARTITION BY HASH (a) PARTITIONS 2; connect (con1, localhost, root,,); connect (con2, localhost, root,,); --connection con1 SET autocommit=OFF; START TRANSACTION; INSERT INTO t1 VALUES (NULL, 'first row t2'); --connection con2 SET autocommit=OFF; SET SESSION lock_wait_timeout= 1; --error ER_LOCK_WAIT_TIMEOUT ALTER TABLE t1 AUTO_INCREMENT = 10; --disconnect con2 --disconnect con1 --connection default DROP TABLE t1; --echo # --echo # Bug#53676: Unexpected errors and possible table corruption on --echo # ADD PARTITION and LOCK TABLE --connect (con1,localhost,root,,) CREATE TABLE t1 ( i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, f INT ) ENGINE = InnoDB PARTITION BY HASH(i) PARTITIONS 2; INSERT INTO t1 VALUES (2, 2), (3, 3), (4, 4), (5, 5); --connect (con2,localhost,root,,) SET lock_wait_timeout = 2; --connection con1 --echo #Connection 1 locks the table LOCK TABLE t1 READ; --connection con2 --echo # Connection 2 tries to add partitions: --echo # First attempt: lock wait timeout (as expected) --error ER_LOCK_WAIT_TIMEOUT ALTER TABLE t1 ADD PARTITION PARTITIONS 2; --echo # Second attempt: says that partition already exists --error ER_LOCK_WAIT_TIMEOUT ALTER TABLE t1 ADD PARTITION PARTITIONS 2; --echo # Check that we only can select, not insert/update/delete. --error ER_LOCK_WAIT_TIMEOUT INSERT INTO t1 VALUES (NULL, 6), (NULL, 7), (10, 10), (11, 11); --error ER_LOCK_WAIT_TIMEOUT UPDATE t1 SET i = 5 WHERE f = 2; --error ER_LOCK_WAIT_TIMEOUT DELETE FROM t1 WHERE i = 10; --sorted_result SELECT * FROM t1; --connection con1 --echo # Connection 1 unlocks the table and locks it again: UNLOCK TABLES; --real_sleep 1 LOCK TABLE t1 READ; --connection con2 --echo # Connection 2 tries again to add partitions: --echo # Third attempt: says that the table does not exist --error ER_LOCK_WAIT_TIMEOUT ALTER TABLE t1 ADD PARTITION PARTITIONS 2; --echo # Check table returns the same (not after fixing bug#56172!) CHECK TABLE t1; --connection con1 UNLOCK TABLES; --connection con2 DROP TABLE t1; # End of Test1 # Test2 --connection con1 CREATE TABLE t2 ( i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, f INT ) ENGINE = InnoDB PARTITION BY HASH(i) PARTITIONS 2; --connection con2 SET lock_wait_timeout = 2; --connection con1 LOCK TABLE t2 READ; --connection con2 --error ER_LOCK_WAIT_TIMEOUT ALTER TABLE t2 ADD PARTITION PARTITIONS 2; send ALTER TABLE t2 ADD PARTITION PARTITIONS 2; --connection con1 UNLOCK TABLES; --connection con2 --reap --connect (con3,localhost,root,,) CHECK TABLE t2; SELECT * FROM t2; DROP TABLE t2; # End of Test2 # Test #3 --connection con1 CREATE TABLE t3 ( i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, f INT ) ENGINE = InnoDB PARTITION BY HASH(i) PARTITIONS 2; --connection con2 SET lock_wait_timeout = 2; --connection con1 --echo # Connection 1 locks the table LOCK TABLE t3 READ; --connection con2 --echo # Connection 2 tries to add partitions (timeout): --error ER_LOCK_WAIT_TIMEOUT ALTER TABLE t3 ADD PARTITION PARTITIONS 2; --connection con3 SET lock_wait_timeout = 2; --echo # Connection 3 tries to add partitions (partition already exists): --error ER_LOCK_WAIT_TIMEOUT ALTER TABLE t3 ADD PARTITION PARTITIONS 2; --connect (con4,localhost,root,,) --echo # Connection 4 tries to rename the table: send RENAME TABLE t3 TO t4; --connection con1 --real_sleep 1 --echo # Connection 1 unlocks the table: UNLOCK TABLES; --connection con4 --echo # Connection 4 gets error on rename: --reap --connect (con5,localhost,root,,) --echo # SHOW TABLES returns the table (not renamed): SHOW TABLES; --echo # Connection 5 attempts to read from the table (table does not exist): --error ER_NO_SUCH_TABLE SELECT * FROM t3; DROP TABLE t4; --disconnect con5 --disconnect con4 --disconnect con3 --disconnect con2 --disconnect con1 --connection default # End of Test #3 # MDEV-21693 ALGORITHM=INSTANT does not work for partitioned tables CREATE TABLE t1( f1 INT, f2 VARCHAR(10) CHARSET ascii, f3 CHAR(150) CHARSET ascii, f4 TEXT CHARSET ascii)ENGINE=InnoDB PARTITION BY RANGE(f1) (PARTITION p1 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN (100)); ALTER TABLE t1 convert to charset ascii collate ascii_bin, ALGORITHM=INSTANT; DROP TABLE t1; --echo # Test WRITE LOCK. --connect (con1,localhost,root,,) CREATE TABLE t1 ( i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, f INT ) ENGINE = InnoDB PARTITION BY HASH(i) PARTITIONS 2; INSERT INTO t1 VALUES (3, 3), (4, 4); --connect (con2,localhost,root,,) SET lock_wait_timeout = 2; --connection con1 --echo #Connection 1 locks the table LOCK TABLE t1 WRITE; --connection con2 --echo # Check that we still can SELECT, but not insert/update/delete. --echo # Check that we only can select, not insert/update/delete. --error ER_LOCK_WAIT_TIMEOUT INSERT INTO t1 VALUES (NULL, 1), (NULL, 2), (10, 10), (11, 11); --error ER_LOCK_WAIT_TIMEOUT UPDATE t1 SET i = 5 WHERE f = 2; --error ER_LOCK_WAIT_TIMEOUT DELETE FROM t1 WHERE i = 10; --error ER_LOCK_WAIT_TIMEOUT SELECT * FROM t1; --connection con1 UNLOCK TABLES; --connection con2 DROP TABLE t1; --disconnect con1 --connection default