Skip to content

Commit bcb7182

Browse files
author
Jimmy Yang
committed
Bug 21617377 - SUPPORT IN-PLACE ADD INDEX ALONG WITH ADD VIRTUAL COLUMN
Reviewed-by: Marko Makela <[email protected]> RB: 9935
1 parent f764733 commit bcb7182

21 files changed

+818
-243
lines changed

mysql-test/suite/gcol/inc/gcol_column_def_options.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ ALTER TABLE t CHANGE c c int(11) as (a), CHANGE f f varchar(10) as('bbb');
424424
--echo # Change order should be ALGORITHM=INPLACE on Innodb
425425
ALTER TABLE t CHANGE c c int(11) as (a) after f;
426426
ALTER TABLE t CHANGE b b int(11) after c;
427-
--echo # TODO: Changing virtual column type should be ALGORITHM=INPLACE on InnoDB
427+
--echo # TODO: Changing virtual column type should be ALGORITHM=INPLACE on InnoDB, current it goes only with COPY method
428428
ALTER TABLE t CHANGE c c varchar(10) as ('a');
429429
--echo # Changing stored column type is ALGORITHM=COPY
430430
ALTER TABLE t CHANGE dd d varchar(10);

mysql-test/suite/gcol/r/gcol_column_def_options_innodb.result

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -530,8 +530,8 @@ ALTER TABLE t ADD d int, ADD f char(10) AS ('aaa');
530530
affected rows: 1
531531
info: Records: 1 Duplicates: 0 Warnings: 0
532532
ALTER TABLE t CHANGE d dd int, CHANGE f ff varchar(10) AS ('bbb');
533-
affected rows: 0
534-
info: Records: 0 Duplicates: 0 Warnings: 0
533+
affected rows: 1
534+
info: Records: 1 Duplicates: 0 Warnings: 0
535535
# Only drop/add/change virtual, inplace is supported for Innodb
536536
ALTER TABLE t DROP c, DROP ff;
537537
affected rows: 0
@@ -549,10 +549,10 @@ info: Records: 1 Duplicates: 0 Warnings: 0
549549
ALTER TABLE t CHANGE b b int(11) after c;
550550
affected rows: 1
551551
info: Records: 1 Duplicates: 0 Warnings: 0
552-
# TODO: Changing virtual column type should be ALGORITHM=INPLACE on InnoDB
552+
# TODO: Changing virtual column type should be ALGORITHM=INPLACE on InnoDB, current it goes only with COPY method
553553
ALTER TABLE t CHANGE c c varchar(10) as ('a');
554-
affected rows: 0
555-
info: Records: 0 Duplicates: 0 Warnings: 0
554+
affected rows: 1
555+
info: Records: 1 Duplicates: 0 Warnings: 0
556556
# Changing stored column type is ALGORITHM=COPY
557557
ALTER TABLE t CHANGE dd d varchar(10);
558558
affected rows: 1

mysql-test/suite/gcol/r/gcol_column_def_options_myisam.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ info: Records: 1 Duplicates: 0 Warnings: 0
517517
ALTER TABLE t CHANGE b b int(11) after c;
518518
affected rows: 1
519519
info: Records: 1 Duplicates: 0 Warnings: 0
520-
# TODO: Changing virtual column type should be ALGORITHM=INPLACE on InnoDB
520+
# TODO: Changing virtual column type should be ALGORITHM=INPLACE on InnoDB, current it goes only with COPY method
521521
ALTER TABLE t CHANGE c c varchar(10) as ('a');
522522
affected rows: 1
523523
info: Records: 1 Duplicates: 0 Warnings: 0

mysql-test/suite/innodb/r/innodb_v_basic.result

Lines changed: 104 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ CREATE TABLE t (a INT, b INT GENERATED ALWAYS AS (a), c CHAR(10), d CHAR(20), e
22
INSERT INTO t VALUES(10, DEFAULT, "aa", "bb", DEFAULT, 20);
33
INSERT INTO t VALUES(11, DEFAULT, "jj", "kk", DEFAULT, 21);
44
CREATE INDEX idx ON t(e) algorithm=inplace;
5-
INSERT INTO t VALUES(12, DEFAULT, "mm", "nn", DEFAULT, 22);
5+
INSERT INTO t VALUES(12, DEFAULT, 'mm', "nn", DEFAULT, 22);
66
SELECT e FROM t;
77
e
88
aa
99
jj
1010
mm
1111
DROP TABLE t;
1212
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
13-
INSERT INTO t VALUES (11, 3, DEFAULT, "mm");
14-
INSERT INTO t VALUES (18, 1, DEFAULT, "mm");
15-
INSERT INTO t VALUES (28, 1, DEFAULT, "mm");
16-
INSERT INTO t VALUES (null, null, DEFAULT, "mm");
13+
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
14+
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
15+
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
16+
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
1717
CREATE INDEX idx ON t(c);
1818
SELECT c FROM t;
1919
c
@@ -97,9 +97,9 @@ SELECT length(c) FROM t;
9797
length(c)
9898
32000
9999
START TRANSACTION;
100-
INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, "mm");
100+
INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, 'mm');
101101
ROLLBACK;
102-
INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, "mm");
102+
INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, 'mm');
103103
START TRANSACTION;
104104
UPDATE t SET a = REPEAT('m', 16000) WHERE a like "aaa%";
105105
ROLLBACK;
@@ -108,9 +108,9 @@ COUNT(*)
108108
1
109109
DROP TABLE t;
110110
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
111-
INSERT INTO t VALUES (11, 3, DEFAULT, "mm");
112-
INSERT INTO t VALUES (18, 1, DEFAULT, "mm");
113-
INSERT INTO t VALUES (28, 1, DEFAULT, "mm");
111+
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
112+
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
113+
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
114114
CREATE INDEX idx ON t(c);
115115
START TRANSACTION;
116116
UPDATE t SET a = 100 WHERE a = 11;
@@ -129,9 +129,9 @@ c
129129
29
130130
DROP TABLE t;
131131
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
132-
INSERT INTO t VALUES (11, 3, DEFAULT, "mm");
133-
INSERT INTO t VALUES (18, 1, DEFAULT, "mm");
134-
INSERT INTO t VALUES (28, 1, DEFAULT, "mm");
132+
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
133+
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
134+
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
135135
CREATE INDEX idx ON t(c);
136136
SELECT c FROM t;
137137
c
@@ -193,10 +193,10 @@ CREATE TABLE t1(a INT);
193193
INSERT INTO t1 VALUES(1);
194194
ALTER TABLE t1 add COLUMN (f INT generated always as (a+1) virtual, g INT );
195195
ALTER TABLE t1 add COLUMN (h INT generated always as (a+1) virtual), add INDEX idx (h), algorithm=inplace;
196-
ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: INPLACE ADD or DROP of virtual columns cannot be combined with other ALTER TABLE actions. Try ALGORITHM=COPY.
197-
ALTER TABLE t1 add COLUMN (h INT generated always as (a+1) virtual), add INDEX idx (h);
198-
affected rows: 1
199-
info: Records: 1 Duplicates: 0 Warnings: 0
196+
ALTER TABLE t1 add COLUMN (h1 INT generated always as (a+1) virtual), add INDEX idx1 (h1);
197+
affected rows: 0
198+
info: Records: 0 Duplicates: 0 Warnings: 0
199+
ALTER TABLE t1 DROP COLUMN h1, DROP INDEX idx;
200200
DROP TABLE t1;
201201
CREATE TABLE t1(a INT);
202202
CREATE INDEX idx ON t1(a);
@@ -228,22 +228,22 @@ ERROR HY000: 'Spatial index on virtual generated column' is not supported for ge
228228
DROP TABLE t;
229229
CREATE TABLE t (a INT DEFAULT 1, b INT DEFAULT 2, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
230230
CREATE INDEX idx ON t(c);
231-
INSERT INTO t(h)VALUES ("mm");
231+
INSERT INTO t(h)VALUES ('mm');
232232
SELECT c FROM t;
233233
c
234234
3
235235
CREATE unique INDEX idx1 ON t(c);
236-
INSERT INTO t(h)VALUES ("mm");
236+
INSERT INTO t(h)VALUES ('mm');
237237
ERROR 23000: Duplicate entry '3' for key 'idx1'
238238
DROP TABLE t;
239239
CREATE TABLE `t1` ( `a` INT(11) DEFAULT NULL, `b` INT(11) DEFAULT NULL, `c` INT(11) GENERATED ALWAYS AS (a+b) VIRTUAL, `x` INT(11) NOT NULL, `h` VARCHAR(10) DEFAULT NULL, PRIMARY KEY (`x`), KEY `idx` (`c`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
240-
INSERT INTO t1 VALUES (1, 2, DEFAULT, 3, "mm");
241-
INSERT INTO t1 VALUES (11, 22, DEFAULT, 23, "mm");
240+
INSERT INTO t1 VALUES (1, 2, DEFAULT, 3, 'mm');
241+
INSERT INTO t1 VALUES (11, 22, DEFAULT, 23, 'mm');
242242
UPDATE t1 SET x = 4 WHERE x =3;
243243
DROP TABLE t1;
244244
CREATE TABLE `t1` ( `a` INT(11) DEFAULT NULL, `b` INT(11) DEFAULT NULL, `c` INT(11) GENERATED ALWAYS AS (a+b) VIRTUAL, `x` INT(11) NOT NULL, `h` VARCHAR(10) DEFAULT NULL, KEY `idx` (`c`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
245-
INSERT INTO t1 VALUES (1, 2, DEFAULT, 3, "mm");
246-
INSERT INTO t1 VALUES (11, 22, DEFAULT, 23, "mm");
245+
INSERT INTO t1 VALUES (1, 2, DEFAULT, 3, 'mm');
246+
INSERT INTO t1 VALUES (11, 22, DEFAULT, 23, 'mm');
247247
START TRANSACTION;
248248
SELECT * FROM t1;
249249
a b c x h
@@ -475,10 +475,10 @@ ALTER TABLE t DROP COLUMN c;
475475
DELETE FROM t;
476476
DROP TABLE t;
477477
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
478-
INSERT INTO t VALUES (11, 3, DEFAULT, "mm");
479-
INSERT INTO t VALUES (18, 1, DEFAULT, "mm");
480-
INSERT INTO t VALUES (28, 1, DEFAULT, "mm");
481-
INSERT INTO t VALUES (null, null, DEFAULT, "mm");
478+
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
479+
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
480+
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
481+
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
482482
CREATE INDEX idx ON t(a, c);
483483
SELECT a, c FROM t;
484484
a c
@@ -515,9 +515,9 @@ NULL NULL d
515515
28 29 c
516516
DROP TABLE t;
517517
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
518-
INSERT INTO t VALUES (11, 3, DEFAULT, "mm");
519-
INSERT INTO t VALUES (18, 1, DEFAULT, "mm");
520-
INSERT INTO t VALUES (28, 1, DEFAULT, "mm");
518+
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
519+
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
520+
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
521521
INSERT INTO t VALUES (null, null, DEFAULT, "mx");
522522
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
523523
CREATE INDEX idx ON t(c);;
@@ -623,7 +623,6 @@ XXXAAA
623623
uuuuu
624624
ummuooo
625625
ALTER TABLE t ADD x VARCHAR(20) GENERATED ALWAYS AS(CONCAT(n, h)), ADD INDEX idx (x), algorithm=inplace;
626-
ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: INPLACE ADD or DROP of virtual columns cannot be combined with other ALTER TABLE actions. Try ALGORITHM=COPY.
627626
DROP TABLE t;
628627
CREATE TABLE `t1` (
629628
`col1` int(11) DEFAULT NULL,
@@ -1079,10 +1078,10 @@ col_int_nokey) VIRTUAL NOT NULL,
10791078
PARTITIONS 3 */
10801079
DROP TABLE t;
10811080
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
1082-
INSERT INTO t VALUES (11, 3, DEFAULT, "mm");
1083-
INSERT INTO t VALUES (18, 1, DEFAULT, "mm");
1084-
INSERT INTO t VALUES (28, 1, DEFAULT, "mm");
1085-
INSERT INTO t VALUES (null, null, DEFAULT, "mm");
1081+
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
1082+
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
1083+
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
1084+
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
10861085
ALTER TABLE t ADD COLUMN xs INT GENERATED ALWAYS AS(a+b), ADD COLUMN mm INT
10871086
GENERATED ALWAYS AS(a+b) STORED, ALGORITHM = INPLACE;
10881087
ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY.
@@ -1147,3 +1146,73 @@ SELECT a FROM t FOR UPDATE;
11471146
a
11481147
1
11491148
DROP TABLE t;
1149+
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
1150+
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
1151+
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
1152+
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
1153+
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
1154+
ALTER TABLE t ADD COLUMN x INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (x);
1155+
affected rows: 0
1156+
info: Records: 0 Duplicates: 0 Warnings: 0
1157+
SELECT x FROM t;
1158+
x
1159+
NULL
1160+
14
1161+
19
1162+
29
1163+
DROP TABLE t;
1164+
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
1165+
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
1166+
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
1167+
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
1168+
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
1169+
CREATE INDEX idx_1 on t(c);
1170+
SET SESSION debug="+d,create_index_fail";
1171+
ALTER TABLE t ADD COLUMN x INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (x);
1172+
ERROR 23000: Duplicate entry '' for key '*UNKNOWN*'
1173+
SET SESSION debug="-d,create_index_fail";
1174+
affected rows: 0
1175+
SHOW CREATE TABLE t;
1176+
Table Create Table
1177+
t CREATE TABLE `t` (
1178+
`a` int(11) DEFAULT NULL,
1179+
`b` int(11) DEFAULT NULL,
1180+
`c` int(11) GENERATED ALWAYS AS (a+b) VIRTUAL,
1181+
`h` varchar(10) DEFAULT NULL,
1182+
KEY `idx_1` (`c`)
1183+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1184+
SELECT c FROM t;
1185+
c
1186+
NULL
1187+
14
1188+
19
1189+
29
1190+
DROP TABLE t;
1191+
CREATE TABLE t1 (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
1192+
INSERT INTO t1 VALUES (11, 3, DEFAULT, 'mm');
1193+
INSERT INTO t1 VALUES (18, 1, DEFAULT, 'mm');
1194+
INSERT INTO t1 VALUES (28, 1, DEFAULT, 'mm');
1195+
ALTER TABLE t1 ADD INDEX idx12 (c) , FORCE, LOCK=NONE;
1196+
ALTER TABLE t1 DROP COLUMN h, ADD INDEX idx (c) , FORCE, LOCK=NONE;
1197+
Warnings:
1198+
Warning 1831 Duplicate index 'idx' defined on the table 'test.t1'. This is deprecated and will be disallowed in a future release.
1199+
DROP TABLE t1 ;
1200+
CREATE TABLE t1 (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), d INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
1201+
INSERT INTO t1 VALUES (11, 3, DEFAULT, DEFAULT, 'mm');
1202+
INSERT INTO t1 VALUES (18, 1, DEFAULT, DEFAULT, 'mm');
1203+
INSERT INTO t1 VALUES (28, 1, DEFAULT, DEFAULT, 'mm');
1204+
ALTER TABLE t1 CHANGE d d INT GENERATED ALWAYS AS(a+b) FIRST, ALGORITHM = INPLACE;
1205+
ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: INPLACE ADD or DROP of virtual columns cannot be combined with other ALTER TABLE actions. Try ALGORITHM=COPY.
1206+
ALTER TABLE t1 CHANGE d d VARCHAR(10) GENERATED ALWAYS AS(h), ALGORITHM = INPLACE;
1207+
ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY.
1208+
ALTER TABLE t1 CHANGE d d INT GENERATED ALWAYS AS(a+b) FIRST;
1209+
SHOW CREATE TABLE t1;
1210+
Table Create Table
1211+
t1 CREATE TABLE `t1` (
1212+
`d` int(11) GENERATED ALWAYS AS (a+b) VIRTUAL,
1213+
`a` int(11) DEFAULT NULL,
1214+
`b` int(11) DEFAULT NULL,
1215+
`c` int(11) GENERATED ALWAYS AS (a+b) VIRTUAL,
1216+
`h` varchar(10) DEFAULT NULL
1217+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1218+
DROP TABLE t1;

0 commit comments

Comments
 (0)