--source include/have_debug.inc --source include/have_innodb_max_16k.inc --source include/have_debug_sync.inc --echo # --echo # Test that INFORMATION_SCHEMA.INNODB_COLUMNS shows warning --echo # if the table is dropped while filling metadata --echo # --disable_query_log CALL mtr.add_suppression("Unable to open innodb table with id = .* in the data dictionary."); --enable_query_log CREATE TABLE t_part (a INT PRIMARY KEY, b INT, c VARCHAR(64)) PARTITION BY HASH (a) PARTITIONS 5; SELECT lower(t.name), lower(c.name) FROM INFORMATION_SCHEMA.INNODB_COLUMNS c JOIN INFORMATION_SCHEMA.INNODB_TABLES t WHERE t.table_id = c.table_id AND t.name LIKE '%t_part%' ORDER BY t.name, c.name; SET DEBUG_SYNC = 'RESET'; SET DEBUG='+d,do_before_filling_i_s_innodb_columns'; SET DEBUG_SYNC='wait_before_filling_i_s_innodb_columns SIGNAL parked WAIT_FOR go'; SEND SELECT lower(t.name), lower(c.name) FROM INFORMATION_SCHEMA.INNODB_COLUMNS c JOIN INFORMATION_SCHEMA.INNODB_TABLES t WHERE t.table_id = c.table_id AND t.name LIKE '%t_part%' ORDER BY t.name, c.name; CONNECT (con1, localhost, root,,); SET DEBUG_SYNC='now WAIT_FOR parked'; SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST; DROP TABLE t_part; SET DEBUG_SYNC='now SIGNAL go'; CONNECTION default; --reap SHOW WARNINGS; # Search the warning message in the error file --let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err --let SEARCH_PATTERN= Unable to open innodb table with id = .* in the data dictionary. --source include/search_pattern.inc DISCONNECT con1; SET DEBUG_SYNC='RESET'; SET DEBUG='-d,do_before_filling_i_s_innodb_columns'; --echo # --echo # Test that INFORMATION_SCHEMA.INNODB_COLUMNS shows warning --echo # if the table is locked while filling metadata --echo # CREATE TABLE t_nopart (a INT PRIMARY KEY, b INT, c VARCHAR(64)); INSERT INTO t_nopart VALUES (1, 1, 'v'); SET DEBUG='+d,do_before_filling_i_s_innodb_columns'; SET DEBUG_SYNC='wait_before_filling_i_s_innodb_columns SIGNAL parked1 WAIT_FOR go1'; SET SESSION lock_wait_timeout=1; SEND SELECT lower(t.name), lower(c.name) FROM INFORMATION_SCHEMA.INNODB_COLUMNS c JOIN INFORMATION_SCHEMA.INNODB_TABLES t WHERE t.table_id = c.table_id AND t.name LIKE '%t_nopart%' ORDER BY t.name, c.name; CONNECT (con2, localhost, root,,); SET DEBUG_SYNC='now WAIT_FOR parked1'; SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST; SET DEBUG_SYNC='mysql_rm_table_after_lock_table_names SIGNAL parked2 WAIT_FOR go2'; SEND DROP TABLE t_nopart; CONNECT (con3, localhost, root,,); SET DEBUG_SYNC='now WAIT_FOR parked2'; SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST; SET DEBUG_SYNC='now SIGNAL go1'; CONNECTION default; --error 1205 --reap # There will be an error and a warning because the MDL lock is held # at two different places while filling metadata SHOW WARNINGS; SET DEBUG_SYNC='now SIGNAL go2'; CONNECTION con2; --reap DISCONNECT con2; DISCONNECT con3; CONNECTION default; SET SESSION lock_wait_timeout=default; SET DEBUG='-d,do_before_filling_i_s_innodb_columns'; --echo # Different partitions can have different row format --echo # Case one: between dynamic and redundant --echo # # Have to set the default row format to a non-default one. SET GLOBAL innodb_default_row_format = REDUNDANT; CREATE TABLE t1 (a INT NOT NULL, d INT NOT NULL, index(a, d)) ENGINE=InnoDB PARTITION BY LIST COLUMNS (a,d) (PARTITION p36_1 VALUES IN ((10,5),(10,6)), PARTITION p36_2 VALUES IN ((11,5),(11,6))); SET SESSION debug= '+d,skip_dd_table_access_check'; SELECT name, se_private_data FROM mysql.table_partitions; --source include/restart_mysqld.inc ALTER TABLE t1 ADD PARTITION (PARTITION p_r13 VALUES IN ((741,377), (21,728)), PARTITION p_r23 VALUES IN ((102,337), (453,337), (-9,179))); SET SESSION debug= '+d,skip_dd_table_access_check'; SELECT name, se_private_data FROM mysql.table_partitions; CHECK TABLE t1; SHOW CREATE TABLE t1; --source include/restart_mysqld.inc SET SESSION debug= '+d,skip_dd_table_access_check'; SELECT name, se_private_data FROM mysql.table_partitions; CHECK TABLE t1; DROP TABLE t1; SET GLOBAL innodb_default_row_format = Default; --echo # --echo # Different partitions can have different row format --echo # Case two: between dynamic and compressed --echo # CREATE TABLE t1 (a INT, b INT, key(a)) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 PARTITION BY RANGE (a % 7) (PARTITION p1 VALUES LESS THAN(1), PARTITION p2 VALUES LESS THAN (2), PARTITION p3 VALUES LESS THAN (5), PARTITION p4 VALUES LESS THAN(MAXVALUE)); SHOW CREATE TABLE t1; SET @orig_innodb_file_per_table= @@innodb_file_per_table; SET GLOBAL innodb_file_per_table = 0; SET @save_innodb_strict_mode=@@session.innodb_strict_mode; SET SESSION innodb_strict_mode = 0; SET SESSION debug= '+d,skip_dd_table_access_check'; SELECT name, se_private_data FROM mysql.table_partitions; ALTER TABLE t1 REORGANIZE PARTITION p1, p2 INTO (PARTITION p1 VALUES LESS THAN(2)); SELECT name, se_private_data FROM mysql.table_partitions; SHOW CREATE TABLE t1; SET GLOBAL innodb_file_per_table = @orig_innodb_file_per_table; SET SESSION innodb_strict_mode=@save_innodb_strict_mode; --source include/restart_mysqld.inc SET SESSION debug= '+d,skip_dd_table_access_check'; SELECT name, se_private_data FROM mysql.table_partitions; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1;