--echo # --echo # Scenario 1: --echo # Create a small table, and add all kinds of new columns and verify --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); # ADD COLUMN INT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 INT, ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; INSERT INTO t1(a, c1) VALUES(0, 1); SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL; SELECT c1 FROM t1 WHERE c1 = 1; # ADD COLUMN INT DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c2 INT NOT NULL DEFAULT 10; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c2' AND has_default = 1; INSERT INTO t1(a, c2) VALUES(0, 11); SELECT count(*) = max(a) FROM t1 WHERE c2 = 10; SELECT c2 FROM t1 WHERE c2 = 11; # ADD COLUMN BIGINT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN d1 BIGINT, ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd1' AND has_default = 1; INSERT INTO t1(a, d1) VALUES(0, 1); SELECT count(*) = max(a) FROM t1 WHERE d1 IS NULL; SELECT d1 FROM t1 WHERE d1 = 1; # ADD COLUMN BIGINT DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN d2 BIGINT NOT NULL DEFAULT 1234567890; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd2' AND has_default = 1; INSERT INTO t1(a, d2) VALUES(0, 1234); SELECT count(*) = max(a) FROM t1 WHERE d2 = 1234567890; SELECT d2 FROM t1 WHERE d2 = 1234; # ADD COLUMN SMALLINT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN e1 SMALLINT, ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e1' AND has_default = 1; INSERT INTO t1(a, e1) VALUES(0, 1); SELECT count(*) = max(a) FROM t1 WHERE e1 IS NULL; SELECT e1 FROM t1 WHERE e1 = 1; # ADD COLUMN SMALLINT DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN e2 SMALLINT NOT NULL DEFAULT 10; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e2' AND has_default = 1; INSERT INTO t1(a, e2) VALUES(0, 11); SELECT count(*) = max(a) FROM t1 WHERE e2 = 10; SELECT e2 FROM t1 WHERE e2 = 11; # ADD COLUMN TINYINT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN f1 TINYINT, ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f1' AND has_default = 1; INSERT INTO t1(a, f1) VALUES(0, 1); SELECT count(*) = max(a) FROM t1 WHERE f1 IS NULL; SELECT f1 FROM t1 WHERE f1 = 1; # ADD COLUMN TINYINT DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN f2 TINYINT NOT NULL DEFAULT 123; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f2' AND has_default = 1; INSERT INTO t1(a, f2) VALUES(0, 12); SELECT count(*) = max(a) FROM t1 WHERE f2 = 123; SELECT f2 FROM t1 WHERE f2 = 12; # ADD COLUMN MEDIUMINT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN g1 MEDIUMINT, ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g1' AND has_default = 1; INSERT INTO t1(a, g1) VALUES(0, 1); SELECT count(*) = max(a) FROM t1 WHERE g1 IS NULL; SELECT g1 FROM t1 WHERE g1 = 1; # ADD COLUMN MEDIUMINT DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN g2 MEDIUMINT NOT NULL DEFAULT 12345; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g2' AND has_default = 1; INSERT INTO t1(a, g2) VALUES(0, 1234); SELECT count(*) = max(a) FROM t1 WHERE g2 = 12345; SELECT g2 FROM t1 WHERE g2 = 1234; # ADD COLUMN FLOAT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN h1 FLOAT, ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h1' AND has_default = 1; INSERT INTO t1(a, h1) VALUES(0, 1.0); SELECT count(*) = max(a) FROM t1 WHERE h1 IS NULL; SELECT h1 FROM t1 WHERE h1 = 1; # ADD COLUMN FLOAT DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN h2 FLOAT NOT NULL DEFAULT 12.34; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h2' AND has_default = 1; INSERT INTO t1(a, h2) VALUES(0, 1.234); SELECT count(*) = max(a) FROM t1 WHERE h2 = 12.34; SELECT h2 FROM t1 WHERE h2 = 1.234; # ADD COLUMN DECIMAL & DOUBLE let $new_cols = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN i1 DECIMAL(5, 2), ADD COLUMN i2 double, ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'i1' OR name = 'i2') AND has_default = 1; INSERT INTO t1(a, i1, i2) VALUES(0, 10.10, 20.20); SELECT count(*) = max(a) FROM t1 WHERE i1 IS NULL; SELECT count(*) = max(a) FROM t1 WHERE i2 IS NULL; SELECT i1 FROM t1 WHERE i1 = 10.10; SELECT i2 FROM t1 WHERE i2 = 20.20; # ADD COLUMN DECIMAL & DOUBLE DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN j1 DECIMAL(5, 2) NOT NULL DEFAULT 100.00, ADD COLUMN j2 double NOT NULL DEFAULT 1000.5678; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'j1' OR name = 'j2') AND has_default = 1; INSERT INTO t1(a, j1, j2) VALUES(0, 90.90, 1000.1234); SELECT count(*) = max(a) FROM t1 WHERE j1 = 100.00; SELECT count(*) = max(a) FROM t1 WHERE j2 = 1000.5678; SELECT j1 FROM t1 WHERE j1 = 90.90; SELECT j2 FROM t1 WHERE j2 = 1000.1234; # ADD COLUMN BIT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN k1 BIT(8), ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'k1' AND has_default = 1; INSERT INTO t1(a, k1) VALUES(0, b'010101'); SELECT count(*) = max(a) FROM t1 WHERE k1 IS NULL; SELECT hex(k1) FROM t1 WHERE k1 = b'010101'; # ADD COLUMN BIT DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN k2 BIT(8) NOT NULL DEFAULT b'101010'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'k2' AND has_default = 1; INSERT INTO t1(a, k2) VALUES(0, b'110011'); SELECT count(*) = max(a) FROM t1 WHERE k2 = b'101010'; SELECT hex(k2) FROM t1 WHERE k2 = b'110011'; # ADD COLUMN CHAR & VARCHAR let $new_cols = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN l1 CHAR(50), ADD COLUMN l2 VARCHAR(100), ALGORITHM=DEFAULT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'l1' OR name = 'l2') AND has_default = 1; INSERT INTO t1(a, l1, l2) VALUES(0, 'ABCD EFGH', 'abcdefg hijklmn '); SELECT count(*) = max(a) FROM t1 WHERE l2 IS NULL; SELECT count(*) = max(a) FROM t1 WHERE l1 IS NULL; SELECT l1 FROM t1 WHERE l1 = 'ABCD EFGH'; SELECT l2 FROM t1 WHERE l2 = 'abcdefg hijklmn '; # ADD COLUMN CHAR & VARCHAR DEFAULT let $new_cols = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN m1 CHAR(50) default 'The fox jumps over', ADD COLUMN m2 VARCHAR(50) DEFAULT 'The fox jumps over the lazy dog.'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'm1' OR name = 'm2') AND has_default = 1; INSERT INTO t1(a, m1, m2) VALUES(0, 'over the lazy dog', 'The lazy dog jumps over the fox.'); SELECT count(*) = max(a) FROM t1 WHERE m1 = 'The fox jumps over'; SELECT count(*) = max(a) FROM t1 WHERE m2 like 'The fox jumps%'; SELECT m1 FROM t1 WHERE m1 = 'over the lazy dog'; SELECT m2 FROM t1 WHERE m2 like '%the fox.'; # ADD COLUMN BINARY & VARBINARY let $new_cols = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN n1 BINARY(10), ADD COLUMN n2 VARBINARY(10), ALGORITHM=DEFAULT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'n1' OR name = 'n2') AND has_default = 1; INSERT INTO t1(a, n1, n2) VALUES(0, 0x010203040506070809, 0x102030405060708090); SELECT count(*) = max(a) FROM t1 WHERE n1 IS NULL; SELECT count(*) = max(a) FROM t1 WHERE n2 IS NULL; SELECT hex(n1) FROM t1 WHERE n1 = 0x01020304050607080900; SELECT hex(n2) FROM t1 WHERE n2 = 0x102030405060708090; # ADD COLUMN BINARY & VARBINARY DEFAULT let $new_cols = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN o1 BINARY(10) DEFAULT 0x11223344, ADD COLUMN o2 VARBINARY(10) DEFAULT 0x55667788; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'o1' OR name = 'o2') AND has_default = 1; INSERT INTO t1(a, o1, o2) VALUES(0, 0x44332211, 0x88776655); SELECT count(*) = max(a) FROM t1 WHERE o1 = 0x11223344000000000000; SELECT count(*) = max(a) FROM t1 WHERE o2 = 0x55667788; SELECT hex(o1) FROM t1 WHERE o1 = 0x44332211000000000000; SELECT hex(o2) FROM t1 WHERE o2 = 0x88776655; # ADD COLUMN DATETIME let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN p1 DATETIME, ALGORITHM=DEFAULT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'p1' AND has_default = 1; INSERT INTO t1(a, p1) VALUES(0, '2017-12-31 00:00:00'); SELECT count(*) = max(a) FROM t1 WHERE p1 IS NULL; SELECT p1 FROM t1 WHERE p1 = '2017-12-31 00:00:00'; # ADD COLUMN DATETIME DEFAULT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN p2 DATETIME NOT NULL DEFAULT '2017-12-31 01:02:03'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'p2' AND has_default = 1; sleep 1; SELECT count(*) = max(a) FROM t1 GROUP BY p2; INSERT INTO t1(a, p2) VALUES(0, now()); SELECT count(*) FROM t1 GROUP BY p2; # ADD COLUMN ENUM let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN q1 ENUM ('value1','value2','value3'), ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'q1' AND has_default = 1; INSERT INTO t1(a, q1) VALUES(0, 1); SELECT count(*) = max(a) FROM t1 WHERE q1 IS NULL; SELECT q1 FROM t1 WHERE q1 = 1; # ADD COLUMN SET let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN r1 SET ('a','b','c'), ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'r1' AND has_default = 1; INSERT INTO t1(a, r1) VALUES(0, 'a'); SELECT count(*) = max(a) FROM t1 WHERE r1 IS NULL; SELECT r1 FROM t1 WHERE r1 = 'a'; # ADD COLUMN BLOB & TEXT let $new_cols = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN s1 BLOB, ADD COLUMN s2 TEXT, ALGORITHM=INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 's1' OR name = 's2') AND has_default = 1; INSERT INTO t1(a, s1, s2) VALUES(0, 0x0102030405, 'abcd qwerty'); SELECT count(*) = max(a) FROM t1 WHERE s1 IS NULL; SELECT count(*) = max(a) FROM t1 WHERE s2 IS NULL; SELECT hex(s1) FROM t1 WHERE s1 = 0x0102030405; SELECT s2 FROM t1 WHERE s2 = 'abcd qwerty'; # ADD COLUMN BLOB & TEXT NOT NULL let $new_cols = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN u1 BLOB NOT NULL, ADD COLUMN u2 TEXT NOT NULL; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'u1' OR name = 'u2') AND has_default = 1; INSERT INTO t1(a, u1, u2) VALUES(0, 0x0102030405, 'abcd qwerty'); SELECT count(*) = max(a) FROM t1 WHERE u1 = ''; SELECT count(*) = max(a) FROM t1 WHERE u2 = ''; SELECT hex(u1) FROM t1 WHERE u1 = 0x0102030405; SELECT u2 FROM t1 WHERE u2 = 'abcd qwerty'; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 2: --echo # Create a small table, add some columns instantly, along with --echo # virtual columns --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 c INT NOT NULL, ADD COLUMN d INT GENERATED ALWAYS AS ((b * 2)) VIRTUAL; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc INSERT INTO t1(a, b, c) VALUES(0, 6, 20); SELECT * FROM t1; let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN e VARCHAR(100) DEFAULT 'ABCD EFGH', ADD COLUMN f INT GENERATED ALWAYS AS (LENGTH(e)); --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc INSERT INTO t1(a, c, e) VALUES(0, 20, 'Hello'), (0, 20, 'World'), (0, 20, 'Hello World'); SELECT * FROM t1; let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN g VARCHAR(100) GENERATED ALWAYS AS (e), ADD COLUMN h BIGINT DEFAULT 10000, ADD COLUMN i BIGINT GENERATED ALWAYS AS (h * 2 + b); --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT * FROM t1; INSERT INTO t1(a, b, c, h) VALUES(0, 7, 40, 2000), (0, 7, 40, 20000); SELECT * FROM t1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 3: --echo # Create a small table, add some columns instantly, then change --echo # their default values, check original default values are correct --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 = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 100, ADD COLUMN d INT GENERATED ALWAYS AS ((c * 2 + b)) VIRTUAL, ADD COLUMN e VARCHAR(100) DEFAULT 'Hello world'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT * FROM t1; INSERT INTO t1(a, b, c, e) VALUES(0, 6, 200, 'Good day'), (0, 7, 300, 'Good DAY'); SELECT * FROM t1; SELECT default_value FROM information_schema.innodb_columns WHERE name = 'c' AND has_default = 1; ALTER TABLE t1 ALTER COLUMN c SET DEFAULT 500; # This should not change SELECT default_value FROM information_schema.innodb_columns WHERE name = 'c' AND has_default = 1; SELECT * FROM t1; INSERT INTO t1(a, b) VALUES(0, 8), (0, 9); SELECT * FROM t1; SELECT default_value FROM information_schema.innodb_columns WHERE name = 'e' AND has_default = 1; ALTER TABLE t1 ALTER COLUMN e SET DEFAULT 'HELLO MySQL!'; # This should not change SELECT default_value FROM information_schema.innodb_columns WHERE name = 'e' AND has_default = 1; SELECT * FROM t1; INSERT INTO t1(a, b) VALUES(0, 10), (0, 20); SELECT * FROM t1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 4: --echo # Create a small table, add some columns instantly, then do DML --echo # on the table --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 = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 100, ADD COLUMN d INT GENERATED ALWAYS AS ((c * 2 + b)) VIRTUAL, ADD COLUMN e VARCHAR(100) DEFAULT 'Hello world'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc UPDATE t1 SET c = 200 WHERE a > 3; SELECT distinct(c) FROM t1; INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1; INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1; INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1; DELETE FROM t1 WHERE c = 100; UPDATE t1 SET c = 300; SELECT distinct(c) FROM t1; SELECT count(*) FROM t1; let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN t DATETIME DEFAULT CURRENT_TIMESTAMP; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc UPDATE t1 SET e = 'Hello MySQL' WHERE a > 10; UPDATE t1 SET e = 'Hello MySQL!!' WHERE a > 20; SELECT distinct(e) FROM t1; UPDATE t1 SET c = 500 WHERE e LIKE '%world%'; SELECT c, e FROM t1 GROUP BY c, e; INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1; sleep 1; UPDATE t1 SET t = CURRENT_TIMESTAMP WHERE a < 50; SELECT count(t) FROM t1 GROUP BY t; DELETE FROM t1 WHERE a < 50; SELECT count(t) FROM t1 GROUP BY t; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 5: --echo # Create a small table, add some columns instantly, then do DDL --echo # to build indexes --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 = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 100, ADD COLUMN d INT GENERATED ALWAYS AS ((c * 2 + b)) VIRTUAL, ADD COLUMN e VARCHAR(100) DEFAULT 'Hello world'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc ALTER TABLE t1 ADD KEY(c); # Replace the numbers in the output with '#' to stablize the result, after all we only care about the index picked. --replace_column 8 # 10 # EXPLAIN SELECT c FROM t1; SELECT c FROM t1 WHERE c != 100; INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1; INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1; INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1; UPDATE t1 SET e = 'Hello MySQL' WHERE a > 30; ALTER TABLE t1 ADD KEY(e); # Replace the numbers in the output with '#' to stablize the result, after all we only care about the index picked. --replace_column 8 # 10 # EXPLAIN SELECT e FROM t1; SELECT count(e) FROM t1 WHERE e LIKE '%MySQL%'; SELECT count(e) FROM t1 WHERE e LIKE '%world%'; ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(a, c); SELECT a, c, e FROM t1 WHERE a > 25 AND a < 40; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 6: --echo # Create a small table, add some columns instantly, then do DML --echo # on the table, and some simple rollback --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 = 2; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 100, ADD COLUMN d INT GENERATED ALWAYS AS ((c * 2 + b)) VIRTUAL, ADD COLUMN e VARCHAR(100) DEFAULT 'Hello world'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc START TRANSACTION; INSERT INTO t1(a, b) VALUES(0, 6); SELECT * FROM t1; ROLLBACK; SELECT * FROM t1; START TRANSACTION; UPDATE t1 SET c = 500 WHERE a = 1; UPDATE t1 SET b = 1000 WHERE a = 2; SELECT a, b, c FROM t1 WHERE a = 1 OR a = 2; ROLLBACK; SELECT a, b, c FROM t1; START TRANSACTION; DELETE FROM t1 WHERE a < 5; INSERT INTO t1(a, b) VALUES(0, 6); SELECT * FROM t1; ROLLBACK; SELECT * FROM t1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; # One interesting pessimistic update rollback --eval CREATE TABLE t1(id INT PRIMARY KEY, c1 VARCHAR(4000), c2 VARCHAR(4000), c3 VARCHAR(1000)) ROW_FORMAT=$row_format INSERT INTO t1 VALUES(1, repeat('a', 4000), repeat('b', 4000), repeat('c', 1)); SELECT id, length(c1), length(c2), length(c3) FROM t1; let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c4 VARCHAR(500) NOT NULL DEFAULT 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1; START TRANSACTION; UPDATE t1 SET c1 = repeat('x', 200) WHERE id = 1; ROLLBACK; SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1; START TRANSACTION; UPDATE t1 SET c4 = 'x' WHERE id = 1; ROLLBACK; SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1; DROP TABLE t1; --echo # --echo # Scenario 7: --echo # Confirm some ADD COLUMN are instant, some are not --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); # ADD COLUMN after LAST should be INSTANT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 100 AFTER b; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc # ADD COLUMN in the middle should not be instant let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN d INT NOT NULL DEFAULT 100 AFTER b; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1; # ADD COLUMN with ADD KEY should not be instant let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN e INT NOT NULL DEFAULT 100, ADD KEY(e); --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1; # FORCE key word should not be instant let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN f INT NOT NULL DEFAULT 100, FORCE; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1; # ALGORITHM=INPLACE should not be instant, verify again here let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN g INT NOT NULL DEFAULT 100, ALGORITHM=INPLACE; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c TEXT, FULLTEXT(c)) ROW_FORMAT=$row_format INSERT INTO t1 VALUES(0, 1, 'Hello'), (0, 2, 'HELLO'), (0, 3, 'World'), (0, 4, 'Hello world'), (0, 5, 'HELLO WORLD'); # ADD COLUMN to FULLTEXT table should not be instant let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN d INT NOT NULL DEFAULT 100 AFTER b; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc DROP TABLE t1; --echo # --echo # Scenario 8: --echo # Check FK constraints on instantly added columns --echo # --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=$row_format CREATE TABLE t2(a INT NOT NULL PRIMARY KEY, b INT, c INT, KEY(c)); INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5); INSERT INTO t2 VALUES(1, 2, 3), (2, 3, 4), (3, 4, 5); let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 3; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc UPDATE t1 SET c = 4 WHERE a = 2; UPDATE t1 SET c = 5 WHERE a = 3; ALTER TABLE t1 ADD KEY(c); ALTER TABLE t2 ADD FOREIGN KEY (c) REFERENCES t1(c) ON UPDATE CASCADE, ALGORITHM = COPY; UPDATE t1 SET c = 10 WHERE a = 1; SELECT c FROM t2; UPDATE t1 SET c = 10; SELECT c FROM t2; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t2; DROP TABLE t1; --echo # --echo # Scenario 9: --echo # Instant ADD COLUMN on partitioned table, only simple test here --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); let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT * FROM t1; INSERT INTO t1 VALUES(0, 9, 10), (0, 10, 20); SELECT * FROM t1 WHERE b > 8; UPDATE t1 SET c = 8 WHERE a = 1 OR a = 3 OR a = 5 OR a = 7; SELECT * FROM t1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; # Check instant ADD COLUMN and then common ALTER TABLE and then instant ADD COLUMN --eval CREATE TABLE t1 (a INT, b INT) ROW_FORMAT=$row_format PARTITION BY HASH(a) PARTITIONS 2; let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc ALTER TABLE t1 CHANGE COLUMN c c1 INT; let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc DROP TABLE t1; --echo # --echo # Scenario 10: --echo # EXCHANGE PARTITION is not allowed if either is instant --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), (0, 6), (0, 7), (0, 8); let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc --eval CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c INT NOT NULL DEFAULT 5) 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)); # t1 is instant table, so should fail --error ER_PARTITION_EXCHANGE_DIFFERENT_OPTION ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1; # Make t2 an instant table ALTER TABLE t2 ADD COLUMN d INT; # Make t1 a non-instant table ALTER TABLE t1 ADD COLUMN d INT, ALGORITHM=INPLACE; # t2 is instant table, so should fail --error ER_PARTITION_EXCHANGE_DIFFERENT_OPTION ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1; OPTIMIZE TABLE t2; SHOW CREATE TABLE t1; SHOW CREATE TABLE t2; # Now this should succeed ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1; DROP TABLE t1, t2; --echo # --echo # Scenario 11: --echo # PRIMARY KEY with more than one column, at least to verify it works with REDUDANT --echo # --eval CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY(a, b)) ROW_FORMAT=$row_format; INSERT INTO t1 VALUES(0, 1), (1, 2), (2, 3), (3, 4); let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT * FROM t1; UPDATE t1 SET c = b WHERE b <= 2; CHECK TABLE t1; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Scenario 12: --echo # Mix ALTER PARTITION and ALTER TABLE ... INPLACE. This is to check if first partition is not --echo # instant after ALTER PARTITION, will the metadata be copied correctly --echo # --eval CREATE TABLE t1 (col1 INT, col2 INT, col3 INT, col4 TEXT) ENGINE = InnoDB PARTITION BY RANGE(col1 * 2) ( PARTITION p0 VALUES LESS THAN (128), PARTITION p1 VALUES LESS THAN (256) , PARTITION p2 VALUES LESS THAN (384) , PARTITION p3 VALUES LESS THAN MAXVALUE); INSERT INTO t1 VALUES(1, 2, 3, 'abcdefg'), (100, 200, 300, 'qwerty'), (200, 300, 400, 'asdfg'); let $new_cols = 2; let $instant_add_column = ALTER TABLE t1 ALGORITHM DEFAULT, ADD COLUMN col5 VARCHAR(500), ADD COLUMN col6 TEXT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT count(*) AS `Expect 4` FROM information_schema.innodb_tables WHERE instant_cols != 0; ALTER TABLE t1 ALGORITHM INPLACE, REORGANIZE PARTITION p0 INTO (PARTITION p0_a VALUES LESS THAN (64), PARTITION p0_b VALUES LESS THAN (128)); SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0; CHECK TABLE t1; ALTER TABLE t1 ALGORITHM DEFAULT, ADD KEY idx4(col4(10)); SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0; CHECK TABLE t1; ALTER TABLE t1 ALGORITHM DEFAULT, LOCK EXCLUSIVE, REORGANIZE PARTITION p0_a, p0_b INTO (PARTITION p0 VALUES LESS THAN (128) TABLESPACE innodb_file_per_table); SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0; CHECK TABLE t1; ALTER TABLE t1 ADD KEY idx3(col3); SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0; CHECK TABLE t1; SELECT * FROM t1; DROP TABLE t1; --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); let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0; ALTER TABLE t1 ADD PARTITION PARTITIONS 10; SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0; CHECK TABLE t1; ALTER TABLE t1 ADD KEY(b); SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0; CHECK TABLE t1; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Scenario 13: --echo # Create a table with a two level clustered index, do instant ADD COLUMN, then the non-leaf node --echo # should be parsed correctly --echo # --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, d INT NOT NULL, b BLOB NOT NULL, c VARCHAR(87), INDEX(d), INDEX(a ASC), PRIMARY KEY (a, d DESC, c DESC)) ROW_FORMAT=$row_format PARTITION BY LINEAR KEY(c) PARTITIONS 9; INSERT INTO t1(d, b, c) VALUES(1, 2, 'aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhjjjjjjj'); INSERT INTO t1(d, b, c) VALUES(2, 3, 'aaaaaaaaaahhhhhhhhhhbbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffggggggggggjjjjjjj'); INSERT INTO t1(d, b, c) VALUES(3, 4, 'bbbbbbbbbbaaaaaaaaaahhhhhhhhhhccccccccccddddddddddeeeeeeeeeeffffffffffggggggggggjjjjjjj'); INSERT INTO t1(d, b, c) VALUES(4, 5, 'eeeeeeeeeehhhhhhhhhhbbbbbbbbbbccccccccccddddddddddaaaaaaaaaaffffffffffggggggggggjjjjjjj'); INSERT INTO t1(d, b, c) VALUES(5, 6, 'aaaaaaaaaahhhhhhhhhhbbbbbbbbbbddddddddddcccccccccceeeeeeeeeeffffffffffggggggggggjjjjjjj'); INSERT INTO t1(d, b, c) VALUES(6, 7, 'cccccccccchhhhhhhhhhbbbbbbbbbbaaaaaaaaaaddddddddddeeeeeeeeeeffffffffffggggggggggjjjjjjj'); INSERT INTO t1(d, b, c) SELECT d, b, c FROM t1; INSERT INTO t1(d, b, c) SELECT d, b, c FROM t1; INSERT INTO t1(d, b, c) SELECT d, b, c FROM t1; INSERT INTO t1(d, b, c) SELECT d, b, c FROM t1; INSERT INTO t1(d, b, c) SELECT d, b, c FROM t1; INSERT INTO t1(d, b, c) SELECT d, b, c FROM t1; ALTER TABLE t1 ADD COLUMN nc086 BIGINT NOT NULL FIRST, ALGORITHM=INPLACE, LOCK=DEFAULT; CHECK TABLE t1; ALTER TABLE t1 ADD COLUMN nc082 TINYTEXT; CHECK TABLE t1; SELECT COUNT(*) FROM t1; DROP TABLE t1; --echo # --echo # Scenario 14: --echo # Create a small table, and add GIS kinds of new columns and verify --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); # ADD COLUMN POINT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 POINT, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; INSERT INTO t1(a, c1) VALUES(0, ST_PointFromText('POINT(10 10)')); SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL; # ADD COLUMN LINESTRING let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN d1 LINESTRING, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd1' AND has_default = 1; INSERT INTO t1(a, d1) VALUES(0, ST_LineFromText('LINESTRING(0 0,0 10,10 0)')); SELECT count(*) = max(a) FROM t1 WHERE d1 IS NULL; # ADD COLUMN POLYGON let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN e1 POLYGON, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e1' AND has_default = 1; INSERT INTO t1(a, e1) VALUES(0, ST_PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')); SELECT count(*) = max(a) FROM t1 WHERE e1 IS NULL; # ADD COLUMN MULTIPOINT let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN f1 MULTIPOINT, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f1' AND has_default = 1; INSERT INTO t1(a, f1) VALUES(0, ST_MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')); SELECT count(*) = max(a) FROM t1 WHERE f1 IS NULL; # ADD COLUMN MULTILINESTRING let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN g1 MULTILINESTRING, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g1' AND has_default = 1; INSERT INTO t1(a, g1) VALUES(0, ST_MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')); SELECT count(*) = max(a) FROM t1 WHERE g1 IS NULL; # ADD COLUMN MULTIPOLYGON let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN h1 MULTIPOLYGON, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h1' AND has_default = 1; INSERT INTO t1(a, h1) VALUES(0, ST_MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')); SELECT count(*) = max(a) FROM t1 WHERE h1 IS NULL; # ADD COLUMN GEOMETRYCOLLECTION let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN i1 GEOMETRYCOLLECTION, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'i1' AND has_default = 1; INSERT INTO t1(a, i1) VALUES(0, ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')); SELECT count(*) = max(a) FROM t1 WHERE i1 IS NULL; # ADD COLUMN GEOMETRY let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN j1 GEOMETRY, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'j1' AND has_default = 1; INSERT INTO t1(a, j1) VALUES(0, ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')); SELECT count(*) = max(a) FROM t1 WHERE j1 IS NULL; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 15: --echo # Create a small table, and add JSON columns and verify --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); # ADD COLUMN JSON let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 JSON, ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; INSERT INTO t1(a, c1) VALUES(0, '{"key1": "value1", "key2": "value2"}'); SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 16: --echo # Create a small table, and add INSTANT columns and verify with trigger --echo # --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=$row_format --eval CREATE TABLE t2 (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); INSERT INTO t2 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5); # ADD COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; # TRIGGERS AFTER INSERT INTO ADDED COLUMN CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES(0,6); INSERT INTO t1(a, c1) VALUES(0, 'bbbb'); SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa'; SELECT c1 FROM t1 WHERE c1 = 'bbbb'; DROP TRIGGER t1_ai; # ADD COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t2 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'cccc', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; # INSERT ROW INTO ADDED COLUMN USING TRIGGER CREATE TRIGGER t2_ai AFTER INSERT ON t2 FOR EACH ROW INSERT INTO t1(a,c1) VALUES(0,'eeee'); INSERT INTO t2(a, c1) VALUES(0, 'dddd'); SELECT count(*) = max(a) FROM t2 WHERE c1='cccc'; SELECT c1 FROM t2 WHERE c1 = 'dddd'; DROP TRIGGER t2_ai; CHECK TABLE t1; CHECK TABLE t2; SHOW CREATE TABLE t1; SHOW CREATE TABLE t2; DROP TABLE t1,t2; --echo # --echo # Scenario 17: --echo # Create a small table, and add INSTANT columns and verify with storedprocedure --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); # ADD COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; # STORED PROCEDURE CREATE PROCEDURE p1() INSERT INTO t1(a,c1) VALUES(0, 'bbbb'); CALL p1(); SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa'; SELECT c1 FROM t1 WHERE c1 = 'bbbb'; DROP PROCEDURE p1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 18: --echo # Create a small table, and add INSTANT columns and verify with view --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); # ADD COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; # CREATE VIEW CREATE VIEW v1 AS SELECT * FROM t1; INSERT INTO t1(a, c1) VALUES(0, 'bbbb'); SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa'; SELECT c1 FROM t1 WHERE c1 = 'bbbb'; SELECT * FROM v1; DROP VIEW v1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 19: --echo # Create a small table, and add INSTANT columns and drop it and verify --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); # ADD COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; INSERT INTO t1(a, c1) VALUES(0, 'bbbb'); SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa'; SELECT c1 FROM t1 WHERE c1 = 'bbbb'; # DROP COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 DROP COLUMN c1; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 20: --echo # Create a small table, and add INSTANT columns and rename table --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); # ADD COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc ALTER TABLE t1 RENAME t2; SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; INSERT INTO t2(a, c1) VALUES(0, 'bbbb'); SELECT count(*) = max(a) FROM t2 WHERE c1='aaaa'; SELECT c1 FROM t2 WHERE c1 = 'bbbb'; CHECK TABLE t2; SHOW CREATE TABLE t2; DROP TABLE t2; --echo # --echo # Scenario 21: --echo # Create a small table, and add INSTANT columns and change its data type INSTANTly won't work --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); # ADD COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; INSERT INTO t1(a, c1) VALUES(0, 'bbbb'); SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa'; SELECT c1 FROM t1 WHERE c1 = 'bbbb'; # change added column datatype should not be instant let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 CHANGE c1 c2 CHAR(10) NOT NULL DEFAULT 'cccc'; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 22: --echo # Create a small table, and add INSTANT columns and create hash,btree multi column index and verify --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); # ADD COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; # CREATE INDEX CREATE INDEX id1 ON t1(c1) USING BTREE; CREATE INDEX id2 ON t1(c1) USING HASH; INSERT INTO t1(a, c1) VALUES(0, 'bbbb'); SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa'; SELECT c1 FROM t1 WHERE c1 = 'bbbb'; DROP INDEX id1 ON t1; DROP INDEX id2 ON t1; # ADD ANOTHER COLUMN let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c2 VARCHAR(10) NOT NULL DEFAULT 'cccc', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c2' AND has_default = 1; # CREATE INDEX CREATE INDEX id1 ON t1(c1 ASC,c2 DESC) USING BTREE; INSERT INTO t1(a, c2) VALUES(0, 'dddd'); SELECT count(*) = max(a) FROM t1 WHERE c1='cccc'; SELECT c1 FROM t1 WHERE c1 = 'dddd'; # RENAME INDEX ALTER TABLE t1 RENAME INDEX id1 TO id2; DROP INDEX id2 ON t1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1; --echo # --echo # Scenario 23: --echo # Create a small table, and add INSTANT columns and perform table join operation --echo # --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=$row_format --eval CREATE TABLE t2 (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); INSERT INTO t2 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5); # ADD COLUMN TO TABLE t1 let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; INSERT INTO t1(a, c1) VALUES(0, 'cccc'); SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa'; SELECT c1 FROM t1 WHERE c1 = 'cccc'; # ADD COLUMN TO TABLE t2 let $new_cols = 1; let $instant_add_column = ALTER TABLE t2 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'bbbb', ALGORITHM = INSTANT; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1; INSERT INTO t2(a, c1) VALUES(0, 'cccc'); SELECT count(*) = max(a) FROM t2 WHERE c1='bbbb'; SELECT c1 FROM t2 WHERE c1 = 'cccc'; SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1; CHECK TABLE t1; CHECK TABLE t2; SHOW CREATE TABLE t1; SHOW CREATE TABLE t2; DROP TABLE t1; DROP TABLE t2; --echo # --echo # Scenario 24: --echo # Create a small table, and add stored and(or) virtual columns --echo # after last stored column in the table --echo # --eval CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c INT, d INT GENERATED ALWAYS AS (b + c) VIRTUAL, e INT GENERATED ALWAYS AS (b * c) VIRTUAL) ROW_FORMAT=$row_format INSERT INTO t1(a, b, c) VALUES(0, 1, 2), (0, 2, 3), (0, 3, 4), (0, 4, 5), (0, 5, 6); let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN h INT NOT NULL AFTER c; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc INSERT INTO t1(a, b, c, h) VALUES(0, 6, 20, 40); SELECT * FROM t1; let $new_cols = 1; let $instant_add_column = ALTER TABLE t1 ADD COLUMN i VARCHAR(100) DEFAULT 'ABCD EFGH' AFTER h, ADD COLUMN f INT GENERATED ALWAYS AS (LENGTH(i)) AFTER i; --source ../mysql-test/suite/innodb/include/instant_add_column_exec_and_verify.inc INSERT INTO t1(a, b, c, h, i) VALUES(0, 20, 30, 50, 'qwerty'); SELECT * FROM t1; CHECK TABLE t1; SHOW CREATE TABLE t1; DROP TABLE t1;