SET @@session.default_storage_engine = 'InnoDB'; create table t1 (a int, b int generated always as (-a) virtual, c int generated always as (-a) stored); set sql_warnings = 1; # # *** INSERT *** # # INSERT INTO tbl_name VALUES... DEFAULT is specified against gcols insert into t1 values (1,default,default); select * from t1; a b c 1 -1 -1 delete from t1; select * from t1; a b c # INSERT INTO tbl_name VALUES... NULL is specified against gcols insert into t1 values (1,null,null); select * from t1; a b c 1 -1 -1 delete from t1; select * from t1; a b c # INSERT INTO tbl_name VALUES... a non-NULL value is specified against gcols insert ignore into t1 values (1,2,3); Warnings: Warning 1906 The value specified for generated column 'b' in table 't1' ignored Warning 1906 The value specified for generated column 'c' in table 't1' ignored select * from t1; a b c 1 -1 -1 delete from t1; select * from t1; a b c # INSERT INTO tbl_name () VALUES... insert into t1 (a) values (1), (2); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 delete from t1; select * from t1; a b c # INSERT INTO tbl_name () VALUES... DEFAULT is specified # against gcols insert into t1 (a,b) values (1,default), (2,default); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 delete from t1; select * from t1; a b c # INSERT INTO tbl_name () VALUES... NULL is specified against gcols insert into t1 (a,b) values (1,null), (2,null); select * from t1; a b c 1 -1 -1 2 -2 -2 delete from t1; select * from t1; a b c # INSERT INTO tbl_name () VALUES... a non-NULL value is specified # against gcols insert ignore into t1 (a,b) values (1,3), (2,4); Warnings: Warning 1906 The value specified for generated column 'b' in table 't1' ignored Warning 1906 The value specified for generated column 'b' in table 't1' ignored select * from t1; a b c 1 -1 -1 2 -2 -2 delete from t1; select * from t1; a b c drop table t1; # Table with UNIQUE non-gcol field. INSERT INTO tbl_name VALUES... ON DUPLICATE # KEY UPDATE =expr, =expr create table t1 (a int unique, b int generated always as (-a) virtual, c int generated always as (-a) stored); insert into t1 values (1,default,default); insert into t1 values (1,default,default) on duplicate key update a=2, b=default; select a,b,c from t1; a b c 2 -2 -2 delete from t1 where b in (1,2); select * from t1; a b c 2 -2 -2 drop table t1; # Table with UNIQUE gcol field. INSERT INTO tbl_name VALUES... ON DUPLICATE # KEY UPDATE =expr, =expr create table t1 (a int, b int generated always as (-a) virtual, c int generated always as (-a) stored unique); insert into t1 values (1,default,default); insert into t1 values (1,default,default) on duplicate key update a=2, b=default; select a,b,c from t1; a b c 2 -2 -2 # CREATE new_table ... LIKE old_table # INSERT INTO new_table SELECT * from old_table create table t2 like t1; insert into t2(a) select a from t1; select * from t2; a b c 2 -2 -2 drop table t2; # CREATE new_table ... LIKE old_table INSERT INTO new_table (, ) # SELECT , from old_table insert into t1 values (1,default,default); select * from t1; a b c 2 -2 -2 1 -1 -1 create table t2 like t1; insert into t2 (a) select a from t1; select * from t2 order by a; a b c 1 -1 -1 2 -2 -2 drop table t2; drop table t1; # # *** UPDATE *** # # UPDATE tbl_name SET non-gcol=expr WHERE non-gcol=expr create table t1 (a int, b int generated always as (-a) virtual, c int generated always as (-a) stored); insert into t1 (a) values (1), (2); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 update t1 set a=3 where a=2; select * from t1 order by a; a b c 1 -1 -1 3 -3 -3 delete from t1; select * from t1; a b c # UPDATE tbl_name SET gcol=expr WHERE non-gcol=expr insert into t1 (a) values (1), (2); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 update ignore t1 set c=3 where a=2; Warnings: Warning 1906 The value specified for generated column 'c' in table 't1' ignored select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 delete from t1; select * from t1; a b c # UPDATE tbl_name SET non-gcol=expr WHERE gcol=expr insert into t1 (a) values (1), (2); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 update t1 set a=3 where b=-2; select * from t1 order by a; a b c 1 -1 -1 3 -3 -3 delete from t1; select * from t1; a b c # UPDATE tbl_name SET gcol=expr WHERE gcol=expr insert into t1 (a) values (1), (2); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 update ignore t1 set c=3 where b=-2; Warnings: Warning 1906 The value specified for generated column 'c' in table 't1' ignored select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 delete from t1; select * from t1; a b c drop table t1; # INDEX created on gcol # UPDATE tbl_name SET non-gcol=expr WHERE gcol=const create table t1 (a int, b int generated always as (-a) virtual, c int generated always as (-a) stored unique); insert into t1 (a) values (1), (2); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 update t1 set a=3 where c=-2; select * from t1; a b c 1 -1 -1 3 -3 -3 delete from t1; select * from t1; a b c # INDEX created on gcol # UPDATE tbl_name SET non-gcol=expr WHERE gcol=between const1 and const2 insert into t1 (a) values (1), (2); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 update t1 set a=3 where c between -3 and -2; select * from t1 order by a; a b c 1 -1 -1 3 -3 -3 delete from t1; select * from t1; a b c # No INDEX created on gcol # UPDATE tbl_name SET non-gcol=expr WHERE gcol=between const1 and const2 insert into t1 (a) values (1), (2); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 update t1 set a=3 where b between -3 and -2; select * from t1 order by a; a b c 1 -1 -1 3 -3 -3 delete from t1; select * from t1; a b c # INDEX created on gcol # UPDATE tbl_name SET non-gcol=expr # WHERE gcol=between const1 and const2 ORDER BY gcol insert into t1 (a) values (1), (2), (3), (4), (5); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 3 -3 -3 4 -4 -4 5 -5 -5 update t1 set a=6 where c between -1 and 0 order by c; select * from t1 order by a; a b c 2 -2 -2 3 -3 -3 4 -4 -4 5 -5 -5 6 -6 -6 delete from t1 where c between -6 and 0; select * from t1; a b c # INDEX created on gcol # UPDATE tbl_name SET non-gcol=expr # WHERE gcol=between const1 and const2 ORDER BY gcol LIMIT 2 insert into t1 (a) values (1), (2), (3), (4), (5); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 3 -3 -3 4 -4 -4 5 -5 -5 update t1 set a=6 where c between -1 and 0 order by c limit 2; select * from t1 order by a; a b c 2 -2 -2 3 -3 -3 4 -4 -4 5 -5 -5 6 -6 -6 delete from t1 where c between -2 and 0 order by c; select * from t1 order by a; a b c 3 -3 -3 4 -4 -4 5 -5 -5 6 -6 -6 delete from t1; # INDEX created on gcol # UPDATE tbl_name SET non-gcol=expr # WHERE indexed gcol=between const1 and const2 and non-indexed gcol=const3 insert into t1 (a) values (1), (2), (3), (4), (5); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 3 -3 -3 4 -4 -4 5 -5 -5 update t1 set a=6 where (c between -2 and 0) and (b=-1); select * from t1 order by a; a b c 2 -2 -2 3 -3 -3 4 -4 -4 5 -5 -5 6 -6 -6 delete from t1; # INDEX created on gcol # UPDATE tbl_name SET non-gcol=expr # WHERE indexed gcol=between const1 and const2 and non-indexed gcol=const3 # ORDER BY indexed gcol insert into t1 (a) values (1), (2), (3), (4), (5); select * from t1 order by a; a b c 1 -1 -1 2 -2 -2 3 -3 -3 4 -4 -4 5 -5 -5 update t1 set a=6 where (c between -2 and 0) and (b=-1) order by c; select * from t1 order by a; a b c 2 -2 -2 3 -3 -3 4 -4 -4 5 -5 -5 6 -6 -6 delete from t1; drop table t1; # # Verify ON UPDATE/DELETE actions of FOREIGN KEYs create table t2 (a int primary key, name varchar(10)); create table t1 (a int primary key, b int generated always as (a % 10) stored); insert into t2 values (1, 'value1'), (2,'value2'), (3,'value3'); insert into t1 (a) values (1),(2),(3); select * from t1 order by a; a b 1 1 2 2 3 3 select * from t2 order by a; a name 1 value1 2 value2 3 value3 select t1.a, t1.b, t2.name from t1,t2 where t1.b=t2.a order by t1.a; a b name 1 1 value1 2 2 value2 3 3 value3 # - ON UPDATE RESTRICT alter table t1 add foreign key (b) references t2(a) on update restrict; insert into t1 (a) values (4); ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t1`, CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t2` (`a`)) update t2 set a=4 where a=3; ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t1`, CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t2` (`a`)) select t1.a, t1.b, t2.name from t1,t2 where t1.b=t2.a; a b name 1 1 value1 2 2 value2 3 3 value3 alter table t1 drop foreign key t1_ibfk_1; # - ON DELETE RESTRICT alter table t1 add foreign key (b) references t2(a) on delete restrict; delete from t2 where a=3; ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t1`, CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t2` (`a`)) select t1.a, t1.b, t2.name from t1,t2 where t1.b=t2.a; a b name 1 1 value1 2 2 value2 3 3 value3 select t1.a, t1.b, t2.name from t1 left outer join t2 on (t1.b=t2.a); a b name 1 1 value1 2 2 value2 3 3 value3 alter table t1 drop foreign key t1_ibfk_1; # - ON DELETE CASCADE alter table t1 add foreign key (b) references t2(a) on delete cascade; delete from t2 where a=3; select t1.a, t1.b, t2.name from t1,t2 where t1.b=t2.a; a b name 1 1 value1 2 2 value2 select t1.a, t1.b, t2.name from t1 left outer join t2 on (t1.b=t2.a); a b name 1 1 value1 2 2 value2 alter table t1 drop foreign key t1_ibfk_1; drop table t1; drop table t2; # # *** REPLACE *** # # UNIQUE INDEX on gcol # REPLACE tbl_name (non-gcols) VALUES (non-gcols); create table t1 (a int, b int generated always as (-a) virtual, c int generated always as (-a) stored unique, d varchar(16)); insert into t1 (a,d) values (1,'a'), (2,'b'); select * from t1 order by a; a b c d 1 -1 -1 a 2 -2 -2 b replace t1 (a,d) values (1,'c'); select * from t1 order by a; a b c d 1 -1 -1 c 2 -2 -2 b delete from t1; select * from t1; a b c d set sql_warnings = 0; drop table t1; Bug#20170778: WL411:FAILING ASSERTION `!TABLE || (!TABLE->WRITE_SET || BITMAP_IS_SET(TABLE->WR # CREATE TABLE t1 (col1 INT, col2 INT, col3 INT, col4 INT, col5 INT GENERATED ALWAYS AS (col3 * col2) VIRTUAL, col6 INT GENERATED ALWAYS AS (col4 * col1) STORED, col7 INT GENERATED ALWAYS AS (col6 + col6) VIRTUAL, col8 INT GENERATED ALWAYS AS (col6 / col5) STORED, col9 TEXT); SET @fill_amount = (@@innodb_page_size / 2 ) + 1; INSERT INTO t1 (col1,col2,col3,col4,col5,col6,col7,col8,col9) VALUES /* 3 */ (3, 3 / 3, 3 + 3, 3 / 3, DEFAULT, DEFAULT, DEFAULT, DEFAULT ,REPEAT(CAST(3 AS CHAR(1)),@fill_amount)) , (3, 3 * 3, 3 + 3, 3 / 3, DEFAULT, DEFAULT, DEFAULT, DEFAULT ,REPEAT(CAST(3 AS CHAR(1)),@fill_amount)); UPDATE t1 SET col1 = 2; UPDATE t1 SET col7 = DEFAULT; UPDATE t1 SET col8 = DEFAULT; DROP TABLE t1; # Bug#21081742: ASSERTION !TABLE || (!TABLE->WRITE_SET || # BITMAP_IS_SET(TABLE->WRITE_SET # CREATE TABLE b ( pk INTEGER AUTO_INCREMENT, col_varchar_nokey VARCHAR(1), col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)), PRIMARY KEY (pk) ); INSERT INTO b (col_varchar_nokey) VALUES ('v'),('v'); CREATE TABLE d ( pk INTEGER AUTO_INCREMENT, col_varchar_nokey VARCHAR(1), col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)), PRIMARY KEY (pk) ) ; INSERT INTO d (col_varchar_nokey) VALUES ('q'),('g'),('e'),('l'),(NULL),('v'),('c'),('u'),('x'); CREATE TABLE bb ( pk INTEGER AUTO_INCREMENT, col_varchar_nokey VARCHAR(1) /*! NULL */, col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)), PRIMARY KEY (pk) ); INSERT INTO bb (col_varchar_nokey) VALUES ('j'),('h'); EXPLAIN UPDATE d AS OUTR1, b AS OUTR2 SET OUTR1.col_varchar_nokey = NULL WHERE ( 't', 'b' ) IN ( SELECT INNR1.col_varchar_nokey AS x, INNR1.col_varchar_key AS y FROM bb AS INNR1 WHERE OUTR1.pk = 1 ); id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY OUTR1 const PRIMARY PRIMARY 4 const 1 1 PRIMARY INNR1 ALL NULL NULL NULL NULL 2 Using where; FirstMatch(OUTR1) 1 PRIMARY OUTR2 index NULL PRIMARY 4 NULL 2 Using index DROP TABLE IF EXISTS b,bb,d; # # Bug#21216067 ASSERTION FAILED ROW_UPD_SEC_INDEX_ENTRY (INNOBASE/ROW/ROW0UPD.CC:2103) # CREATE TABLE t ( x INT, y INT, gc INT GENERATED ALWAYS AS (x+1) STORED ); INSERT INTO t VALUES (); UPDATE t t1, t t2 SET t2.y = 1, t1.x = 2; SELECT * FROM t; x y gc 2 1 3 DROP TABLE t; # stored CREATE TABLE C ( col_varchar_nokey VARCHAR(1), col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) STORED ); INSERT INTO C (col_varchar_nokey) VALUES ('c'); EXPLAIN UPDATE C AS OUTR1, C AS OUTR2 SET OUTR1.`col_varchar_nokey` = 'f', OUTR2.`col_varchar_nokey` = "a"; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE OUTR1 ALL NULL NULL NULL NULL 1 1 SIMPLE OUTR2 ALL NULL NULL NULL NULL 1 UPDATE C AS OUTR1, C AS OUTR2 SET OUTR1.`col_varchar_nokey` = 'f', OUTR2.`col_varchar_nokey` = "a"; SELECT * from C; col_varchar_nokey col_varchar_key a aa DROP TABLE C; # stored, indexed CREATE TABLE C ( col_varchar_nokey VARCHAR(1), col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) STORED, KEY (col_varchar_key, col_varchar_nokey) ); INSERT INTO C (col_varchar_nokey) VALUES ('c'); EXPLAIN UPDATE C AS OUTR1, C AS OUTR2 SET OUTR1.`col_varchar_nokey` = 'f', OUTR2.`col_varchar_nokey` = "a"; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE OUTR1 ALL NULL NULL NULL NULL 1 1 SIMPLE OUTR2 ALL NULL NULL NULL NULL 1 UPDATE C AS OUTR1, C AS OUTR2 SET OUTR1.`col_varchar_nokey` = 'f', OUTR2.`col_varchar_nokey` = "a"; SELECT * from C; col_varchar_nokey col_varchar_key a aa DROP TABLE C; # virtual CREATE TABLE C ( col_varchar_nokey VARCHAR(1), col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL ); INSERT INTO C (col_varchar_nokey) VALUES ('c'); EXPLAIN UPDATE C AS OUTR1, C AS OUTR2 SET OUTR1.`col_varchar_nokey` = 'f', OUTR2.`col_varchar_nokey` = "a"; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE OUTR1 ALL NULL NULL NULL NULL 1 1 SIMPLE OUTR2 ALL NULL NULL NULL NULL 1 UPDATE C AS OUTR1, C AS OUTR2 SET OUTR1.`col_varchar_nokey` = 'f', OUTR2.`col_varchar_nokey` = "a"; SELECT * from C; col_varchar_nokey col_varchar_key a aa DROP TABLE C; #Bug#21929967:GCOLS:GCOL VALUE CHANGES WHEN SESSION CHANGES SQL_MODE CREATE TABLE t(c1 INT GENERATED ALWAYS AS (1) VIRTUAL, c2 INT GENERATED ALWAYS AS(2) STORED); INSERT INTO t VALUES(DEFAULT, DEFAULT); SELECT * FROM t; c1 c2 1 2 CREATE TABLE t1(c1 INT, c2 INT GENERATED ALWAYS AS(c1 + 1) STORED); INSERT INTO t1(c2) VALUES(DEFAULT); SELECT * FROM t1; c1 c2 NULL NULL CREATE TABLE t2(c1 INT DEFAULT 1, c2 INT GENERATED ALWAYS AS(c1 + 1) STORED); INSERT INTO t2(c2) VALUES(DEFAULT); SELECT * FROM t2; c1 c2 1 2 DROP TABLE t, t1, t2; # Bug#22179637: INSERT INTO TABLE FROM SELECT ACCEPTS TO INSERT INTO # GENERATED COLUMNS CREATE TABLE t1 ( i1 INTEGER, i2 INTEGER GENERATED ALWAYS AS (i1 + i1) ); INSERT INTO t1 (i1) SELECT 5; INSERT INTO t1 (i1) SELECT 5 ON DUPLICATE KEY UPDATE i2= DEFAULT; SELECT * FROM t1; i1 i2 5 10 5 10 CREATE TABLE t2 ( i1 INTEGER, i2 INTEGER GENERATED ALWAYS AS (i1 + i1) STORED ); INSERT INTO t2 (i1) SELECT 5; INSERT INTO t2 (i1) SELECT 5 ON DUPLICATE KEY UPDATE i2= DEFAULT; SELECT * FROM t2; i1 i2 5 10 5 10 DROP TABLE t1,t2; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; DROP FUNCTION IF EXISTS f1; DROP TRIGGER IF EXISTS trg1; DROP TRIGGER IF EXISTS trg2; set sql_warnings = 0;