polardbxengine/mysql-test/suite/innodb/include/instant_add_column_clear.inc

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;