polardbxengine/mysql-test/suite/innodb/r/instant_add_column_basic.re...

6253 lines
202 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

##############################################
# Test instant ADD COLUMN for REDUNDANT format
##############################################
#
# Scenario 1:
# Create a small table, and add all kinds of new columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 INT, ALGORITHM=INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 1;
c1
1
ALTER TABLE t1 ADD COLUMN c2 INT NOT NULL DEFAULT 10;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c2' AND has_default = 1;
name default_value
c2 8000000a
INSERT INTO t1(a, c2) VALUES(0, 11);
SELECT count(*) = max(a) FROM t1 WHERE c2 = 10;
count(*) = max(a)
1
SELECT c2 FROM t1 WHERE c2 = 11;
c2
11
ALTER TABLE t1 ADD COLUMN d1 BIGINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd1' AND has_default = 1;
name default_value
d1 NULL
INSERT INTO t1(a, d1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE d1 IS NULL;
count(*) = max(a)
1
SELECT d1 FROM t1 WHERE d1 = 1;
d1
1
ALTER TABLE t1 ADD COLUMN d2 BIGINT NOT NULL DEFAULT 1234567890;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd2' AND has_default = 1;
name default_value
d2 80000000499602d2
INSERT INTO t1(a, d2) VALUES(0, 1234);
SELECT count(*) = max(a) FROM t1 WHERE d2 = 1234567890;
count(*) = max(a)
1
SELECT d2 FROM t1 WHERE d2 = 1234;
d2
1234
ALTER TABLE t1 ADD COLUMN e1 SMALLINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e1' AND has_default = 1;
name default_value
e1 NULL
INSERT INTO t1(a, e1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE e1 IS NULL;
count(*) = max(a)
1
SELECT e1 FROM t1 WHERE e1 = 1;
e1
1
ALTER TABLE t1 ADD COLUMN e2 SMALLINT NOT NULL DEFAULT 10;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e2' AND has_default = 1;
name default_value
e2 800a
INSERT INTO t1(a, e2) VALUES(0, 11);
SELECT count(*) = max(a) FROM t1 WHERE e2 = 10;
count(*) = max(a)
1
SELECT e2 FROM t1 WHERE e2 = 11;
e2
11
ALTER TABLE t1 ADD COLUMN f1 TINYINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f1' AND has_default = 1;
name default_value
f1 NULL
INSERT INTO t1(a, f1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE f1 IS NULL;
count(*) = max(a)
1
SELECT f1 FROM t1 WHERE f1 = 1;
f1
1
ALTER TABLE t1 ADD COLUMN f2 TINYINT NOT NULL DEFAULT 123;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f2' AND has_default = 1;
name default_value
f2 fb
INSERT INTO t1(a, f2) VALUES(0, 12);
SELECT count(*) = max(a) FROM t1 WHERE f2 = 123;
count(*) = max(a)
1
SELECT f2 FROM t1 WHERE f2 = 12;
f2
12
ALTER TABLE t1 ADD COLUMN g1 MEDIUMINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g1' AND has_default = 1;
name default_value
g1 NULL
INSERT INTO t1(a, g1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE g1 IS NULL;
count(*) = max(a)
1
SELECT g1 FROM t1 WHERE g1 = 1;
g1
1
ALTER TABLE t1 ADD COLUMN g2 MEDIUMINT NOT NULL DEFAULT 12345;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g2' AND has_default = 1;
name default_value
g2 803039
INSERT INTO t1(a, g2) VALUES(0, 1234);
SELECT count(*) = max(a) FROM t1 WHERE g2 = 12345;
count(*) = max(a)
1
SELECT g2 FROM t1 WHERE g2 = 1234;
g2
1234
ALTER TABLE t1 ADD COLUMN h1 FLOAT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h1' AND has_default = 1;
name default_value
h1 NULL
INSERT INTO t1(a, h1) VALUES(0, 1.0);
SELECT count(*) = max(a) FROM t1 WHERE h1 IS NULL;
count(*) = max(a)
1
SELECT h1 FROM t1 WHERE h1 = 1;
h1
1
ALTER TABLE t1 ADD COLUMN h2 FLOAT NOT NULL DEFAULT 12.34;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h2' AND has_default = 1;
name default_value
h2 a4704541
INSERT INTO t1(a, h2) VALUES(0, 1.234);
SELECT count(*) = max(a) FROM t1 WHERE h2 = 12.34;
count(*) = max(a)
NULL
SELECT h2 FROM t1 WHERE h2 = 1.234;
h2
ALTER TABLE t1 ADD COLUMN i1 DECIMAL(5, 2), ADD COLUMN i2 double, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'i1' OR name = 'i2') AND has_default = 1;
name default_value
i1 NULL
i2 NULL
INSERT INTO t1(a, i1, i2) VALUES(0, 10.10, 20.20);
SELECT count(*) = max(a) FROM t1 WHERE i1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE i2 IS NULL;
count(*) = max(a)
1
SELECT i1 FROM t1 WHERE i1 = 10.10;
i1
10.10
SELECT i2 FROM t1 WHERE i2 = 20.20;
i2
20.2
ALTER TABLE t1 ADD COLUMN j1 DECIMAL(5, 2) NOT NULL DEFAULT 100.00, ADD COLUMN j2 double NOT NULL DEFAULT 1000.5678;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'j1' OR name = 'j2') AND has_default = 1;
name default_value
j1 806400
j2 5af5b9da8a448f40
INSERT INTO t1(a, j1, j2) VALUES(0, 90.90, 1000.1234);
SELECT count(*) = max(a) FROM t1 WHERE j1 = 100.00;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE j2 = 1000.5678;
count(*) = max(a)
1
SELECT j1 FROM t1 WHERE j1 = 90.90;
j1
90.90
SELECT j2 FROM t1 WHERE j2 = 1000.1234;
j2
1000.1234
ALTER TABLE t1 ADD COLUMN k1 BIT(8), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'k1' AND has_default = 1;
name default_value
k1 NULL
INSERT INTO t1(a, k1) VALUES(0, b'010101');
SELECT count(*) = max(a) FROM t1 WHERE k1 IS NULL;
count(*) = max(a)
1
SELECT hex(k1) FROM t1 WHERE k1 = b'010101';
hex(k1)
15
ALTER TABLE t1 ADD COLUMN k2 BIT(8) NOT NULL DEFAULT b'101010';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'k2' AND has_default = 1;
name default_value
k2 2a
INSERT INTO t1(a, k2) VALUES(0, b'110011');
SELECT count(*) = max(a) FROM t1 WHERE k2 = b'101010';
count(*) = max(a)
1
SELECT hex(k2) FROM t1 WHERE k2 = b'110011';
hex(k2)
33
ALTER TABLE t1 ADD COLUMN l1 CHAR(50), ADD COLUMN l2 VARCHAR(100), ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'l1' OR name = 'l2') AND has_default = 1;
name default_value
l1 NULL
l2 NULL
INSERT INTO t1(a, l1, l2) VALUES(0, 'ABCD EFGH', 'abcdefg hijklmn ');
SELECT count(*) = max(a) FROM t1 WHERE l2 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE l1 IS NULL;
count(*) = max(a)
1
SELECT l1 FROM t1 WHERE l1 = 'ABCD EFGH';
l1
ABCD EFGH
SELECT l2 FROM t1 WHERE l2 = 'abcdefg hijklmn ';
l2
abcdefg hijklmn
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.';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'm1' OR name = 'm2') AND has_default = 1;
name default_value
m1 54686520666f78206a756d7073206f7665722020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020
m2 54686520666f78206a756d7073206f76657220746865206c617a7920646f672e
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';
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE m2 like 'The fox jumps%';
count(*) = max(a)
1
SELECT m1 FROM t1 WHERE m1 = 'over the lazy dog';
m1
over the lazy dog
SELECT m2 FROM t1 WHERE m2 like '%the fox.';
m2
The lazy dog jumps over the fox.
ALTER TABLE t1 ADD COLUMN n1 BINARY(10), ADD COLUMN n2 VARBINARY(10), ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'n1' OR name = 'n2') AND has_default = 1;
name default_value
n1 NULL
n2 NULL
INSERT INTO t1(a, n1, n2) VALUES(0, 0x010203040506070809, 0x102030405060708090);
SELECT count(*) = max(a) FROM t1 WHERE n1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE n2 IS NULL;
count(*) = max(a)
1
SELECT hex(n1) FROM t1 WHERE n1 = 0x01020304050607080900;
hex(n1)
01020304050607080900
SELECT hex(n2) FROM t1 WHERE n2 = 0x102030405060708090;
hex(n2)
102030405060708090
ALTER TABLE t1 ADD COLUMN o1 BINARY(10) DEFAULT 0x11223344, ADD COLUMN o2 VARBINARY(10) DEFAULT 0x55667788;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'o1' OR name = 'o2') AND has_default = 1;
name default_value
o1 11223344000000000000
o2 55667788
INSERT INTO t1(a, o1, o2) VALUES(0, 0x44332211, 0x88776655);
SELECT count(*) = max(a) FROM t1 WHERE o1 = 0x11223344000000000000;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE o2 = 0x55667788;
count(*) = max(a)
1
SELECT hex(o1) FROM t1 WHERE o1 = 0x44332211000000000000;
hex(o1)
44332211000000000000
SELECT hex(o2) FROM t1 WHERE o2 = 0x88776655;
hex(o2)
88776655
ALTER TABLE t1 ADD COLUMN p1 DATETIME, ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'p1' AND has_default = 1;
name default_value
p1 NULL
INSERT INTO t1(a, p1) VALUES(0, '2017-12-31 00:00:00');
SELECT count(*) = max(a) FROM t1 WHERE p1 IS NULL;
count(*) = max(a)
1
SELECT p1 FROM t1 WHERE p1 = '2017-12-31 00:00:00';
p1
2017-12-31 00:00:00
ALTER TABLE t1 ADD COLUMN p2 DATETIME NOT NULL DEFAULT '2017-12-31 01:02:03';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'p2' AND has_default = 1;
name default_value
p2 999e7e1083
SELECT count(*) = max(a) FROM t1 GROUP BY p2;
count(*) = max(a)
1
INSERT INTO t1(a, p2) VALUES(0, now());
SELECT count(*) FROM t1 GROUP BY p2;
count(*)
26
1
ALTER TABLE t1 ADD COLUMN q1 ENUM ('value1','value2','value3'), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'q1' AND has_default = 1;
name default_value
q1 NULL
INSERT INTO t1(a, q1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE q1 IS NULL;
count(*) = max(a)
1
SELECT q1 FROM t1 WHERE q1 = 1;
q1
value1
ALTER TABLE t1 ADD COLUMN r1 SET ('a','b','c'), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'r1' AND has_default = 1;
name default_value
r1 NULL
INSERT INTO t1(a, r1) VALUES(0, 'a');
SELECT count(*) = max(a) FROM t1 WHERE r1 IS NULL;
count(*) = max(a)
1
SELECT r1 FROM t1 WHERE r1 = 'a';
r1
a
ALTER TABLE t1 ADD COLUMN s1 BLOB, ADD COLUMN s2 TEXT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 's1' OR name = 's2') AND has_default = 1;
name default_value
s1 NULL
s2 NULL
INSERT INTO t1(a, s1, s2) VALUES(0, 0x0102030405, 'abcd qwerty');
SELECT count(*) = max(a) FROM t1 WHERE s1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE s2 IS NULL;
count(*) = max(a)
1
SELECT hex(s1) FROM t1 WHERE s1 = 0x0102030405;
hex(s1)
0102030405
SELECT s2 FROM t1 WHERE s2 = 'abcd qwerty';
s2
abcd qwerty
ALTER TABLE t1 ADD COLUMN u1 BLOB NOT NULL, ADD COLUMN u2 TEXT NOT NULL;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'u1' OR name = 'u2') AND has_default = 1;
name default_value
u1
u2
INSERT INTO t1(a, u1, u2) VALUES(0, 0x0102030405, 'abcd qwerty');
SELECT count(*) = max(a) FROM t1 WHERE u1 = '';
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE u2 = '';
count(*) = max(a)
1
SELECT hex(u1) FROM t1 WHERE u1 = 0x0102030405;
hex(u1)
0102030405
SELECT u2 FROM t1 WHERE u2 = 'abcd qwerty';
u2
abcd qwerty
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` int(11) DEFAULT NULL,
`c2` int(11) NOT NULL DEFAULT '10',
`d1` bigint(20) DEFAULT NULL,
`d2` bigint(20) NOT NULL DEFAULT '1234567890',
`e1` smallint(6) DEFAULT NULL,
`e2` smallint(6) NOT NULL DEFAULT '10',
`f1` tinyint(4) DEFAULT NULL,
`f2` tinyint(4) NOT NULL DEFAULT '123',
`g1` mediumint(9) DEFAULT NULL,
`g2` mediumint(9) NOT NULL DEFAULT '12345',
`h1` float DEFAULT NULL,
`h2` float NOT NULL DEFAULT '12.34',
`i1` decimal(5,2) DEFAULT NULL,
`i2` double DEFAULT NULL,
`j1` decimal(5,2) NOT NULL DEFAULT '100.00',
`j2` double NOT NULL DEFAULT '1000.5678',
`k1` bit(8) DEFAULT NULL,
`k2` bit(8) NOT NULL DEFAULT b'101010',
`l1` char(50) DEFAULT NULL,
`l2` varchar(100) DEFAULT NULL,
`m1` char(50) DEFAULT 'The fox jumps over',
`m2` varchar(50) DEFAULT 'The fox jumps over the lazy dog.',
`n1` binary(10) DEFAULT NULL,
`n2` varbinary(10) DEFAULT NULL,
`o1` binary(10) DEFAULT '"3D\0\0\0\0\0\0',
`o2` varbinary(10) DEFAULT 'Ufw?',
`p1` datetime DEFAULT NULL,
`p2` datetime NOT NULL DEFAULT '2017-12-31 01:02:03',
`q1` enum('value1','value2','value3') DEFAULT NULL,
`r1` set('a','b','c') DEFAULT NULL,
`s1` blob,
`s2` text,
`u1` blob NOT NULL,
`u2` text NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 2:
# Create a small table, add some columns instantly, along with
# virtual columns
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL, ADD COLUMN d INT GENERATED ALWAYS AS ((b * 2)) VIRTUAL;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c) VALUES(0, 6, 20);
SELECT * FROM t1;
a b c d
1 1 0 2
2 2 0 4
3 3 0 6
4 4 0 8
5 5 0 10
6 6 20 12
ALTER TABLE t1 ADD COLUMN e VARCHAR(100) DEFAULT 'ABCD EFGH', ADD COLUMN f INT GENERATED ALWAYS AS (LENGTH(e));
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, c, e) VALUES(0, 20, 'Hello'), (0, 20, 'World'), (0, 20, 'Hello World');
SELECT * FROM t1;
a b c d e f
1 1 0 2 ABCD EFGH 9
2 2 0 4 ABCD EFGH 9
3 3 0 6 ABCD EFGH 9
4 4 0 8 ABCD EFGH 9
5 5 0 10 ABCD EFGH 9
6 6 20 12 ABCD EFGH 9
7 NULL 20 NULL Hello 5
8 NULL 20 NULL World 5
9 NULL 20 NULL Hello World 11
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);
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c d e f g h i
1 1 0 2 ABCD EFGH 9 ABCD EFGH 10000 20001
2 2 0 4 ABCD EFGH 9 ABCD EFGH 10000 20002
3 3 0 6 ABCD EFGH 9 ABCD EFGH 10000 20003
4 4 0 8 ABCD EFGH 9 ABCD EFGH 10000 20004
5 5 0 10 ABCD EFGH 9 ABCD EFGH 10000 20005
6 6 20 12 ABCD EFGH 9 ABCD EFGH 10000 20006
7 NULL 20 NULL Hello 5 Hello 10000 NULL
8 NULL 20 NULL World 5 World 10000 NULL
9 NULL 20 NULL Hello World 11 Hello World 10000 NULL
INSERT INTO t1(a, b, c, h) VALUES(0, 7, 40, 2000), (0, 7, 40, 20000);
SELECT * FROM t1;
a b c d e f g h i
1 1 0 2 ABCD EFGH 9 ABCD EFGH 10000 20001
2 2 0 4 ABCD EFGH 9 ABCD EFGH 10000 20002
3 3 0 6 ABCD EFGH 9 ABCD EFGH 10000 20003
4 4 0 8 ABCD EFGH 9 ABCD EFGH 10000 20004
5 5 0 10 ABCD EFGH 9 ABCD EFGH 10000 20005
6 6 20 12 ABCD EFGH 9 ABCD EFGH 10000 20006
7 NULL 20 NULL Hello 5 Hello 10000 NULL
8 NULL 20 NULL World 5 World 10000 NULL
9 NULL 20 NULL Hello World 11 Hello World 10000 NULL
10 7 40 14 ABCD EFGH 9 ABCD EFGH 2000 4007
11 7 40 14 ABCD EFGH 9 ABCD EFGH 20000 40007
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL,
`d` int(11) GENERATED ALWAYS AS ((`b` * 2)) VIRTUAL,
`e` varchar(100) DEFAULT 'ABCD EFGH',
`f` int(11) GENERATED ALWAYS AS (length(`e`)) VIRTUAL,
`g` varchar(100) GENERATED ALWAYS AS (`e`) VIRTUAL,
`h` bigint(20) DEFAULT '10000',
`i` bigint(20) GENERATED ALWAYS AS (((`h` * 2) + `b`)) VIRTUAL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 3:
# Create a small table, add some columns instantly, then change
# their default values, check original default values are correct
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
INSERT INTO t1(a, b, c, e) VALUES(0, 6, 200, 'Good day'), (0, 7, 300, 'Good DAY');
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'c' AND has_default = 1;
default_value
80000064
ALTER TABLE t1 ALTER COLUMN c SET DEFAULT 500;
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'c' AND
has_default = 1;
default_value
80000064
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
INSERT INTO t1(a, b) VALUES(0, 8), (0, 9);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'e' AND has_default = 1;
default_value
48656c6c6f20776f726c64
ALTER TABLE t1 ALTER COLUMN e SET DEFAULT 'HELLO MySQL!';
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'e' AND has_default = 1;
default_value
48656c6c6f20776f726c64
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
INSERT INTO t1(a, b) VALUES(0, 10), (0, 20);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
10 10 500 1010 HELLO MySQL!
11 20 500 1020 HELLO MySQL!
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '500',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'HELLO MySQL!',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 4:
# Create a small table, add some columns instantly, then do DML
# on the table
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
UPDATE t1 SET c = 200 WHERE a > 3;
SELECT distinct(c) FROM t1;
c
100
200
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;
c
300
SELECT count(*) FROM t1;
count(*)
16
ALTER TABLE t1 ADD COLUMN t DATETIME DEFAULT CURRENT_TIMESTAMP;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
UPDATE t1 SET e = 'Hello MySQL' WHERE a > 10;
UPDATE t1 SET e = 'Hello MySQL!!' WHERE a > 20;
SELECT distinct(e) FROM t1;
e
Hello world
Hello MySQL
Hello MySQL!!
UPDATE t1 SET c = 500 WHERE e LIKE '%world%';
SELECT c, e FROM t1 GROUP BY c, e;
c e
500 Hello world
300 Hello MySQL
300 Hello MySQL!!
INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1;
UPDATE t1 SET t = CURRENT_TIMESTAMP WHERE a < 50;
SELECT count(t) FROM t1 GROUP BY t;
count(t)
16
16
DELETE FROM t1 WHERE a < 50;
SELECT count(t) FROM t1 GROUP BY t;
count(t)
16
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
`t` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 5:
# Create a small table, add some columns instantly, then do DDL
# to build indexes
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY(c);
EXPLAIN SELECT c FROM t1;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 NULL index NULL c # NULL # 100.00 Using index
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`c` AS `c` from `test`.`t1`
SELECT c FROM t1 WHERE c != 100;
c
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);
EXPLAIN SELECT e FROM t1;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 NULL index NULL e # NULL # 100.00 Using index
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`e` AS `e` from `test`.`t1`
SELECT count(e) FROM t1 WHERE e LIKE '%MySQL%';
count(e)
17
SELECT count(e) FROM t1 WHERE e LIKE '%world%';
count(e)
23
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(a, c);
SELECT a, c, e FROM t1 WHERE a > 25 AND a < 40;
a c e
28 100 Hello world
29 100 Hello world
30 100 Hello world
31 100 Hello MySQL
32 100 Hello MySQL
33 100 Hello MySQL
34 100 Hello MySQL
35 100 Hello MySQL
36 100 Hello MySQL
37 100 Hello MySQL
38 100 Hello MySQL
39 100 Hello MySQL
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
PRIMARY KEY (`a`,`c`),
KEY `c` (`c`),
KEY `e` (`e`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 6:
# Create a small table, add some columns instantly, then do DML
# on the table, and some simple rollback
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
START TRANSACTION;
INSERT INTO t1(a, b) VALUES(0, 6);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 100 206 Hello world
ROLLBACK;
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
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;
a b c
1 1 500
2 1000 100
ROLLBACK;
SELECT a, b, c FROM t1;
a b c
1 1 100
2 2 100
3 3 100
4 4 100
5 5 100
START TRANSACTION;
DELETE FROM t1 WHERE a < 5;
INSERT INTO t1(a, b) VALUES(0, 6);
SELECT * FROM t1;
a b c d e
5 5 100 205 Hello world
7 6 100 206 Hello world
ROLLBACK;
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
CREATE TABLE t1(id INT PRIMARY KEY, c1 VARCHAR(4000), c2 VARCHAR(4000), c3 VARCHAR(1000)) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(1, repeat('a', 4000), repeat('b', 4000), repeat('c', 1));
SELECT id, length(c1), length(c2), length(c3) FROM t1;
id length(c1) length(c2) length(c3)
1 4000 4000 1
ALTER TABLE t1 ADD COLUMN c4 VARCHAR(500) NOT NULL DEFAULT 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd';
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
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;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
START TRANSACTION;
UPDATE t1 SET c4 = 'x' WHERE id = 1;
ROLLBACK;
SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
DROP TABLE t1;
#
# Scenario 7:
# Confirm some ADD COLUMN are instant, some are not
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 100 AFTER b;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD COLUMN d INT NOT NULL DEFAULT 100 AFTER b;
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN e INT NOT NULL DEFAULT 100, ADD KEY(e);
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN f INT NOT NULL DEFAULT 100, FORCE;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN g INT NOT NULL DEFAULT 100, ALGORITHM=INPLACE;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`d` int(11) NOT NULL DEFAULT '100',
`c` int(11) NOT NULL DEFAULT '100',
`e` int(11) NOT NULL DEFAULT '100',
`f` int(11) NOT NULL DEFAULT '100',
`g` int(11) NOT NULL DEFAULT '100',
PRIMARY KEY (`a`),
KEY `e` (`e`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c TEXT, FULLTEXT(c)) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1, 'Hello'), (0, 2, 'HELLO'), (0, 3, 'World'), (0, 4, 'Hello world'), (0, 5, 'HELLO WORLD');
ALTER TABLE t1 ADD COLUMN d INT NOT NULL DEFAULT 100 AFTER b;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
#
# Scenario 8:
# Check FK constraints on instantly added columns
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 3;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
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;
c
4
5
10
UPDATE t1 SET c = 10;
SELECT c FROM t2;
c
10
10
10
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '3',
PRIMARY KEY (`a`),
KEY `c` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t2;
DROP TABLE t1;
#
# Scenario 9:
# Instant ADD COLUMN on partitioned table, only simple test here
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT 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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
3 3 5
6 6 5
1 1 5
4 4 5
7 7 5
2 2 5
5 5 5
8 8 5
INSERT INTO t1 VALUES(0, 9, 10), (0, 10, 20);
SELECT * FROM t1 WHERE b > 8;
a b c
9 9 10
10 10 20
UPDATE t1 SET c = 8 WHERE a = 1 OR a = 3 OR a = 5 OR a = 7;
SELECT * FROM t1;
a b c
3 3 8
6 6 5
9 9 10
1 1 8
4 4 5
7 7 8
10 10 20
2 2 5
5 5 8
8 8 5
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
/*!50100 PARTITION BY HASH (`a`)
PARTITIONS 3 */
DROP TABLE t1;
CREATE TABLE t1 (a INT, b INT) ROW_FORMAT=REDUNDANT PARTITION BY HASH(a) PARTITIONS 2;;
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 CHANGE COLUMN c c1 INT;
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
#
# Scenario 10:
# EXCHANGE PARTITION is not allowed if either is instant
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c INT NOT NULL DEFAULT 5) ROW_FORMAT=REDUNDANT PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN (20), PARTITION p3 VALUES LESS THAN (30));;
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
ERROR HY000: Non matching attribute 'INSTANT COLUMN(s)' between partition and table
ALTER TABLE t2 ADD COLUMN d INT;
ALTER TABLE t1 ADD COLUMN d INT, ALGORITHM=INPLACE;
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
ERROR HY000: Non matching attribute 'INSTANT COLUMN(s)' between partition and table
OPTIMIZE TABLE t2;
Table Op Msg_type Msg_text
test.t2 optimize note Table does not support optimize, doing recreate + analyze instead
test.t2 optimize status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
/*!50100 PARTITION BY RANGE (`a`)
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (30) ENGINE = InnoDB) */
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
DROP TABLE t1, t2;
#
# Scenario 11:
# PRIMARY KEY with more than one column, at least to verify it works with REDUDANT
#
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY(a, b)) ROW_FORMAT=REDUNDANT;;
INSERT INTO t1 VALUES(0, 1), (1, 2), (2, 3), (3, 4);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
0 1 5
1 2 5
2 3 5
3 4 5
UPDATE t1 SET c = b WHERE b <= 2;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
0 1 1
1 2 2
2 3 5
3 4 5
DROP TABLE t1;
#
# Scenario 12:
# Mix ALTER PARTITION and ALTER TABLE ... INPLACE. This is to check if first partition is not
# instant after ALTER PARTITION, will the metadata be copied correctly
#
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');
ALTER TABLE t1 ALGORITHM DEFAULT, ADD COLUMN col5 VARCHAR(500), ADD COLUMN col6 TEXT;
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 4` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 4
4
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;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ALGORITHM DEFAULT, ADD KEY idx4(col4(10));
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
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;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY idx3(col3);
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
col1 col2 col3 col4 col5 col6
1 2 3 abcdefg NULL NULL
100 200 300 qwerty NULL NULL
200 300 400 asdfg NULL NULL
DROP TABLE t1;
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT 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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
ALTER TABLE t1 ADD PARTITION PARTITIONS 10;
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY(b);
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
1 1 5
2 2 5
3 3 5
4 4 5
5 5 5
6 6 5
7 7 5
8 8 5
DROP TABLE t1;
#
# Scenario 13:
# Create a table with a two level clustered index, do instant ADD COLUMN, then the non-leaf node
# should be parsed correctly
#
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=REDUNDANT 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;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD COLUMN nc082 TINYTEXT;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT COUNT(*) FROM t1;
COUNT(*)
384
DROP TABLE t1;
#
# Scenario 14:
# Create a small table, and add GIS kinds of new columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 POINT, ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, ST_PointFromText('POINT(10 10)'));
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN d1 LINESTRING, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd1' AND has_default = 1;
name default_value
d1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN e1 POLYGON, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e1' AND has_default = 1;
name default_value
e1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN f1 MULTIPOINT, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f1' AND has_default = 1;
name default_value
f1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN g1 MULTILINESTRING, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g1' AND has_default = 1;
name default_value
g1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN h1 MULTIPOLYGON, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h1' AND has_default = 1;
name default_value
h1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN i1 GEOMETRYCOLLECTION, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'i1' AND has_default = 1;
name default_value
i1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN j1 GEOMETRY, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'j1' AND has_default = 1;
name default_value
j1 NULL
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;
count(*) = max(a)
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` point DEFAULT NULL,
`d1` linestring DEFAULT NULL,
`e1` polygon DEFAULT NULL,
`f1` multipoint DEFAULT NULL,
`g1` multilinestring DEFAULT NULL,
`h1` multipolygon DEFAULT NULL,
`i1` geomcollection DEFAULT NULL,
`j1` geometry DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 15:
# Create a small table, and add JSON columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 JSON, ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, '{"key1": "value1", "key2": "value2"}');
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` json DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 16:
# Create a small table, and add INSTANT columns and verify with trigger
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
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);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
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';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP TRIGGER t1_ai;
ALTER TABLE t2 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'cccc', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
c1 63636363
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';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'dddd';
c1
dddd
DROP TRIGGER t2_ai;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1,t2;
#
# Scenario 17:
# Create a small table, and add INSTANT columns and verify with storedprocedure
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE PROCEDURE p1() INSERT INTO t1(a,c1) VALUES(0, 'bbbb');
CALL p1();
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP PROCEDURE p1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 18:
# Create a small table, and add INSTANT columns and verify with view
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
SELECT * FROM v1;
a b c1
1 1 aaaa
2 2 aaaa
3 3 aaaa
4 4 aaaa
5 5 aaaa
6 NULL bbbb
DROP VIEW v1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 19:
# Create a small table, and add INSTANT columns and drop it and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
ALTER TABLE t1 DROP COLUMN c1;
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 20:
# Create a small table, and add INSTANT columns and rename table
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 RENAME t2;
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t2(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t2 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'bbbb';
c1
bbbb
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t2;
#
# Scenario 21:
# Create a small table, and add INSTANT columns and change its data type INSTANTly won't work
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
ALTER TABLE t1 CHANGE c1 c2 CHAR(10) NOT NULL DEFAULT 'cccc';
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c2` char(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 22:
# Create a small table, and add INSTANT columns and create hash,btree multi column index and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE INDEX id1 ON t1(c1) USING BTREE;
CREATE INDEX id2 ON t1(c1) USING HASH;
Warnings:
Note 3502 This storage engine does not support the HASH index algorithm, storage engine default was used instead.
Warning 1831 Duplicate index 'id2' defined on the table 'test.t1'. This is deprecated and will be disallowed in a future release.
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP INDEX id1 ON t1;
DROP INDEX id2 ON t1;
ALTER TABLE t1 ADD COLUMN c2 VARCHAR(10) NOT NULL DEFAULT 'cccc', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c2' AND has_default = 1;
name default_value
c2 63636363
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';
count(*) = max(a)
NULL
SELECT c1 FROM t1 WHERE c1 = 'dddd';
c1
ALTER TABLE t1 RENAME INDEX id1 TO id2;
DROP INDEX id2 ON t1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
`c2` varchar(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
#
# Scenario 23:
# Create a small table, and add INSTANT columns and perform table join operation
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=REDUNDANT;
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);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'cccc');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'cccc';
c1
cccc
ALTER TABLE t2 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'bbbb', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
c1 62626262
INSERT INTO t2(a, c1) VALUES(0, 'cccc');
SELECT count(*) = max(a) FROM t2 WHERE c1='bbbb';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'cccc';
c1
cccc
SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1;
a b c1 a b c1
6 NULL cccc 6 NULL cccc
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'bbbb',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
DROP TABLE t2;
#
# Scenario 24:
# Create a small table, and add stored and(or) virtual columns
# after last stored column in the table
#
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=REDUNDANT;
INSERT INTO t1(a, b, c) VALUES(0, 1, 2), (0, 2, 3), (0, 3, 4), (0, 4, 5), (0, 5, 6);
ALTER TABLE t1 ADD COLUMN h INT NOT NULL AFTER c;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c, h) VALUES(0, 6, 20, 40);
SELECT * FROM t1;
a b c h d e
1 1 2 0 3 2
2 2 3 0 5 6
3 3 4 0 7 12
4 4 5 0 9 20
5 5 6 0 11 30
6 6 20 40 26 120
ALTER TABLE t1 ADD COLUMN i VARCHAR(100) DEFAULT 'ABCD EFGH' AFTER h, ADD COLUMN f INT GENERATED ALWAYS AS (LENGTH(i)) AFTER i;
Table id did not change
SELECT 3 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c, h, i) VALUES(0, 20, 30, 50, 'qwerty');
SELECT * FROM t1;
a b c h i f d e
1 1 2 0 ABCD EFGH 9 3 2
2 2 3 0 ABCD EFGH 9 5 6
3 3 4 0 ABCD EFGH 9 7 12
4 4 5 0 ABCD EFGH 9 9 20
5 5 6 0 ABCD EFGH 9 11 30
6 6 20 40 ABCD EFGH 9 26 120
7 20 30 50 qwerty 6 50 600
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
`h` int(11) NOT NULL,
`i` varchar(100) DEFAULT 'ABCD EFGH',
`f` int(11) GENERATED ALWAYS AS (length(`i`)) VIRTUAL,
`d` int(11) GENERATED ALWAYS AS ((`b` + `c`)) VIRTUAL,
`e` int(11) GENERATED ALWAYS AS ((`b` * `c`)) VIRTUAL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=REDUNDANT
DROP TABLE t1;
############################################
# Test instant ADD COLUMN for DYNAMIC format
############################################
#
# Scenario 1:
# Create a small table, and add all kinds of new columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 INT, ALGORITHM=INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 1;
c1
1
ALTER TABLE t1 ADD COLUMN c2 INT NOT NULL DEFAULT 10;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c2' AND has_default = 1;
name default_value
c2 8000000a
INSERT INTO t1(a, c2) VALUES(0, 11);
SELECT count(*) = max(a) FROM t1 WHERE c2 = 10;
count(*) = max(a)
1
SELECT c2 FROM t1 WHERE c2 = 11;
c2
11
ALTER TABLE t1 ADD COLUMN d1 BIGINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd1' AND has_default = 1;
name default_value
d1 NULL
INSERT INTO t1(a, d1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE d1 IS NULL;
count(*) = max(a)
1
SELECT d1 FROM t1 WHERE d1 = 1;
d1
1
ALTER TABLE t1 ADD COLUMN d2 BIGINT NOT NULL DEFAULT 1234567890;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd2' AND has_default = 1;
name default_value
d2 80000000499602d2
INSERT INTO t1(a, d2) VALUES(0, 1234);
SELECT count(*) = max(a) FROM t1 WHERE d2 = 1234567890;
count(*) = max(a)
1
SELECT d2 FROM t1 WHERE d2 = 1234;
d2
1234
ALTER TABLE t1 ADD COLUMN e1 SMALLINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e1' AND has_default = 1;
name default_value
e1 NULL
INSERT INTO t1(a, e1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE e1 IS NULL;
count(*) = max(a)
1
SELECT e1 FROM t1 WHERE e1 = 1;
e1
1
ALTER TABLE t1 ADD COLUMN e2 SMALLINT NOT NULL DEFAULT 10;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e2' AND has_default = 1;
name default_value
e2 800a
INSERT INTO t1(a, e2) VALUES(0, 11);
SELECT count(*) = max(a) FROM t1 WHERE e2 = 10;
count(*) = max(a)
1
SELECT e2 FROM t1 WHERE e2 = 11;
e2
11
ALTER TABLE t1 ADD COLUMN f1 TINYINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f1' AND has_default = 1;
name default_value
f1 NULL
INSERT INTO t1(a, f1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE f1 IS NULL;
count(*) = max(a)
1
SELECT f1 FROM t1 WHERE f1 = 1;
f1
1
ALTER TABLE t1 ADD COLUMN f2 TINYINT NOT NULL DEFAULT 123;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f2' AND has_default = 1;
name default_value
f2 fb
INSERT INTO t1(a, f2) VALUES(0, 12);
SELECT count(*) = max(a) FROM t1 WHERE f2 = 123;
count(*) = max(a)
1
SELECT f2 FROM t1 WHERE f2 = 12;
f2
12
ALTER TABLE t1 ADD COLUMN g1 MEDIUMINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g1' AND has_default = 1;
name default_value
g1 NULL
INSERT INTO t1(a, g1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE g1 IS NULL;
count(*) = max(a)
1
SELECT g1 FROM t1 WHERE g1 = 1;
g1
1
ALTER TABLE t1 ADD COLUMN g2 MEDIUMINT NOT NULL DEFAULT 12345;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g2' AND has_default = 1;
name default_value
g2 803039
INSERT INTO t1(a, g2) VALUES(0, 1234);
SELECT count(*) = max(a) FROM t1 WHERE g2 = 12345;
count(*) = max(a)
1
SELECT g2 FROM t1 WHERE g2 = 1234;
g2
1234
ALTER TABLE t1 ADD COLUMN h1 FLOAT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h1' AND has_default = 1;
name default_value
h1 NULL
INSERT INTO t1(a, h1) VALUES(0, 1.0);
SELECT count(*) = max(a) FROM t1 WHERE h1 IS NULL;
count(*) = max(a)
1
SELECT h1 FROM t1 WHERE h1 = 1;
h1
1
ALTER TABLE t1 ADD COLUMN h2 FLOAT NOT NULL DEFAULT 12.34;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h2' AND has_default = 1;
name default_value
h2 a4704541
INSERT INTO t1(a, h2) VALUES(0, 1.234);
SELECT count(*) = max(a) FROM t1 WHERE h2 = 12.34;
count(*) = max(a)
NULL
SELECT h2 FROM t1 WHERE h2 = 1.234;
h2
ALTER TABLE t1 ADD COLUMN i1 DECIMAL(5, 2), ADD COLUMN i2 double, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'i1' OR name = 'i2') AND has_default = 1;
name default_value
i1 NULL
i2 NULL
INSERT INTO t1(a, i1, i2) VALUES(0, 10.10, 20.20);
SELECT count(*) = max(a) FROM t1 WHERE i1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE i2 IS NULL;
count(*) = max(a)
1
SELECT i1 FROM t1 WHERE i1 = 10.10;
i1
10.10
SELECT i2 FROM t1 WHERE i2 = 20.20;
i2
20.2
ALTER TABLE t1 ADD COLUMN j1 DECIMAL(5, 2) NOT NULL DEFAULT 100.00, ADD COLUMN j2 double NOT NULL DEFAULT 1000.5678;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'j1' OR name = 'j2') AND has_default = 1;
name default_value
j1 806400
j2 5af5b9da8a448f40
INSERT INTO t1(a, j1, j2) VALUES(0, 90.90, 1000.1234);
SELECT count(*) = max(a) FROM t1 WHERE j1 = 100.00;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE j2 = 1000.5678;
count(*) = max(a)
1
SELECT j1 FROM t1 WHERE j1 = 90.90;
j1
90.90
SELECT j2 FROM t1 WHERE j2 = 1000.1234;
j2
1000.1234
ALTER TABLE t1 ADD COLUMN k1 BIT(8), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'k1' AND has_default = 1;
name default_value
k1 NULL
INSERT INTO t1(a, k1) VALUES(0, b'010101');
SELECT count(*) = max(a) FROM t1 WHERE k1 IS NULL;
count(*) = max(a)
1
SELECT hex(k1) FROM t1 WHERE k1 = b'010101';
hex(k1)
15
ALTER TABLE t1 ADD COLUMN k2 BIT(8) NOT NULL DEFAULT b'101010';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'k2' AND has_default = 1;
name default_value
k2 2a
INSERT INTO t1(a, k2) VALUES(0, b'110011');
SELECT count(*) = max(a) FROM t1 WHERE k2 = b'101010';
count(*) = max(a)
1
SELECT hex(k2) FROM t1 WHERE k2 = b'110011';
hex(k2)
33
ALTER TABLE t1 ADD COLUMN l1 CHAR(50), ADD COLUMN l2 VARCHAR(100), ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'l1' OR name = 'l2') AND has_default = 1;
name default_value
l1 NULL
l2 NULL
INSERT INTO t1(a, l1, l2) VALUES(0, 'ABCD EFGH', 'abcdefg hijklmn ');
SELECT count(*) = max(a) FROM t1 WHERE l2 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE l1 IS NULL;
count(*) = max(a)
1
SELECT l1 FROM t1 WHERE l1 = 'ABCD EFGH';
l1
ABCD EFGH
SELECT l2 FROM t1 WHERE l2 = 'abcdefg hijklmn ';
l2
abcdefg hijklmn
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.';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'm1' OR name = 'm2') AND has_default = 1;
name default_value
m1 54686520666f78206a756d7073206f7665722020202020202020202020202020202020202020202020202020202020202020
m2 54686520666f78206a756d7073206f76657220746865206c617a7920646f672e
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';
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE m2 like 'The fox jumps%';
count(*) = max(a)
1
SELECT m1 FROM t1 WHERE m1 = 'over the lazy dog';
m1
over the lazy dog
SELECT m2 FROM t1 WHERE m2 like '%the fox.';
m2
The lazy dog jumps over the fox.
ALTER TABLE t1 ADD COLUMN n1 BINARY(10), ADD COLUMN n2 VARBINARY(10), ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'n1' OR name = 'n2') AND has_default = 1;
name default_value
n1 NULL
n2 NULL
INSERT INTO t1(a, n1, n2) VALUES(0, 0x010203040506070809, 0x102030405060708090);
SELECT count(*) = max(a) FROM t1 WHERE n1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE n2 IS NULL;
count(*) = max(a)
1
SELECT hex(n1) FROM t1 WHERE n1 = 0x01020304050607080900;
hex(n1)
01020304050607080900
SELECT hex(n2) FROM t1 WHERE n2 = 0x102030405060708090;
hex(n2)
102030405060708090
ALTER TABLE t1 ADD COLUMN o1 BINARY(10) DEFAULT 0x11223344, ADD COLUMN o2 VARBINARY(10) DEFAULT 0x55667788;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'o1' OR name = 'o2') AND has_default = 1;
name default_value
o1 11223344000000000000
o2 55667788
INSERT INTO t1(a, o1, o2) VALUES(0, 0x44332211, 0x88776655);
SELECT count(*) = max(a) FROM t1 WHERE o1 = 0x11223344000000000000;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE o2 = 0x55667788;
count(*) = max(a)
1
SELECT hex(o1) FROM t1 WHERE o1 = 0x44332211000000000000;
hex(o1)
44332211000000000000
SELECT hex(o2) FROM t1 WHERE o2 = 0x88776655;
hex(o2)
88776655
ALTER TABLE t1 ADD COLUMN p1 DATETIME, ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'p1' AND has_default = 1;
name default_value
p1 NULL
INSERT INTO t1(a, p1) VALUES(0, '2017-12-31 00:00:00');
SELECT count(*) = max(a) FROM t1 WHERE p1 IS NULL;
count(*) = max(a)
1
SELECT p1 FROM t1 WHERE p1 = '2017-12-31 00:00:00';
p1
2017-12-31 00:00:00
ALTER TABLE t1 ADD COLUMN p2 DATETIME NOT NULL DEFAULT '2017-12-31 01:02:03';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'p2' AND has_default = 1;
name default_value
p2 999e7e1083
SELECT count(*) = max(a) FROM t1 GROUP BY p2;
count(*) = max(a)
1
INSERT INTO t1(a, p2) VALUES(0, now());
SELECT count(*) FROM t1 GROUP BY p2;
count(*)
26
1
ALTER TABLE t1 ADD COLUMN q1 ENUM ('value1','value2','value3'), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'q1' AND has_default = 1;
name default_value
q1 NULL
INSERT INTO t1(a, q1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE q1 IS NULL;
count(*) = max(a)
1
SELECT q1 FROM t1 WHERE q1 = 1;
q1
value1
ALTER TABLE t1 ADD COLUMN r1 SET ('a','b','c'), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'r1' AND has_default = 1;
name default_value
r1 NULL
INSERT INTO t1(a, r1) VALUES(0, 'a');
SELECT count(*) = max(a) FROM t1 WHERE r1 IS NULL;
count(*) = max(a)
1
SELECT r1 FROM t1 WHERE r1 = 'a';
r1
a
ALTER TABLE t1 ADD COLUMN s1 BLOB, ADD COLUMN s2 TEXT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 's1' OR name = 's2') AND has_default = 1;
name default_value
s1 NULL
s2 NULL
INSERT INTO t1(a, s1, s2) VALUES(0, 0x0102030405, 'abcd qwerty');
SELECT count(*) = max(a) FROM t1 WHERE s1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE s2 IS NULL;
count(*) = max(a)
1
SELECT hex(s1) FROM t1 WHERE s1 = 0x0102030405;
hex(s1)
0102030405
SELECT s2 FROM t1 WHERE s2 = 'abcd qwerty';
s2
abcd qwerty
ALTER TABLE t1 ADD COLUMN u1 BLOB NOT NULL, ADD COLUMN u2 TEXT NOT NULL;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'u1' OR name = 'u2') AND has_default = 1;
name default_value
u1
u2
INSERT INTO t1(a, u1, u2) VALUES(0, 0x0102030405, 'abcd qwerty');
SELECT count(*) = max(a) FROM t1 WHERE u1 = '';
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE u2 = '';
count(*) = max(a)
1
SELECT hex(u1) FROM t1 WHERE u1 = 0x0102030405;
hex(u1)
0102030405
SELECT u2 FROM t1 WHERE u2 = 'abcd qwerty';
u2
abcd qwerty
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` int(11) DEFAULT NULL,
`c2` int(11) NOT NULL DEFAULT '10',
`d1` bigint(20) DEFAULT NULL,
`d2` bigint(20) NOT NULL DEFAULT '1234567890',
`e1` smallint(6) DEFAULT NULL,
`e2` smallint(6) NOT NULL DEFAULT '10',
`f1` tinyint(4) DEFAULT NULL,
`f2` tinyint(4) NOT NULL DEFAULT '123',
`g1` mediumint(9) DEFAULT NULL,
`g2` mediumint(9) NOT NULL DEFAULT '12345',
`h1` float DEFAULT NULL,
`h2` float NOT NULL DEFAULT '12.34',
`i1` decimal(5,2) DEFAULT NULL,
`i2` double DEFAULT NULL,
`j1` decimal(5,2) NOT NULL DEFAULT '100.00',
`j2` double NOT NULL DEFAULT '1000.5678',
`k1` bit(8) DEFAULT NULL,
`k2` bit(8) NOT NULL DEFAULT b'101010',
`l1` char(50) DEFAULT NULL,
`l2` varchar(100) DEFAULT NULL,
`m1` char(50) DEFAULT 'The fox jumps over',
`m2` varchar(50) DEFAULT 'The fox jumps over the lazy dog.',
`n1` binary(10) DEFAULT NULL,
`n2` varbinary(10) DEFAULT NULL,
`o1` binary(10) DEFAULT '"3D\0\0\0\0\0\0',
`o2` varbinary(10) DEFAULT 'Ufw?',
`p1` datetime DEFAULT NULL,
`p2` datetime NOT NULL DEFAULT '2017-12-31 01:02:03',
`q1` enum('value1','value2','value3') DEFAULT NULL,
`r1` set('a','b','c') DEFAULT NULL,
`s1` blob,
`s2` text,
`u1` blob NOT NULL,
`u2` text NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 2:
# Create a small table, add some columns instantly, along with
# virtual columns
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL, ADD COLUMN d INT GENERATED ALWAYS AS ((b * 2)) VIRTUAL;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c) VALUES(0, 6, 20);
SELECT * FROM t1;
a b c d
1 1 0 2
2 2 0 4
3 3 0 6
4 4 0 8
5 5 0 10
6 6 20 12
ALTER TABLE t1 ADD COLUMN e VARCHAR(100) DEFAULT 'ABCD EFGH', ADD COLUMN f INT GENERATED ALWAYS AS (LENGTH(e));
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, c, e) VALUES(0, 20, 'Hello'), (0, 20, 'World'), (0, 20, 'Hello World');
SELECT * FROM t1;
a b c d e f
1 1 0 2 ABCD EFGH 9
2 2 0 4 ABCD EFGH 9
3 3 0 6 ABCD EFGH 9
4 4 0 8 ABCD EFGH 9
5 5 0 10 ABCD EFGH 9
6 6 20 12 ABCD EFGH 9
7 NULL 20 NULL Hello 5
8 NULL 20 NULL World 5
9 NULL 20 NULL Hello World 11
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);
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c d e f g h i
1 1 0 2 ABCD EFGH 9 ABCD EFGH 10000 20001
2 2 0 4 ABCD EFGH 9 ABCD EFGH 10000 20002
3 3 0 6 ABCD EFGH 9 ABCD EFGH 10000 20003
4 4 0 8 ABCD EFGH 9 ABCD EFGH 10000 20004
5 5 0 10 ABCD EFGH 9 ABCD EFGH 10000 20005
6 6 20 12 ABCD EFGH 9 ABCD EFGH 10000 20006
7 NULL 20 NULL Hello 5 Hello 10000 NULL
8 NULL 20 NULL World 5 World 10000 NULL
9 NULL 20 NULL Hello World 11 Hello World 10000 NULL
INSERT INTO t1(a, b, c, h) VALUES(0, 7, 40, 2000), (0, 7, 40, 20000);
SELECT * FROM t1;
a b c d e f g h i
1 1 0 2 ABCD EFGH 9 ABCD EFGH 10000 20001
2 2 0 4 ABCD EFGH 9 ABCD EFGH 10000 20002
3 3 0 6 ABCD EFGH 9 ABCD EFGH 10000 20003
4 4 0 8 ABCD EFGH 9 ABCD EFGH 10000 20004
5 5 0 10 ABCD EFGH 9 ABCD EFGH 10000 20005
6 6 20 12 ABCD EFGH 9 ABCD EFGH 10000 20006
7 NULL 20 NULL Hello 5 Hello 10000 NULL
8 NULL 20 NULL World 5 World 10000 NULL
9 NULL 20 NULL Hello World 11 Hello World 10000 NULL
10 7 40 14 ABCD EFGH 9 ABCD EFGH 2000 4007
11 7 40 14 ABCD EFGH 9 ABCD EFGH 20000 40007
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL,
`d` int(11) GENERATED ALWAYS AS ((`b` * 2)) VIRTUAL,
`e` varchar(100) DEFAULT 'ABCD EFGH',
`f` int(11) GENERATED ALWAYS AS (length(`e`)) VIRTUAL,
`g` varchar(100) GENERATED ALWAYS AS (`e`) VIRTUAL,
`h` bigint(20) DEFAULT '10000',
`i` bigint(20) GENERATED ALWAYS AS (((`h` * 2) + `b`)) VIRTUAL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 3:
# Create a small table, add some columns instantly, then change
# their default values, check original default values are correct
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
INSERT INTO t1(a, b, c, e) VALUES(0, 6, 200, 'Good day'), (0, 7, 300, 'Good DAY');
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'c' AND has_default = 1;
default_value
80000064
ALTER TABLE t1 ALTER COLUMN c SET DEFAULT 500;
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'c' AND
has_default = 1;
default_value
80000064
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
INSERT INTO t1(a, b) VALUES(0, 8), (0, 9);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'e' AND has_default = 1;
default_value
48656c6c6f20776f726c64
ALTER TABLE t1 ALTER COLUMN e SET DEFAULT 'HELLO MySQL!';
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'e' AND has_default = 1;
default_value
48656c6c6f20776f726c64
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
INSERT INTO t1(a, b) VALUES(0, 10), (0, 20);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
10 10 500 1010 HELLO MySQL!
11 20 500 1020 HELLO MySQL!
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '500',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'HELLO MySQL!',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 4:
# Create a small table, add some columns instantly, then do DML
# on the table
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
UPDATE t1 SET c = 200 WHERE a > 3;
SELECT distinct(c) FROM t1;
c
100
200
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;
c
300
SELECT count(*) FROM t1;
count(*)
16
ALTER TABLE t1 ADD COLUMN t DATETIME DEFAULT CURRENT_TIMESTAMP;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
UPDATE t1 SET e = 'Hello MySQL' WHERE a > 10;
UPDATE t1 SET e = 'Hello MySQL!!' WHERE a > 20;
SELECT distinct(e) FROM t1;
e
Hello world
Hello MySQL
Hello MySQL!!
UPDATE t1 SET c = 500 WHERE e LIKE '%world%';
SELECT c, e FROM t1 GROUP BY c, e;
c e
500 Hello world
300 Hello MySQL
300 Hello MySQL!!
INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1;
UPDATE t1 SET t = CURRENT_TIMESTAMP WHERE a < 50;
SELECT count(t) FROM t1 GROUP BY t;
count(t)
16
16
DELETE FROM t1 WHERE a < 50;
SELECT count(t) FROM t1 GROUP BY t;
count(t)
16
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
`t` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 5:
# Create a small table, add some columns instantly, then do DDL
# to build indexes
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY(c);
EXPLAIN SELECT c FROM t1;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 NULL index NULL c # NULL # 100.00 Using index
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`c` AS `c` from `test`.`t1`
SELECT c FROM t1 WHERE c != 100;
c
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);
EXPLAIN SELECT e FROM t1;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 NULL index NULL e # NULL # 100.00 Using index
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`e` AS `e` from `test`.`t1`
SELECT count(e) FROM t1 WHERE e LIKE '%MySQL%';
count(e)
17
SELECT count(e) FROM t1 WHERE e LIKE '%world%';
count(e)
23
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(a, c);
SELECT a, c, e FROM t1 WHERE a > 25 AND a < 40;
a c e
28 100 Hello world
29 100 Hello world
30 100 Hello world
31 100 Hello MySQL
32 100 Hello MySQL
33 100 Hello MySQL
34 100 Hello MySQL
35 100 Hello MySQL
36 100 Hello MySQL
37 100 Hello MySQL
38 100 Hello MySQL
39 100 Hello MySQL
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
PRIMARY KEY (`a`,`c`),
KEY `c` (`c`),
KEY `e` (`e`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 6:
# Create a small table, add some columns instantly, then do DML
# on the table, and some simple rollback
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
START TRANSACTION;
INSERT INTO t1(a, b) VALUES(0, 6);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 100 206 Hello world
ROLLBACK;
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
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;
a b c
1 1 500
2 1000 100
ROLLBACK;
SELECT a, b, c FROM t1;
a b c
1 1 100
2 2 100
3 3 100
4 4 100
5 5 100
START TRANSACTION;
DELETE FROM t1 WHERE a < 5;
INSERT INTO t1(a, b) VALUES(0, 6);
SELECT * FROM t1;
a b c d e
5 5 100 205 Hello world
7 6 100 206 Hello world
ROLLBACK;
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
CREATE TABLE t1(id INT PRIMARY KEY, c1 VARCHAR(4000), c2 VARCHAR(4000), c3 VARCHAR(1000)) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(1, repeat('a', 4000), repeat('b', 4000), repeat('c', 1));
SELECT id, length(c1), length(c2), length(c3) FROM t1;
id length(c1) length(c2) length(c3)
1 4000 4000 1
ALTER TABLE t1 ADD COLUMN c4 VARCHAR(500) NOT NULL DEFAULT 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd';
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
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;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
START TRANSACTION;
UPDATE t1 SET c4 = 'x' WHERE id = 1;
ROLLBACK;
SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
DROP TABLE t1;
#
# Scenario 7:
# Confirm some ADD COLUMN are instant, some are not
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 100 AFTER b;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD COLUMN d INT NOT NULL DEFAULT 100 AFTER b;
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN e INT NOT NULL DEFAULT 100, ADD KEY(e);
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN f INT NOT NULL DEFAULT 100, FORCE;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN g INT NOT NULL DEFAULT 100, ALGORITHM=INPLACE;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`d` int(11) NOT NULL DEFAULT '100',
`c` int(11) NOT NULL DEFAULT '100',
`e` int(11) NOT NULL DEFAULT '100',
`f` int(11) NOT NULL DEFAULT '100',
`g` int(11) NOT NULL DEFAULT '100',
PRIMARY KEY (`a`),
KEY `e` (`e`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c TEXT, FULLTEXT(c)) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1, 'Hello'), (0, 2, 'HELLO'), (0, 3, 'World'), (0, 4, 'Hello world'), (0, 5, 'HELLO WORLD');
ALTER TABLE t1 ADD COLUMN d INT NOT NULL DEFAULT 100 AFTER b;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
#
# Scenario 8:
# Check FK constraints on instantly added columns
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 3;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
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;
c
4
5
10
UPDATE t1 SET c = 10;
SELECT c FROM t2;
c
10
10
10
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '3',
PRIMARY KEY (`a`),
KEY `c` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t2;
DROP TABLE t1;
#
# Scenario 9:
# Instant ADD COLUMN on partitioned table, only simple test here
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC 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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
3 3 5
6 6 5
1 1 5
4 4 5
7 7 5
2 2 5
5 5 5
8 8 5
INSERT INTO t1 VALUES(0, 9, 10), (0, 10, 20);
SELECT * FROM t1 WHERE b > 8;
a b c
9 9 10
10 10 20
UPDATE t1 SET c = 8 WHERE a = 1 OR a = 3 OR a = 5 OR a = 7;
SELECT * FROM t1;
a b c
3 3 8
6 6 5
9 9 10
1 1 8
4 4 5
7 7 8
10 10 20
2 2 5
5 5 8
8 8 5
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
/*!50100 PARTITION BY HASH (`a`)
PARTITIONS 3 */
DROP TABLE t1;
CREATE TABLE t1 (a INT, b INT) ROW_FORMAT=DYNAMIC PARTITION BY HASH(a) PARTITIONS 2;;
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 CHANGE COLUMN c c1 INT;
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
#
# Scenario 10:
# EXCHANGE PARTITION is not allowed if either is instant
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c INT NOT NULL DEFAULT 5) ROW_FORMAT=DYNAMIC PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN (20), PARTITION p3 VALUES LESS THAN (30));;
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
ERROR HY000: Non matching attribute 'INSTANT COLUMN(s)' between partition and table
ALTER TABLE t2 ADD COLUMN d INT;
ALTER TABLE t1 ADD COLUMN d INT, ALGORITHM=INPLACE;
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
ERROR HY000: Non matching attribute 'INSTANT COLUMN(s)' between partition and table
OPTIMIZE TABLE t2;
Table Op Msg_type Msg_text
test.t2 optimize note Table does not support optimize, doing recreate + analyze instead
test.t2 optimize status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
/*!50100 PARTITION BY RANGE (`a`)
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (30) ENGINE = InnoDB) */
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
DROP TABLE t1, t2;
#
# Scenario 11:
# PRIMARY KEY with more than one column, at least to verify it works with REDUDANT
#
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY(a, b)) ROW_FORMAT=DYNAMIC;;
INSERT INTO t1 VALUES(0, 1), (1, 2), (2, 3), (3, 4);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
0 1 5
1 2 5
2 3 5
3 4 5
UPDATE t1 SET c = b WHERE b <= 2;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
0 1 1
1 2 2
2 3 5
3 4 5
DROP TABLE t1;
#
# Scenario 12:
# Mix ALTER PARTITION and ALTER TABLE ... INPLACE. This is to check if first partition is not
# instant after ALTER PARTITION, will the metadata be copied correctly
#
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');
ALTER TABLE t1 ALGORITHM DEFAULT, ADD COLUMN col5 VARCHAR(500), ADD COLUMN col6 TEXT;
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 4` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 4
4
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;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ALGORITHM DEFAULT, ADD KEY idx4(col4(10));
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
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;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY idx3(col3);
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
col1 col2 col3 col4 col5 col6
1 2 3 abcdefg NULL NULL
100 200 300 qwerty NULL NULL
200 300 400 asdfg NULL NULL
DROP TABLE t1;
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC 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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
ALTER TABLE t1 ADD PARTITION PARTITIONS 10;
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY(b);
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
1 1 5
2 2 5
3 3 5
4 4 5
5 5 5
6 6 5
7 7 5
8 8 5
DROP TABLE t1;
#
# Scenario 13:
# Create a table with a two level clustered index, do instant ADD COLUMN, then the non-leaf node
# should be parsed correctly
#
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=DYNAMIC 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;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD COLUMN nc082 TINYTEXT;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT COUNT(*) FROM t1;
COUNT(*)
384
DROP TABLE t1;
#
# Scenario 14:
# Create a small table, and add GIS kinds of new columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 POINT, ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, ST_PointFromText('POINT(10 10)'));
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN d1 LINESTRING, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd1' AND has_default = 1;
name default_value
d1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN e1 POLYGON, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e1' AND has_default = 1;
name default_value
e1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN f1 MULTIPOINT, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f1' AND has_default = 1;
name default_value
f1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN g1 MULTILINESTRING, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g1' AND has_default = 1;
name default_value
g1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN h1 MULTIPOLYGON, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h1' AND has_default = 1;
name default_value
h1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN i1 GEOMETRYCOLLECTION, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'i1' AND has_default = 1;
name default_value
i1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN j1 GEOMETRY, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'j1' AND has_default = 1;
name default_value
j1 NULL
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;
count(*) = max(a)
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` point DEFAULT NULL,
`d1` linestring DEFAULT NULL,
`e1` polygon DEFAULT NULL,
`f1` multipoint DEFAULT NULL,
`g1` multilinestring DEFAULT NULL,
`h1` multipolygon DEFAULT NULL,
`i1` geomcollection DEFAULT NULL,
`j1` geometry DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 15:
# Create a small table, and add JSON columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 JSON, ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, '{"key1": "value1", "key2": "value2"}');
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` json DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 16:
# Create a small table, and add INSTANT columns and verify with trigger
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
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);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
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';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP TRIGGER t1_ai;
ALTER TABLE t2 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'cccc', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
c1 63636363
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';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'dddd';
c1
dddd
DROP TRIGGER t2_ai;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1,t2;
#
# Scenario 17:
# Create a small table, and add INSTANT columns and verify with storedprocedure
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE PROCEDURE p1() INSERT INTO t1(a,c1) VALUES(0, 'bbbb');
CALL p1();
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP PROCEDURE p1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 18:
# Create a small table, and add INSTANT columns and verify with view
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
SELECT * FROM v1;
a b c1
1 1 aaaa
2 2 aaaa
3 3 aaaa
4 4 aaaa
5 5 aaaa
6 NULL bbbb
DROP VIEW v1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 19:
# Create a small table, and add INSTANT columns and drop it and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
ALTER TABLE t1 DROP COLUMN c1;
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 20:
# Create a small table, and add INSTANT columns and rename table
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 RENAME t2;
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t2(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t2 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'bbbb';
c1
bbbb
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t2;
#
# Scenario 21:
# Create a small table, and add INSTANT columns and change its data type INSTANTly won't work
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
ALTER TABLE t1 CHANGE c1 c2 CHAR(10) NOT NULL DEFAULT 'cccc';
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c2` char(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 22:
# Create a small table, and add INSTANT columns and create hash,btree multi column index and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE INDEX id1 ON t1(c1) USING BTREE;
CREATE INDEX id2 ON t1(c1) USING HASH;
Warnings:
Note 3502 This storage engine does not support the HASH index algorithm, storage engine default was used instead.
Warning 1831 Duplicate index 'id2' defined on the table 'test.t1'. This is deprecated and will be disallowed in a future release.
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP INDEX id1 ON t1;
DROP INDEX id2 ON t1;
ALTER TABLE t1 ADD COLUMN c2 VARCHAR(10) NOT NULL DEFAULT 'cccc', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c2' AND has_default = 1;
name default_value
c2 63636363
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';
count(*) = max(a)
NULL
SELECT c1 FROM t1 WHERE c1 = 'dddd';
c1
ALTER TABLE t1 RENAME INDEX id1 TO id2;
DROP INDEX id2 ON t1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
`c2` varchar(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
#
# Scenario 23:
# Create a small table, and add INSTANT columns and perform table join operation
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=DYNAMIC;
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);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'cccc');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'cccc';
c1
cccc
ALTER TABLE t2 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'bbbb', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
c1 62626262
INSERT INTO t2(a, c1) VALUES(0, 'cccc');
SELECT count(*) = max(a) FROM t2 WHERE c1='bbbb';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'cccc';
c1
cccc
SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1;
a b c1 a b c1
6 NULL cccc 6 NULL cccc
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'bbbb',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
DROP TABLE t2;
#
# Scenario 24:
# Create a small table, and add stored and(or) virtual columns
# after last stored column in the table
#
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=DYNAMIC;
INSERT INTO t1(a, b, c) VALUES(0, 1, 2), (0, 2, 3), (0, 3, 4), (0, 4, 5), (0, 5, 6);
ALTER TABLE t1 ADD COLUMN h INT NOT NULL AFTER c;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c, h) VALUES(0, 6, 20, 40);
SELECT * FROM t1;
a b c h d e
1 1 2 0 3 2
2 2 3 0 5 6
3 3 4 0 7 12
4 4 5 0 9 20
5 5 6 0 11 30
6 6 20 40 26 120
ALTER TABLE t1 ADD COLUMN i VARCHAR(100) DEFAULT 'ABCD EFGH' AFTER h, ADD COLUMN f INT GENERATED ALWAYS AS (LENGTH(i)) AFTER i;
Table id did not change
SELECT 3 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c, h, i) VALUES(0, 20, 30, 50, 'qwerty');
SELECT * FROM t1;
a b c h i f d e
1 1 2 0 ABCD EFGH 9 3 2
2 2 3 0 ABCD EFGH 9 5 6
3 3 4 0 ABCD EFGH 9 7 12
4 4 5 0 ABCD EFGH 9 9 20
5 5 6 0 ABCD EFGH 9 11 30
6 6 20 40 ABCD EFGH 9 26 120
7 20 30 50 qwerty 6 50 600
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
`h` int(11) NOT NULL,
`i` varchar(100) DEFAULT 'ABCD EFGH',
`f` int(11) GENERATED ALWAYS AS (length(`i`)) VIRTUAL,
`d` int(11) GENERATED ALWAYS AS ((`b` + `c`)) VIRTUAL,
`e` int(11) GENERATED ALWAYS AS ((`b` * `c`)) VIRTUAL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
DROP TABLE t1;
############################################
# Test instant ADD COLUMN for COMPACT format
############################################
#
# Scenario 1:
# Create a small table, and add all kinds of new columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 INT, ALGORITHM=INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 1;
c1
1
ALTER TABLE t1 ADD COLUMN c2 INT NOT NULL DEFAULT 10;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c2' AND has_default = 1;
name default_value
c2 8000000a
INSERT INTO t1(a, c2) VALUES(0, 11);
SELECT count(*) = max(a) FROM t1 WHERE c2 = 10;
count(*) = max(a)
1
SELECT c2 FROM t1 WHERE c2 = 11;
c2
11
ALTER TABLE t1 ADD COLUMN d1 BIGINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd1' AND has_default = 1;
name default_value
d1 NULL
INSERT INTO t1(a, d1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE d1 IS NULL;
count(*) = max(a)
1
SELECT d1 FROM t1 WHERE d1 = 1;
d1
1
ALTER TABLE t1 ADD COLUMN d2 BIGINT NOT NULL DEFAULT 1234567890;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd2' AND has_default = 1;
name default_value
d2 80000000499602d2
INSERT INTO t1(a, d2) VALUES(0, 1234);
SELECT count(*) = max(a) FROM t1 WHERE d2 = 1234567890;
count(*) = max(a)
1
SELECT d2 FROM t1 WHERE d2 = 1234;
d2
1234
ALTER TABLE t1 ADD COLUMN e1 SMALLINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e1' AND has_default = 1;
name default_value
e1 NULL
INSERT INTO t1(a, e1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE e1 IS NULL;
count(*) = max(a)
1
SELECT e1 FROM t1 WHERE e1 = 1;
e1
1
ALTER TABLE t1 ADD COLUMN e2 SMALLINT NOT NULL DEFAULT 10;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e2' AND has_default = 1;
name default_value
e2 800a
INSERT INTO t1(a, e2) VALUES(0, 11);
SELECT count(*) = max(a) FROM t1 WHERE e2 = 10;
count(*) = max(a)
1
SELECT e2 FROM t1 WHERE e2 = 11;
e2
11
ALTER TABLE t1 ADD COLUMN f1 TINYINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f1' AND has_default = 1;
name default_value
f1 NULL
INSERT INTO t1(a, f1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE f1 IS NULL;
count(*) = max(a)
1
SELECT f1 FROM t1 WHERE f1 = 1;
f1
1
ALTER TABLE t1 ADD COLUMN f2 TINYINT NOT NULL DEFAULT 123;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f2' AND has_default = 1;
name default_value
f2 fb
INSERT INTO t1(a, f2) VALUES(0, 12);
SELECT count(*) = max(a) FROM t1 WHERE f2 = 123;
count(*) = max(a)
1
SELECT f2 FROM t1 WHERE f2 = 12;
f2
12
ALTER TABLE t1 ADD COLUMN g1 MEDIUMINT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g1' AND has_default = 1;
name default_value
g1 NULL
INSERT INTO t1(a, g1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE g1 IS NULL;
count(*) = max(a)
1
SELECT g1 FROM t1 WHERE g1 = 1;
g1
1
ALTER TABLE t1 ADD COLUMN g2 MEDIUMINT NOT NULL DEFAULT 12345;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g2' AND has_default = 1;
name default_value
g2 803039
INSERT INTO t1(a, g2) VALUES(0, 1234);
SELECT count(*) = max(a) FROM t1 WHERE g2 = 12345;
count(*) = max(a)
1
SELECT g2 FROM t1 WHERE g2 = 1234;
g2
1234
ALTER TABLE t1 ADD COLUMN h1 FLOAT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h1' AND has_default = 1;
name default_value
h1 NULL
INSERT INTO t1(a, h1) VALUES(0, 1.0);
SELECT count(*) = max(a) FROM t1 WHERE h1 IS NULL;
count(*) = max(a)
1
SELECT h1 FROM t1 WHERE h1 = 1;
h1
1
ALTER TABLE t1 ADD COLUMN h2 FLOAT NOT NULL DEFAULT 12.34;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h2' AND has_default = 1;
name default_value
h2 a4704541
INSERT INTO t1(a, h2) VALUES(0, 1.234);
SELECT count(*) = max(a) FROM t1 WHERE h2 = 12.34;
count(*) = max(a)
NULL
SELECT h2 FROM t1 WHERE h2 = 1.234;
h2
ALTER TABLE t1 ADD COLUMN i1 DECIMAL(5, 2), ADD COLUMN i2 double, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'i1' OR name = 'i2') AND has_default = 1;
name default_value
i1 NULL
i2 NULL
INSERT INTO t1(a, i1, i2) VALUES(0, 10.10, 20.20);
SELECT count(*) = max(a) FROM t1 WHERE i1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE i2 IS NULL;
count(*) = max(a)
1
SELECT i1 FROM t1 WHERE i1 = 10.10;
i1
10.10
SELECT i2 FROM t1 WHERE i2 = 20.20;
i2
20.2
ALTER TABLE t1 ADD COLUMN j1 DECIMAL(5, 2) NOT NULL DEFAULT 100.00, ADD COLUMN j2 double NOT NULL DEFAULT 1000.5678;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'j1' OR name = 'j2') AND has_default = 1;
name default_value
j1 806400
j2 5af5b9da8a448f40
INSERT INTO t1(a, j1, j2) VALUES(0, 90.90, 1000.1234);
SELECT count(*) = max(a) FROM t1 WHERE j1 = 100.00;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE j2 = 1000.5678;
count(*) = max(a)
1
SELECT j1 FROM t1 WHERE j1 = 90.90;
j1
90.90
SELECT j2 FROM t1 WHERE j2 = 1000.1234;
j2
1000.1234
ALTER TABLE t1 ADD COLUMN k1 BIT(8), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'k1' AND has_default = 1;
name default_value
k1 NULL
INSERT INTO t1(a, k1) VALUES(0, b'010101');
SELECT count(*) = max(a) FROM t1 WHERE k1 IS NULL;
count(*) = max(a)
1
SELECT hex(k1) FROM t1 WHERE k1 = b'010101';
hex(k1)
15
ALTER TABLE t1 ADD COLUMN k2 BIT(8) NOT NULL DEFAULT b'101010';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'k2' AND has_default = 1;
name default_value
k2 2a
INSERT INTO t1(a, k2) VALUES(0, b'110011');
SELECT count(*) = max(a) FROM t1 WHERE k2 = b'101010';
count(*) = max(a)
1
SELECT hex(k2) FROM t1 WHERE k2 = b'110011';
hex(k2)
33
ALTER TABLE t1 ADD COLUMN l1 CHAR(50), ADD COLUMN l2 VARCHAR(100), ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'l1' OR name = 'l2') AND has_default = 1;
name default_value
l1 NULL
l2 NULL
INSERT INTO t1(a, l1, l2) VALUES(0, 'ABCD EFGH', 'abcdefg hijklmn ');
SELECT count(*) = max(a) FROM t1 WHERE l2 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE l1 IS NULL;
count(*) = max(a)
1
SELECT l1 FROM t1 WHERE l1 = 'ABCD EFGH';
l1
ABCD EFGH
SELECT l2 FROM t1 WHERE l2 = 'abcdefg hijklmn ';
l2
abcdefg hijklmn
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.';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'm1' OR name = 'm2') AND has_default = 1;
name default_value
m1 54686520666f78206a756d7073206f7665722020202020202020202020202020202020202020202020202020202020202020
m2 54686520666f78206a756d7073206f76657220746865206c617a7920646f672e
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';
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE m2 like 'The fox jumps%';
count(*) = max(a)
1
SELECT m1 FROM t1 WHERE m1 = 'over the lazy dog';
m1
over the lazy dog
SELECT m2 FROM t1 WHERE m2 like '%the fox.';
m2
The lazy dog jumps over the fox.
ALTER TABLE t1 ADD COLUMN n1 BINARY(10), ADD COLUMN n2 VARBINARY(10), ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'n1' OR name = 'n2') AND has_default = 1;
name default_value
n1 NULL
n2 NULL
INSERT INTO t1(a, n1, n2) VALUES(0, 0x010203040506070809, 0x102030405060708090);
SELECT count(*) = max(a) FROM t1 WHERE n1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE n2 IS NULL;
count(*) = max(a)
1
SELECT hex(n1) FROM t1 WHERE n1 = 0x01020304050607080900;
hex(n1)
01020304050607080900
SELECT hex(n2) FROM t1 WHERE n2 = 0x102030405060708090;
hex(n2)
102030405060708090
ALTER TABLE t1 ADD COLUMN o1 BINARY(10) DEFAULT 0x11223344, ADD COLUMN o2 VARBINARY(10) DEFAULT 0x55667788;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'o1' OR name = 'o2') AND has_default = 1;
name default_value
o1 11223344000000000000
o2 55667788
INSERT INTO t1(a, o1, o2) VALUES(0, 0x44332211, 0x88776655);
SELECT count(*) = max(a) FROM t1 WHERE o1 = 0x11223344000000000000;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE o2 = 0x55667788;
count(*) = max(a)
1
SELECT hex(o1) FROM t1 WHERE o1 = 0x44332211000000000000;
hex(o1)
44332211000000000000
SELECT hex(o2) FROM t1 WHERE o2 = 0x88776655;
hex(o2)
88776655
ALTER TABLE t1 ADD COLUMN p1 DATETIME, ALGORITHM=DEFAULT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'p1' AND has_default = 1;
name default_value
p1 NULL
INSERT INTO t1(a, p1) VALUES(0, '2017-12-31 00:00:00');
SELECT count(*) = max(a) FROM t1 WHERE p1 IS NULL;
count(*) = max(a)
1
SELECT p1 FROM t1 WHERE p1 = '2017-12-31 00:00:00';
p1
2017-12-31 00:00:00
ALTER TABLE t1 ADD COLUMN p2 DATETIME NOT NULL DEFAULT '2017-12-31 01:02:03';
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'p2' AND has_default = 1;
name default_value
p2 999e7e1083
SELECT count(*) = max(a) FROM t1 GROUP BY p2;
count(*) = max(a)
1
INSERT INTO t1(a, p2) VALUES(0, now());
SELECT count(*) FROM t1 GROUP BY p2;
count(*)
26
1
ALTER TABLE t1 ADD COLUMN q1 ENUM ('value1','value2','value3'), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'q1' AND has_default = 1;
name default_value
q1 NULL
INSERT INTO t1(a, q1) VALUES(0, 1);
SELECT count(*) = max(a) FROM t1 WHERE q1 IS NULL;
count(*) = max(a)
1
SELECT q1 FROM t1 WHERE q1 = 1;
q1
value1
ALTER TABLE t1 ADD COLUMN r1 SET ('a','b','c'), ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'r1' AND has_default = 1;
name default_value
r1 NULL
INSERT INTO t1(a, r1) VALUES(0, 'a');
SELECT count(*) = max(a) FROM t1 WHERE r1 IS NULL;
count(*) = max(a)
1
SELECT r1 FROM t1 WHERE r1 = 'a';
r1
a
ALTER TABLE t1 ADD COLUMN s1 BLOB, ADD COLUMN s2 TEXT, ALGORITHM=INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 's1' OR name = 's2') AND has_default = 1;
name default_value
s1 NULL
s2 NULL
INSERT INTO t1(a, s1, s2) VALUES(0, 0x0102030405, 'abcd qwerty');
SELECT count(*) = max(a) FROM t1 WHERE s1 IS NULL;
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE s2 IS NULL;
count(*) = max(a)
1
SELECT hex(s1) FROM t1 WHERE s1 = 0x0102030405;
hex(s1)
0102030405
SELECT s2 FROM t1 WHERE s2 = 'abcd qwerty';
s2
abcd qwerty
ALTER TABLE t1 ADD COLUMN u1 BLOB NOT NULL, ADD COLUMN u2 TEXT NOT NULL;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE (name = 'u1' OR name = 'u2') AND has_default = 1;
name default_value
u1
u2
INSERT INTO t1(a, u1, u2) VALUES(0, 0x0102030405, 'abcd qwerty');
SELECT count(*) = max(a) FROM t1 WHERE u1 = '';
count(*) = max(a)
1
SELECT count(*) = max(a) FROM t1 WHERE u2 = '';
count(*) = max(a)
1
SELECT hex(u1) FROM t1 WHERE u1 = 0x0102030405;
hex(u1)
0102030405
SELECT u2 FROM t1 WHERE u2 = 'abcd qwerty';
u2
abcd qwerty
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` int(11) DEFAULT NULL,
`c2` int(11) NOT NULL DEFAULT '10',
`d1` bigint(20) DEFAULT NULL,
`d2` bigint(20) NOT NULL DEFAULT '1234567890',
`e1` smallint(6) DEFAULT NULL,
`e2` smallint(6) NOT NULL DEFAULT '10',
`f1` tinyint(4) DEFAULT NULL,
`f2` tinyint(4) NOT NULL DEFAULT '123',
`g1` mediumint(9) DEFAULT NULL,
`g2` mediumint(9) NOT NULL DEFAULT '12345',
`h1` float DEFAULT NULL,
`h2` float NOT NULL DEFAULT '12.34',
`i1` decimal(5,2) DEFAULT NULL,
`i2` double DEFAULT NULL,
`j1` decimal(5,2) NOT NULL DEFAULT '100.00',
`j2` double NOT NULL DEFAULT '1000.5678',
`k1` bit(8) DEFAULT NULL,
`k2` bit(8) NOT NULL DEFAULT b'101010',
`l1` char(50) DEFAULT NULL,
`l2` varchar(100) DEFAULT NULL,
`m1` char(50) DEFAULT 'The fox jumps over',
`m2` varchar(50) DEFAULT 'The fox jumps over the lazy dog.',
`n1` binary(10) DEFAULT NULL,
`n2` varbinary(10) DEFAULT NULL,
`o1` binary(10) DEFAULT '"3D\0\0\0\0\0\0',
`o2` varbinary(10) DEFAULT 'Ufw?',
`p1` datetime DEFAULT NULL,
`p2` datetime NOT NULL DEFAULT '2017-12-31 01:02:03',
`q1` enum('value1','value2','value3') DEFAULT NULL,
`r1` set('a','b','c') DEFAULT NULL,
`s1` blob,
`s2` text,
`u1` blob NOT NULL,
`u2` text NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 2:
# Create a small table, add some columns instantly, along with
# virtual columns
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL, ADD COLUMN d INT GENERATED ALWAYS AS ((b * 2)) VIRTUAL;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c) VALUES(0, 6, 20);
SELECT * FROM t1;
a b c d
1 1 0 2
2 2 0 4
3 3 0 6
4 4 0 8
5 5 0 10
6 6 20 12
ALTER TABLE t1 ADD COLUMN e VARCHAR(100) DEFAULT 'ABCD EFGH', ADD COLUMN f INT GENERATED ALWAYS AS (LENGTH(e));
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, c, e) VALUES(0, 20, 'Hello'), (0, 20, 'World'), (0, 20, 'Hello World');
SELECT * FROM t1;
a b c d e f
1 1 0 2 ABCD EFGH 9
2 2 0 4 ABCD EFGH 9
3 3 0 6 ABCD EFGH 9
4 4 0 8 ABCD EFGH 9
5 5 0 10 ABCD EFGH 9
6 6 20 12 ABCD EFGH 9
7 NULL 20 NULL Hello 5
8 NULL 20 NULL World 5
9 NULL 20 NULL Hello World 11
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);
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c d e f g h i
1 1 0 2 ABCD EFGH 9 ABCD EFGH 10000 20001
2 2 0 4 ABCD EFGH 9 ABCD EFGH 10000 20002
3 3 0 6 ABCD EFGH 9 ABCD EFGH 10000 20003
4 4 0 8 ABCD EFGH 9 ABCD EFGH 10000 20004
5 5 0 10 ABCD EFGH 9 ABCD EFGH 10000 20005
6 6 20 12 ABCD EFGH 9 ABCD EFGH 10000 20006
7 NULL 20 NULL Hello 5 Hello 10000 NULL
8 NULL 20 NULL World 5 World 10000 NULL
9 NULL 20 NULL Hello World 11 Hello World 10000 NULL
INSERT INTO t1(a, b, c, h) VALUES(0, 7, 40, 2000), (0, 7, 40, 20000);
SELECT * FROM t1;
a b c d e f g h i
1 1 0 2 ABCD EFGH 9 ABCD EFGH 10000 20001
2 2 0 4 ABCD EFGH 9 ABCD EFGH 10000 20002
3 3 0 6 ABCD EFGH 9 ABCD EFGH 10000 20003
4 4 0 8 ABCD EFGH 9 ABCD EFGH 10000 20004
5 5 0 10 ABCD EFGH 9 ABCD EFGH 10000 20005
6 6 20 12 ABCD EFGH 9 ABCD EFGH 10000 20006
7 NULL 20 NULL Hello 5 Hello 10000 NULL
8 NULL 20 NULL World 5 World 10000 NULL
9 NULL 20 NULL Hello World 11 Hello World 10000 NULL
10 7 40 14 ABCD EFGH 9 ABCD EFGH 2000 4007
11 7 40 14 ABCD EFGH 9 ABCD EFGH 20000 40007
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL,
`d` int(11) GENERATED ALWAYS AS ((`b` * 2)) VIRTUAL,
`e` varchar(100) DEFAULT 'ABCD EFGH',
`f` int(11) GENERATED ALWAYS AS (length(`e`)) VIRTUAL,
`g` varchar(100) GENERATED ALWAYS AS (`e`) VIRTUAL,
`h` bigint(20) DEFAULT '10000',
`i` bigint(20) GENERATED ALWAYS AS (((`h` * 2) + `b`)) VIRTUAL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 3:
# Create a small table, add some columns instantly, then change
# their default values, check original default values are correct
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
INSERT INTO t1(a, b, c, e) VALUES(0, 6, 200, 'Good day'), (0, 7, 300, 'Good DAY');
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'c' AND has_default = 1;
default_value
80000064
ALTER TABLE t1 ALTER COLUMN c SET DEFAULT 500;
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'c' AND
has_default = 1;
default_value
80000064
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
INSERT INTO t1(a, b) VALUES(0, 8), (0, 9);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'e' AND has_default = 1;
default_value
48656c6c6f20776f726c64
ALTER TABLE t1 ALTER COLUMN e SET DEFAULT 'HELLO MySQL!';
SELECT default_value FROM information_schema.innodb_columns WHERE name = 'e' AND has_default = 1;
default_value
48656c6c6f20776f726c64
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
INSERT INTO t1(a, b) VALUES(0, 10), (0, 20);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 200 406 Good day
7 7 300 607 Good DAY
8 8 500 1008 Hello world
9 9 500 1009 Hello world
10 10 500 1010 HELLO MySQL!
11 20 500 1020 HELLO MySQL!
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '500',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'HELLO MySQL!',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 4:
# Create a small table, add some columns instantly, then do DML
# on the table
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
UPDATE t1 SET c = 200 WHERE a > 3;
SELECT distinct(c) FROM t1;
c
100
200
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;
c
300
SELECT count(*) FROM t1;
count(*)
16
ALTER TABLE t1 ADD COLUMN t DATETIME DEFAULT CURRENT_TIMESTAMP;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
UPDATE t1 SET e = 'Hello MySQL' WHERE a > 10;
UPDATE t1 SET e = 'Hello MySQL!!' WHERE a > 20;
SELECT distinct(e) FROM t1;
e
Hello world
Hello MySQL
Hello MySQL!!
UPDATE t1 SET c = 500 WHERE e LIKE '%world%';
SELECT c, e FROM t1 GROUP BY c, e;
c e
500 Hello world
300 Hello MySQL
300 Hello MySQL!!
INSERT INTO t1(b, c, e) SELECT b, c, e FROM t1;
UPDATE t1 SET t = CURRENT_TIMESTAMP WHERE a < 50;
SELECT count(t) FROM t1 GROUP BY t;
count(t)
16
16
DELETE FROM t1 WHERE a < 50;
SELECT count(t) FROM t1 GROUP BY t;
count(t)
16
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
`t` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 5:
# Create a small table, add some columns instantly, then do DDL
# to build indexes
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY(c);
EXPLAIN SELECT c FROM t1;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 NULL index NULL c # NULL # 100.00 Using index
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`c` AS `c` from `test`.`t1`
SELECT c FROM t1 WHERE c != 100;
c
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);
EXPLAIN SELECT e FROM t1;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 NULL index NULL e # NULL # 100.00 Using index
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`e` AS `e` from `test`.`t1`
SELECT count(e) FROM t1 WHERE e LIKE '%MySQL%';
count(e)
17
SELECT count(e) FROM t1 WHERE e LIKE '%world%';
count(e)
23
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(a, c);
SELECT a, c, e FROM t1 WHERE a > 25 AND a < 40;
a c e
28 100 Hello world
29 100 Hello world
30 100 Hello world
31 100 Hello MySQL
32 100 Hello MySQL
33 100 Hello MySQL
34 100 Hello MySQL
35 100 Hello MySQL
36 100 Hello MySQL
37 100 Hello MySQL
38 100 Hello MySQL
39 100 Hello MySQL
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
PRIMARY KEY (`a`,`c`),
KEY `c` (`c`),
KEY `e` (`e`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 6:
# Create a small table, add some columns instantly, then do DML
# on the table, and some simple rollback
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
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';
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
START TRANSACTION;
INSERT INTO t1(a, b) VALUES(0, 6);
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
6 6 100 206 Hello world
ROLLBACK;
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
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;
a b c
1 1 500
2 1000 100
ROLLBACK;
SELECT a, b, c FROM t1;
a b c
1 1 100
2 2 100
3 3 100
4 4 100
5 5 100
START TRANSACTION;
DELETE FROM t1 WHERE a < 5;
INSERT INTO t1(a, b) VALUES(0, 6);
SELECT * FROM t1;
a b c d e
5 5 100 205 Hello world
7 6 100 206 Hello world
ROLLBACK;
SELECT * FROM t1;
a b c d e
1 1 100 201 Hello world
2 2 100 202 Hello world
3 3 100 203 Hello world
4 4 100 204 Hello world
5 5 100 205 Hello world
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '100',
`d` int(11) GENERATED ALWAYS AS (((`c` * 2) + `b`)) VIRTUAL,
`e` varchar(100) DEFAULT 'Hello world',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
CREATE TABLE t1(id INT PRIMARY KEY, c1 VARCHAR(4000), c2 VARCHAR(4000), c3 VARCHAR(1000)) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(1, repeat('a', 4000), repeat('b', 4000), repeat('c', 1));
SELECT id, length(c1), length(c2), length(c3) FROM t1;
id length(c1) length(c2) length(c3)
1 4000 4000 1
ALTER TABLE t1 ADD COLUMN c4 VARCHAR(500) NOT NULL DEFAULT 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd';
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
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;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
START TRANSACTION;
UPDATE t1 SET c4 = 'x' WHERE id = 1;
ROLLBACK;
SELECT id, length(c1), length(c2), length(c3), length(c4) FROM t1;
id length(c1) length(c2) length(c3) length(c4)
1 4000 4000 1 500
DROP TABLE t1;
#
# Scenario 7:
# Confirm some ADD COLUMN are instant, some are not
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 100 AFTER b;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD COLUMN d INT NOT NULL DEFAULT 100 AFTER b;
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN e INT NOT NULL DEFAULT 100, ADD KEY(e);
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN f INT NOT NULL DEFAULT 100, FORCE;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
ALTER TABLE t1 ADD COLUMN g INT NOT NULL DEFAULT 100, ALGORITHM=INPLACE;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_columns WHERE has_default = 1;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`d` int(11) NOT NULL DEFAULT '100',
`c` int(11) NOT NULL DEFAULT '100',
`e` int(11) NOT NULL DEFAULT '100',
`f` int(11) NOT NULL DEFAULT '100',
`g` int(11) NOT NULL DEFAULT '100',
PRIMARY KEY (`a`),
KEY `e` (`e`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c TEXT, FULLTEXT(c)) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1, 'Hello'), (0, 2, 'HELLO'), (0, 3, 'World'), (0, 4, 'Hello world'), (0, 5, 'HELLO WORLD');
ALTER TABLE t1 ADD COLUMN d INT NOT NULL DEFAULT 100 AFTER b;
Table ID differed
count(*) = 1
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
#
# Scenario 8:
# Check FK constraints on instantly added columns
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 3;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
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;
c
4
5
10
UPDATE t1 SET c = 10;
SELECT c FROM t2;
c
10
10
10
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '3',
PRIMARY KEY (`a`),
KEY `c` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t2;
DROP TABLE t1;
#
# Scenario 9:
# Instant ADD COLUMN on partitioned table, only simple test here
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT 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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
3 3 5
6 6 5
1 1 5
4 4 5
7 7 5
2 2 5
5 5 5
8 8 5
INSERT INTO t1 VALUES(0, 9, 10), (0, 10, 20);
SELECT * FROM t1 WHERE b > 8;
a b c
9 9 10
10 10 20
UPDATE t1 SET c = 8 WHERE a = 1 OR a = 3 OR a = 5 OR a = 7;
SELECT * FROM t1;
a b c
3 3 8
6 6 5
9 9 10
1 1 8
4 4 5
7 7 8
10 10 20
2 2 5
5 5 8
8 8 5
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
/*!50100 PARTITION BY HASH (`a`)
PARTITIONS 3 */
DROP TABLE t1;
CREATE TABLE t1 (a INT, b INT) ROW_FORMAT=COMPACT PARTITION BY HASH(a) PARTITIONS 2;;
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 CHANGE COLUMN c c1 INT;
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
#
# Scenario 10:
# EXCHANGE PARTITION is not allowed if either is instant
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c INT NOT NULL DEFAULT 5) ROW_FORMAT=COMPACT PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN (20), PARTITION p3 VALUES LESS THAN (30));;
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
ERROR HY000: Non matching attribute 'INSTANT COLUMN(s)' between partition and table
ALTER TABLE t2 ADD COLUMN d INT;
ALTER TABLE t1 ADD COLUMN d INT, ALGORITHM=INPLACE;
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
ERROR HY000: Non matching attribute 'INSTANT COLUMN(s)' between partition and table
OPTIMIZE TABLE t2;
Table Op Msg_type Msg_text
test.t2 optimize note Table does not support optimize, doing recreate + analyze instead
test.t2 optimize status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) NOT NULL DEFAULT '5',
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
/*!50100 PARTITION BY RANGE (`a`)
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (30) ENGINE = InnoDB) */
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1;
DROP TABLE t1, t2;
#
# Scenario 11:
# PRIMARY KEY with more than one column, at least to verify it works with REDUDANT
#
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY(a, b)) ROW_FORMAT=COMPACT;;
INSERT INTO t1 VALUES(0, 1), (1, 2), (2, 3), (3, 4);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
0 1 5
1 2 5
2 3 5
3 4 5
UPDATE t1 SET c = b WHERE b <= 2;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
0 1 1
1 2 2
2 3 5
3 4 5
DROP TABLE t1;
#
# Scenario 12:
# Mix ALTER PARTITION and ALTER TABLE ... INPLACE. This is to check if first partition is not
# instant after ALTER PARTITION, will the metadata be copied correctly
#
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');
ALTER TABLE t1 ALGORITHM DEFAULT, ADD COLUMN col5 VARCHAR(500), ADD COLUMN col6 TEXT;
Table id did not change
count(*) = 2
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 4` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 4
4
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;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ALGORITHM DEFAULT, ADD KEY idx4(col4(10));
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
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;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY idx3(col3);
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
col1 col2 col3 col4 col5 col6
1 2 3 abcdefg NULL NULL
100 200 300 qwerty NULL NULL
200 300 400 asdfg NULL NULL
DROP TABLE t1;
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT 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);
ALTER TABLE t1 ADD COLUMN c INT NOT NULL DEFAULT 5;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT count(*) AS `Expect 3` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 3
3
ALTER TABLE t1 ADD PARTITION PARTITIONS 10;
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD KEY(b);
SELECT count(*) AS `Expect 0` FROM information_schema.innodb_tables WHERE instant_cols != 0;
Expect 0
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT * FROM t1;
a b c
1 1 5
2 2 5
3 3 5
4 4 5
5 5 5
6 6 5
7 7 5
8 8 5
DROP TABLE t1;
#
# Scenario 13:
# Create a table with a two level clustered index, do instant ADD COLUMN, then the non-leaf node
# should be parsed correctly
#
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=COMPACT 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;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 ADD COLUMN nc082 TINYTEXT;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT COUNT(*) FROM t1;
COUNT(*)
384
DROP TABLE t1;
#
# Scenario 14:
# Create a small table, and add GIS kinds of new columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 POINT, ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, ST_PointFromText('POINT(10 10)'));
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN d1 LINESTRING, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'd1' AND has_default = 1;
name default_value
d1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN e1 POLYGON, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'e1' AND has_default = 1;
name default_value
e1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN f1 MULTIPOINT, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'f1' AND has_default = 1;
name default_value
f1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN g1 MULTILINESTRING, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'g1' AND has_default = 1;
name default_value
g1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN h1 MULTIPOLYGON, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'h1' AND has_default = 1;
name default_value
h1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN i1 GEOMETRYCOLLECTION, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'i1' AND has_default = 1;
name default_value
i1 NULL
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;
count(*) = max(a)
1
ALTER TABLE t1 ADD COLUMN j1 GEOMETRY, ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'j1' AND has_default = 1;
name default_value
j1 NULL
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;
count(*) = max(a)
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` point DEFAULT NULL,
`d1` linestring DEFAULT NULL,
`e1` polygon DEFAULT NULL,
`f1` multipoint DEFAULT NULL,
`g1` multilinestring DEFAULT NULL,
`h1` multipolygon DEFAULT NULL,
`i1` geomcollection DEFAULT NULL,
`j1` geometry DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 15:
# Create a small table, and add JSON columns and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 JSON, ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 NULL
INSERT INTO t1(a, c1) VALUES(0, '{"key1": "value1", "key2": "value2"}');
SELECT count(*) = max(a) FROM t1 WHERE c1 IS NULL;
count(*) = max(a)
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` json DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 16:
# Create a small table, and add INSTANT columns and verify with trigger
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
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);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
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';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP TRIGGER t1_ai;
ALTER TABLE t2 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'cccc', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
c1 63636363
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';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'dddd';
c1
dddd
DROP TRIGGER t2_ai;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1,t2;
#
# Scenario 17:
# Create a small table, and add INSTANT columns and verify with storedprocedure
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE PROCEDURE p1() INSERT INTO t1(a,c1) VALUES(0, 'bbbb');
CALL p1();
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP PROCEDURE p1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 18:
# Create a small table, and add INSTANT columns and verify with view
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
SELECT * FROM v1;
a b c1
1 1 aaaa
2 2 aaaa
3 3 aaaa
4 4 aaaa
5 5 aaaa
6 NULL bbbb
DROP VIEW v1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 19:
# Create a small table, and add INSTANT columns and drop it and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
ALTER TABLE t1 DROP COLUMN c1;
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 20:
# Create a small table, and add INSTANT columns and rename table
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 RENAME t2;
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t2(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t2 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'bbbb';
c1
bbbb
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t2;
#
# Scenario 21:
# Create a small table, and add INSTANT columns and change its data type INSTANTly won't work
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
ALTER TABLE t1 CHANGE c1 c2 CHAR(10) NOT NULL DEFAULT 'cccc';
Table ID differed
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
0
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c2` char(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 22:
# Create a small table, and add INSTANT columns and create hash,btree multi column index and verify
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
INSERT INTO t1 VALUES(0, 1), (0, 2), (0, 3), (0, 4), (0, 5);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
CREATE INDEX id1 ON t1(c1) USING BTREE;
CREATE INDEX id2 ON t1(c1) USING HASH;
Warnings:
Note 3502 This storage engine does not support the HASH index algorithm, storage engine default was used instead.
Warning 1831 Duplicate index 'id2' defined on the table 'test.t1'. This is deprecated and will be disallowed in a future release.
INSERT INTO t1(a, c1) VALUES(0, 'bbbb');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'bbbb';
c1
bbbb
DROP INDEX id1 ON t1;
DROP INDEX id2 ON t1;
ALTER TABLE t1 ADD COLUMN c2 VARCHAR(10) NOT NULL DEFAULT 'cccc', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c2' AND has_default = 1;
name default_value
c2 63636363
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';
count(*) = max(a)
NULL
SELECT c1 FROM t1 WHERE c1 = 'dddd';
c1
ALTER TABLE t1 RENAME INDEX id1 TO id2;
DROP INDEX id2 ON t1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
`c2` varchar(10) NOT NULL DEFAULT 'cccc',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Scenario 23:
# Create a small table, and add INSTANT columns and perform table join operation
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT;
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);
ALTER TABLE t1 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'aaaa', ALGORITHM = INSTANT;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
INSERT INTO t1(a, c1) VALUES(0, 'cccc');
SELECT count(*) = max(a) FROM t1 WHERE c1='aaaa';
count(*) = max(a)
1
SELECT c1 FROM t1 WHERE c1 = 'cccc';
c1
cccc
ALTER TABLE t2 ADD COLUMN c1 VARCHAR(10) NOT NULL DEFAULT 'bbbb', ALGORITHM = INSTANT;
Table id did not change
SELECT 2 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT name, default_value FROM information_schema.innodb_columns WHERE name = 'c1' AND has_default = 1;
name default_value
c1 61616161
c1 62626262
INSERT INTO t2(a, c1) VALUES(0, 'cccc');
SELECT count(*) = max(a) FROM t2 WHERE c1='bbbb';
count(*) = max(a)
1
SELECT c1 FROM t2 WHERE c1 = 'cccc';
c1
cccc
SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1;
a b c1 a b c1
6 NULL cccc 6 NULL cccc
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'aaaa',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c1` varchar(10) NOT NULL DEFAULT 'bbbb',
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
DROP TABLE t2;
#
# Scenario 24:
# Create a small table, and add stored and(or) virtual columns
# after last stored column in the table
#
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=COMPACT;
INSERT INTO t1(a, b, c) VALUES(0, 1, 2), (0, 2, 3), (0, 3, 4), (0, 4, 5), (0, 5, 6);
ALTER TABLE t1 ADD COLUMN h INT NOT NULL AFTER c;
Table id did not change
count(*) = 1
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c, h) VALUES(0, 6, 20, 40);
SELECT * FROM t1;
a b c h d e
1 1 2 0 3 2
2 2 3 0 5 6
3 3 4 0 7 12
4 4 5 0 9 20
5 5 6 0 11 30
6 6 20 40 26 120
ALTER TABLE t1 ADD COLUMN i VARCHAR(100) DEFAULT 'ABCD EFGH' AFTER h, ADD COLUMN f INT GENERATED ALWAYS AS (LENGTH(i)) AFTER i;
Table id did not change
SELECT 3 = instant_cols AS `Instant columns equal` FROM information_schema.innodb_tables WHERE name like '%t1%';
Instant columns equal
1
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
INSERT INTO t1(a, b, c, h, i) VALUES(0, 20, 30, 50, 'qwerty');
SELECT * FROM t1;
a b c h i f d e
1 1 2 0 ABCD EFGH 9 3 2
2 2 3 0 ABCD EFGH 9 5 6
3 3 4 0 ABCD EFGH 9 7 12
4 4 5 0 ABCD EFGH 9 9 20
5 5 6 0 ABCD EFGH 9 11 30
6 6 20 40 ABCD EFGH 9 26 120
7 20 30 50 qwerty 6 50 600
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
`h` int(11) NOT NULL,
`i` varchar(100) DEFAULT 'ABCD EFGH',
`f` int(11) GENERATED ALWAYS AS (length(`i`)) VIRTUAL,
`d` int(11) GENERATED ALWAYS AS ((`b` + `c`)) VIRTUAL,
`e` int(11) GENERATED ALWAYS AS ((`b` * `c`)) VIRTUAL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT
DROP TABLE t1;
#
# Test cases which don't care about row format start here
#
#
# Bug #28040201 ADDING A NEW COLUMN TO A TABLE HAVING A GENRATED COLUMN
# CRASHES THE SERVER
#
CREATE TABLE t1 (a TEXT GENERATED ALWAYS AS (lpad(1, 1, 1)) VIRTUAL);
ALTER TABLE t1 ADD COLUMN (b INT);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` text GENERATED ALWAYS AS (lpad(1,1,1)) VIRTUAL,
`b` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DROP TABLE t1;
#
# BUG#27784462 - DD::COLUMN::SE_PRIVATE_DATA[TABLE_ID] IS NOT MAINTAINED PROPERLY
#
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, c INT NOT NULL DEFAULT 5, e INT GENERATED ALWAYS AS ((c + 2)) VIRTUAL) PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN (20), PARTITION p3 VALUES LESS THAN (30));
ALTER TABLE t1 REORGANIZE PARTITION p1 INTO (PARTITION p1_a VALUES LESS THAN (5), PARTITION p1_b VALUES LESS THAN (10));
ALTER TABLE t1 ADD COLUMN d INT GENERATED ALWAYS AS ((b * 2)) VIRTUAL, ALGORITHM = INSTANT;
DROP TABLE t1;
#
# Check adding a stored columns(along with virtual columns)
# after the last stored column of a table with functional index
# should be fine
#
CREATE TABLE t1 (col1 INT, col2 INT AS (col1 + col1), INDEX (col2));
INSERT INTO t1(col1) VALUES(10), (20), (30), (40);
ALTER TABLE t1 ADD COLUMN new_col INT AFTER col1, ALGORITHM=INSTANT;
SELECT * FROM t1;
col1 new_col col2
10 NULL 20
20 NULL 40
30 NULL 60
40 NULL 80
ALTER TABLE t1 ADD COLUMN new_col_1 INT AFTER new_col, ADD COLUMN new_col_2 INT GENERATED ALWAYS AS (new_col * 3), ALGORITHM=INSTANT;
INSERT INTO t1(col1, new_col, new_col_1) VALUES(100, 200, 300);
SELECT * FROM t1;
col1 new_col new_col_1 col2 new_col_2
10 NULL NULL 20 NULL
20 NULL NULL 40 NULL
30 NULL NULL 60 NULL
40 NULL NULL 80 NULL
100 200 300 200 600
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`col1` int(11) DEFAULT NULL,
`new_col` int(11) DEFAULT NULL,
`new_col_1` int(11) DEFAULT NULL,
`col2` int(11) GENERATED ALWAYS AS ((`col1` + `col1`)) VIRTUAL,
`new_col_2` int(11) GENERATED ALWAYS AS ((`new_col` * 3)) VIRTUAL,
KEY `col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;