246 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			SQL
		
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			SQL
		
	
	
| 
 | |
| --echo #
 | |
| --echo # Scenario 1:
 | |
| --echo # Create a normal table, rebuild and truncate will clear the instant
 | |
| --echo # information
 | |
| --echo #
 | |
| 
 | |
| --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=$row_format
 | |
| 
 | |
| INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
 | |
| 
 | |
| 
 | |
| let $new_cols = 1;
 | |
| let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 INT DEFAULT 10;
 | |
| 
 | |
| --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc
 | |
| 
 | |
| # An ALTER TABLE which requires rebuild
 | |
| let $new_cols = 1;
 | |
| let $instant_add_column = ALTER TABLE t1 ADD COLUMN c2 INT DEFAULT 20, ADD KEY(c2);
 | |
| 
 | |
| --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc
 | |
| 
 | |
| # Should be empty now
 | |
| SELECT count(*) FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| 
 | |
| INSERT INTO t1(a, b) VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
 | |
| 
 | |
| let $new_cols = 1;
 | |
| let $instant_add_column = ALTER TABLE t1 ADD COLUMN c3 INT DEFAULT 10;
 | |
| 
 | |
| --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc
 | |
| 
 | |
| # TRUNCATE TABLE should rebuild the table too
 | |
| let $new_cols = 1;
 | |
| let $instant_add_column = TRUNCATE TABLE t1;
 | |
| 
 | |
| --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc
 | |
| 
 | |
| # Should be empty now
 | |
| SELECT count(*) FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| 
 | |
| CHECK TABLE t1;
 | |
| 
 | |
| SHOW CREATE TABLE t1;
 | |
| 
 | |
| DROP TABLE t1;
 | |
| 
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Scenario 2:
 | |
| --echo # Create a partitioned table, rebuild and truncate will clear the instant
 | |
| --echo # information
 | |
| --echo #
 | |
| 
 | |
| --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=$row_format PARTITION BY HASH(a) PARTITIONS 3;
 | |
| 
 | |
| INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8);
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| ALTER TABLE t1 ADD COLUMN c1 INT DEFAULT 10;
 | |
| 
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| # This will rebuild all partitions
 | |
| ALTER TABLE t1 ADD COLUMN c2 INT DEFAULT 20, ALGORITHM = COPY;
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| INSERT INTO t1(b, c1, c2) SELECT b, c1, c2 FROM t1;
 | |
| 
 | |
| ALTER TABLE t1 ADD COLUMN c3 INT DEFAULT 30;
 | |
| 
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| # This will rebuild all partitions
 | |
| TRUNCATE TABLE t1;
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| 
 | |
| CHECK TABLE t1;
 | |
| 
 | |
| SHOW CREATE TABLE t1;
 | |
| 
 | |
| DROP TABLE t1;
 | |
| 
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Scenario 3:
 | |
| --echo # Create a partitioned table, ALTER TABLE ... PARTITION will clear the
 | |
| --echo # instant information
 | |
| --echo #
 | |
| 
 | |
| # Range partitioned table
 | |
| --eval CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b INT) ROW_FORMAT=$row_format PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN (20), PARTITION p3 VALUES LESS THAN (30));
 | |
| 
 | |
| INSERT INTO t1 VALUES(1, 1), (2, 2), (11, 11), (12, 12), (21, 21), (22, 22), (26, 26), (27, 27);
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| ALTER TABLE t1 ADD COLUMN c INT DEFAULT 100;
 | |
| 
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| # The new partition should have no instant column information
 | |
| ALTER TABLE t1 ADD PARTITION (PARTITION p4 VALUES LESS THAN(40));
 | |
| 
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 4` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| SELECT instant_cols FROM information_schema.innodb_tables WHERE name LIKE '%p4%';
 | |
| 
 | |
| # The new partition should have no instant column information
 | |
| ALTER TABLE t1 REORGANIZE PARTITION p3 INTO (PARTITION p31 VALUES LESS THAN(25), PARTITION p32 VALUES LESS THAN(30));
 | |
| 
 | |
| SELECT * FROM t1 WHERE a > 20 AND a < 30;
 | |
| SELECT * FROM t1 WHERE a > 10 AND a < 20;
 | |
| 
 | |
| SELECT count(*) AS `Expect 2` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 5` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| SELECT instant_cols FROM information_schema.innodb_tables WHERE name LIKE '%p3%';
 | |
| 
 | |
| # The truncated partition should not have instant information
 | |
| ALTER TABLE t1 TRUNCATE PARTITION p1;
 | |
| 
 | |
| SELECT * FROM t1 WHERE a < 10;
 | |
| 
 | |
| SELECT count(*) AS `Expect 1` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 5` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| SELECT instant_cols FROM information_schema.innodb_tables WHERE name LIKE '%p1%';
 | |
| 
 | |
| # Truncate all partitions, the table instant information should be clean
 | |
| ALTER TABLE t1 TRUNCATE PARTITION p1, p2, p31, p32, p4;
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| 
 | |
| INSERT INTO t1(a, b) VALUES(1, 1), (2, 2), (11, 11), (12, 12), (21, 21), (22, 22), (26, 26), (27, 27);
 | |
| 
 | |
| SELECT c FROM t1 GROUP BY c;
 | |
| 
 | |
| ALTER TABLE t1 ADD COLUMN d INT DEFAULT 100;
 | |
| 
 | |
| SELECT count(*) AS `Expect 5` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 5` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| ALTER TABLE t1 TRUNCATE PARTITION p1;
 | |
| 
 | |
| SELECT count(*) AS `Expect 4` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 5` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| SELECT instant_cols FROM information_schema.innodb_tables WHERE name LIKE '%p1%';
 | |
| 
 | |
| 
 | |
| # Drop all partitions except p1, the table information should be clean,
 | |
| # because p1 is a new partition
 | |
| ALTER TABLE t1 DROP PARTITION p2, p4;
 | |
| 
 | |
| SELECT count(*) AS `Expect 2` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| ALTER TABLE t1 DROP PARTITION p31, p32;
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| 
 | |
| CHECK TABLE t1;
 | |
| 
 | |
| SHOW CREATE TABLE t1;
 | |
| 
 | |
| DROP TABLE t1;
 | |
| 
 | |
| 
 | |
| # HASH partitioned table
 | |
| --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=$row_format PARTITION BY HASH(a) PARTITIONS 3;
 | |
| 
 | |
| INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8);
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| ALTER TABLE t1 ADD COLUMN c1 INT DEFAULT 10;
 | |
| 
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| # ADD PARTITION will rebuild the whole table, and instant information should be
 | |
| # clean for each partition
 | |
| ALTER TABLE t1 ADD PARTITION PARTITIONS 2;
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| 
 | |
| ALTER TABLE t1 ADD COLUMN c2 INT DEFAULT 20;
 | |
| 
 | |
| SELECT count(*) AS `Expect 5` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 5` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| # COALESCE PARTITION will rebuild the whole table, and instant information
 | |
| # should be clean for each partition
 | |
| ALTER TABLE t1 COALESCE PARTITION 2;
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| 
 | |
| # Verify it once more
 | |
| 
 | |
| ALTER TABLE t1 ADD COLUMN c3 INT DEFAULT 30;
 | |
| 
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 3` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| # ADD PARTITION will rebuild the whole table, and instant information should be
 | |
| # clean for each partition
 | |
| ALTER TABLE t1 ADD PARTITION PARTITIONS 2;
 | |
| 
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
 | |
| SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
 | |
| 
 | |
| 
 | |
| SELECT * FROM t1;
 | |
| 
 | |
| 
 | |
| CHECK TABLE t1;
 | |
| 
 | |
| SHOW CREATE TABLE t1;
 | |
| 
 | |
| DROP TABLE t1;
 |