mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 20:36:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1481 lines
		
	
	
	
		
			43 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			1481 lines
		
	
	
	
		
			43 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
--source include/have_innodb.inc
 | 
						|
--source include/have_partition.inc
 | 
						|
--source include/not_embedded.inc
 | 
						|
 | 
						|
call mtr.add_suppression("\\[Warning\\] InnoDB: Compute virtual");
 | 
						|
 | 
						|
set default_storage_engine=innodb;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT GENERATED ALWAYS AS (a), c CHAR(10), d CHAR(20), e CHAR(10) GENERATED ALWAYS AS (c), g INT);
 | 
						|
INSERT INTO t VALUES(10, DEFAULT, "aa", "bb", DEFAULT, 20);
 | 
						|
INSERT INTO t VALUES(11, DEFAULT, "jj", "kk", DEFAULT, 21);
 | 
						|
 | 
						|
CREATE INDEX idx ON t(e) algorithm=inplace;
 | 
						|
INSERT INTO t VALUES(12, DEFAULT, 'mm', "nn", DEFAULT, 22);
 | 
						|
 | 
						|
SELECT e FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
 | 
						|
 | 
						|
CREATE INDEX idx ON t(c);
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
UPDATE t SET a = 10 WHERE a = 11;
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
SELECT * FROM t;
 | 
						|
 | 
						|
DELETE FROM t WHERE a = 18;
 | 
						|
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
 | 
						|
INSERT INTO t VALUES (128, 22, DEFAULT, "xx");
 | 
						|
INSERT INTO t VALUES (1290, 212, DEFAULT, "xmx");
 | 
						|
ROLLBACK;
 | 
						|
 | 
						|
SELECT c FROM t;
 | 
						|
SELECT * FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10), j INT, m INT  GENERATED ALWAYS AS(b + j), n VARCHAR(10), p VARCHAR(20) GENERATED ALWAYS AS(CONCAT(n, h)), INDEX idx1(c), INDEX idx2 (m), INDEX idx3(p));
 | 
						|
 | 
						|
INSERT INTO t VALUES(11, 22, DEFAULT, "AAA", 8, DEFAULT, "XXX", DEFAULT);
 | 
						|
INSERT INTO t VALUES(1, 2, DEFAULT, "uuu", 9, DEFAULT, "uu", DEFAULT);
 | 
						|
INSERT INTO t VALUES(3, 4, DEFAULT, "uooo", 1, DEFAULT, "umm", DEFAULT);
 | 
						|
 | 
						|
SELECT c FROM t;
 | 
						|
SELECT m FROM t;
 | 
						|
SELECT p FROM t;
 | 
						|
SELECT * FROM t;
 | 
						|
 | 
						|
update t set a = 13 where a =11;
 | 
						|
 | 
						|
delete from t where a =13;
 | 
						|
 | 
						|
DROP INDEX idx1 ON t;
 | 
						|
DROP INDEX idx2 ON t;
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
let MYSQLD_DATADIR=`select @@datadir`;
 | 
						|
let PAGE_SIZE=`select @@innodb_page_size`;
 | 
						|
--source include/shutdown_mysqld.inc
 | 
						|
perl;
 | 
						|
do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
 | 
						|
my $file = "$ENV{MYSQLD_DATADIR}/ibdata1";
 | 
						|
open(FILE, "+<$file") || die "Unable to open $file";
 | 
						|
binmode FILE;
 | 
						|
my $ps= $ENV{PAGE_SIZE};
 | 
						|
my $page;
 | 
						|
die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps;
 | 
						|
my $full_crc32 = unpack("N",substr($page,54,4)) & 0x10; # FIL_SPACE_FLAGS
 | 
						|
sysseek(FILE, 7*$ps, 0) || die "Unable to seek $file\n";
 | 
						|
die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps;
 | 
						|
substr($page,54,4)=pack("N",0xc001cafe); # 32 MSB of 64-bit DICT_HDR_INDEX_ID
 | 
						|
my $polynomial = 0x82f63b78; # CRC-32C
 | 
						|
if ($full_crc32)
 | 
						|
{
 | 
						|
    my $ck = mycrc32(substr($page, 0, $ps-4), 0, $polynomial);
 | 
						|
    substr($page, $ps-4, 4) = pack("N", $ck);
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    my $ck= pack("N",mycrc32(substr($page, 4, 22), 0, $polynomial) ^
 | 
						|
		 mycrc32(substr($page, 38, $ps - 38 - 8), 0, $polynomial));
 | 
						|
    substr($page,0,4)=$ck;
 | 
						|
    substr($page,$ps-8,4)=$ck;
 | 
						|
}
 | 
						|
sysseek(FILE, 7*$ps, 0) || die "Unable to rewind $file\n";
 | 
						|
syswrite(FILE, $page, $ps)==$ps || die "Unable to write $file\n";
 | 
						|
close(FILE) || die "Unable to close $file";
 | 
						|
EOF
 | 
						|
--source include/start_mysqld.inc
 | 
						|
set default_storage_engine=innodb;
 | 
						|
 | 
						|
/* Test large BLOB data */
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` BLOB,
 | 
						|
  `b` BLOB,
 | 
						|
  `c` BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
 | 
						|
  `h` VARCHAR(10) DEFAULT NULL
 | 
						|
) ENGINE=InnoDB;
 | 
						|
 | 
						|
INSERT INTO t VALUES (REPEAT('g', 16000), REPEAT('x', 16000), DEFAULT, "kk");
 | 
						|
 | 
						|
CREATE INDEX idx ON t(c(100));
 | 
						|
 | 
						|
SELECT length(c) FROM t;
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
 | 
						|
INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, 'mm');
 | 
						|
 | 
						|
ROLLBACK;
 | 
						|
 | 
						|
INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, 'mm');
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
 | 
						|
UPDATE t SET a = REPEAT('m', 16000) WHERE a like "aaa%";
 | 
						|
 | 
						|
ROLLBACK;
 | 
						|
 | 
						|
# This SELECT did not give correct answer, even though InnoDB return
 | 
						|
# all qualified rows
 | 
						|
SELECT COUNT(*) FROM t WHERE c like "aaa%";
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
 | 
						|
CREATE INDEX idx ON t(c);
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
 | 
						|
UPDATE t SET a = 100 WHERE a = 11;
 | 
						|
 | 
						|
UPDATE t SET a =22 WHERE a = 18;
 | 
						|
 | 
						|
UPDATE t SET a = 33 WHERE a = 22;
 | 
						|
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
ROLLBACK;
 | 
						|
 | 
						|
SELECT c FROM t;
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
 | 
						|
CREATE INDEX idx ON t(c);
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
connect(con1,localhost,root,,test);
 | 
						|
START TRANSACTION;
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
connection default;
 | 
						|
UPDATE t SET a = 19 WHERE a = 11;
 | 
						|
 | 
						|
# this should report the same value as previous one (14, 19, 29).
 | 
						|
connection con1;
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
ROLLBACK;
 | 
						|
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
connection default;
 | 
						|
disconnect con1;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
# CREATE a more complex TABLE
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10), j INT, m INT  GENERATED ALWAYS AS(b + x), n VARCHAR(10), p VARCHAR(20) GENERATED ALWAYS AS(CONCAT(n, RTRIM(y))), x INT, y CHAR(20), z INT, INDEX idx1(c), INDEX idx2 (m), INDEX idx3(p));
 | 
						|
 | 
						|
INSERT INTO t VALUES(1, 2, DEFAULT, "hhh", 3, DEFAULT, "nnn", DEFAULT, 4, "yyy", 5);
 | 
						|
 | 
						|
INSERT INTO t VALUES(2, 3, DEFAULT, "hhha", 4, DEFAULT, "nnna", DEFAULT, 5, "yyya", 6);
 | 
						|
 | 
						|
INSERT INTO t VALUES(12, 13, DEFAULT, "hhhb", 14, DEFAULT, "nnnb", DEFAULT, 15, "yyyb", 16);
 | 
						|
 | 
						|
# CREATE an INDEX ON multiple virtual COLUMN
 | 
						|
CREATE INDEX idx6 ON t(p, c);
 | 
						|
 | 
						|
SELECT p, c FROM t;
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
INSERT INTO t VALUES(32, 33, DEFAULT, "hhhb", 34, DEFAULT, "nnnb", DEFAULT, 35, "yyyb", 36);
 | 
						|
ROLLBACK;
 | 
						|
 | 
						|
UPDATE t SET a = 100 WHERE a = 1;
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
UPDATE t SET a = 1 WHERE a = 100;
 | 
						|
ROLLBACK;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t1(a INT);
 | 
						|
ALTER TABLE t1 add COLUMN (b INT generated always as (a+1) virtual, c INT as(5) virtual);
 | 
						|
ALTER TABLE t1 add COLUMN (d INT generated always as (a+1) virtual, e INT as(5) virtual);
 | 
						|
 | 
						|
SELECT pos, base_pos FROM informatiON_schema.innodb_sys_virtual;
 | 
						|
 | 
						|
#--error ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN
 | 
						|
ALTER TABLE t1 add COLUMN (f INT generated always as (a+1) virtual, g INT as(5) virtual), DROP COLUMN e;
 | 
						|
 | 
						|
SELECT pos, base_pos FROM informatiON_schema.innodb_sys_virtual;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE t1(a INT);
 | 
						|
INSERT INTO t1 VALUES(1);
 | 
						|
 | 
						|
ALTER TABLE t1 add COLUMN (f INT generated always as (a+1) virtual, g INT );
 | 
						|
 | 
						|
# Inplace ADD/DROP virtual COLUMNs can only go with their own for
 | 
						|
# inplace algorithm, not to combine with other operations, except create index
 | 
						|
ALTER TABLE t1 add COLUMN (h INT generated always as (a+1) virtual), add INDEX idx (h), algorithm=inplace;
 | 
						|
 | 
						|
--enable_info
 | 
						|
ALTER TABLE t1 add COLUMN (h1 INT generated always as (a+1) virtual), add INDEX idx1 (h1);
 | 
						|
--disable_info
 | 
						|
 | 
						|
ALTER TABLE t1 DROP COLUMN h1, DROP INDEX idx;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
# Virtual COLUMN cannot be INDEXed
 | 
						|
CREATE TABLE t1(a INT);
 | 
						|
CREATE INDEX idx ON t1(a);
 | 
						|
CREATE TABLE t3(a INT, b INT , INDEX(b), CONSTRAINT x FOREIGN KEY(b) REFERENCES t1(a));
 | 
						|
--error ER_CANT_CREATE_TABLE
 | 
						|
CREATE TABLE t2(a INT, b INT generated always as (a+1) virtual, INDEX(b), CONSTRAINT x FOREIGN KEY(b) REFERENCES t1(a));
 | 
						|
CREATE TABLE t2(a INT, b INT generated always as (a+1) virtual, INDEX(b));
 | 
						|
DROP TABLE t3;
 | 
						|
DROP TABLE t2;
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE t1(a INT);
 | 
						|
ALTER TABLE t1 add COLUMN (b INT generated always as (a+1) virtual, c INT as(5) virtual);
 | 
						|
 | 
						|
ALTER TABLE t1 change b x INT generated always as (a+1) virtual;
 | 
						|
 | 
						|
SELECT pos, base_pos FROM informatiON_schema.innodb_sys_virtual;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
# We do not support Fulltext or Spatial INDEX ON Virtual Columns
 | 
						|
--error ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN
 | 
						|
CREATE TABLE t (a TEXT, b TEXT GENERATED ALWAYS AS (a), fulltext INDEX idx (b));
 | 
						|
CREATE TABLE t (a TEXT, b TEXT GENERATED ALWAYS AS (a));
 | 
						|
--error ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN
 | 
						|
ALTER TABLE t ADD FULLTEXT INDEX (b);
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
--error ER_SPATIAL_CANT_HAVE_NULL
 | 
						|
CREATE TABLE t (a geometry not null, b geometry GENERATED ALWAYS AS (a), spatial INDEX idx (b));
 | 
						|
CREATE TABLE t (a geometry not null, b geometry GENERATED ALWAYS AS (a));
 | 
						|
--error ER_SPATIAL_CANT_HAVE_NULL
 | 
						|
ALTER TABLE t ADD SPATIAL INDEX (b);
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
#test DEFAULT value
 | 
						|
CREATE TABLE t (a INT DEFAULT 1, b INT DEFAULT 2, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
CREATE INDEX idx ON t(c);
 | 
						|
INSERT INTO t(h)VALUES ('mm');
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
CREATE unique INDEX idx1 ON t(c);
 | 
						|
 | 
						|
--error ER_DUP_ENTRY
 | 
						|
INSERT INTO t(h)VALUES ('mm');
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
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;
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (1, 2, DEFAULT, 3, 'mm');
 | 
						|
INSERT INTO t1 VALUES (11, 22, DEFAULT, 23, 'mm');
 | 
						|
 | 
						|
connect(con1,localhost,root,,test);
 | 
						|
UPDATE t1 SET x = 4 WHERE x =3;
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
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;
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (1, 2, DEFAULT, 3, 'mm');
 | 
						|
INSERT INTO t1 VALUES (11, 22, DEFAULT, 23, 'mm');
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
SELECT * FROM t1;
 | 
						|
 | 
						|
connection con1;
 | 
						|
START TRANSACTION;
 | 
						|
UPDATE t1 SET x = 15 WHERE x = 3;
 | 
						|
 | 
						|
UPDATE t1 SET b = 10 WHERE b=2;
 | 
						|
ROLLBACK;
 | 
						|
 | 
						|
connection default;
 | 
						|
SELECT c FROM t1;
 | 
						|
 | 
						|
disconnect con1;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` INT(11) DEFAULT NULL,
 | 
						|
  `b` INT(11) DEFAULT NULL,
 | 
						|
  `c` INT(11) GENERATED ALWAYS AS (a+b) VIRTUAL,
 | 
						|
  `d` INT(11) GENERATED ALWAYS AS (a) VIRTUAL,
 | 
						|
  `h` INT(11) NOT NULL,
 | 
						|
  PRIMARY KEY (`h`),
 | 
						|
  KEY `idx` (`c`)
 | 
						|
) ENGINE=InnoDB;
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, DEFAULT, 1);
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, DEFAULT, 2);
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, DEFAULT, 3);
 | 
						|
INSERT INTO t VALUES (null, null, DEFAULT, DEFAULT, 4);
 | 
						|
 | 
						|
delimiter |;
 | 
						|
CREATE PROCEDURE UPDATE_t()
 | 
						|
begin
 | 
						|
        DECLARE i INT DEFAULT 1;
 | 
						|
        WHILE (i <= 2000) DO
 | 
						|
		UPDATE t SET a = 100 + i WHERE h = 1;
 | 
						|
                SET i = i + 1;
 | 
						|
        END WHILE;
 | 
						|
END|
 | 
						|
 | 
						|
CREATE PROCEDURE DELETE_insert_t()
 | 
						|
begin
 | 
						|
        DECLARE i INT DEFAULT 1;
 | 
						|
        WHILE (i <= 2000) DO
 | 
						|
		UPDATE t SET a = 100 + i WHERE h = 1;
 | 
						|
                SET i = i + 1;
 | 
						|
        END WHILE;
 | 
						|
END|
 | 
						|
delimiter ;|
 | 
						|
 | 
						|
CALL UPDATE_t();
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
CALL DELETE_insert_t();
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
DROP INDEX idx ON t;
 | 
						|
CALL UPDATE_t();
 | 
						|
SELECT c FROM t;
 | 
						|
 | 
						|
DROP PROCEDURE DELETE_insert_t;
 | 
						|
DROP PROCEDURE UPDATE_t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
--echo # Bug#20767937: WL8149:ASSERTION FAILED IN ROW_UPD_SEC_INDEX_ENTRY
 | 
						|
CREATE TABLE b (
 | 
						|
col_INT_nokey INTEGER NOT NULL,
 | 
						|
col_INT_key INTEGER GENERATED ALWAYS AS (col_INT_nokey) VIRTUAL,
 | 
						|
col_date_nokey DATE,
 | 
						|
col_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,
 | 
						|
        INTerval 30 day)) VIRTUAL,
 | 
						|
 | 
						|
col_datetime_nokey DATETIME NOT NULL,
 | 
						|
col_time_nokey TIME NOT NULL,
 | 
						|
 | 
						|
col_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey,
 | 
						|
      col_time_nokey)),
 | 
						|
col_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey,
 | 
						|
      col_time_nokey)),
 | 
						|
 | 
						|
col_VARCHAR_nokey VARCHAR(1) NOT NULL,
 | 
						|
col_VARCHAR_key VARCHAR(2) GENERATED ALWAYS AS(CONCAT(col_VARCHAR_nokey,
 | 
						|
      col_VARCHAR_nokey)),
 | 
						|
 | 
						|
KEY (col_INT_key),
 | 
						|
KEY (col_VARCHAR_key),
 | 
						|
KEY (col_date_key),
 | 
						|
KEY (col_time_key),
 | 
						|
KEY (col_datetime_key),
 | 
						|
KEY (col_INT_key, col_VARCHAR_key),
 | 
						|
KEY (col_INT_key, col_VARCHAR_key, col_date_key,
 | 
						|
col_time_key, col_datetime_key)
 | 
						|
);
 | 
						|
INSERT INTO b (
 | 
						|
  col_INT_nokey,
 | 
						|
  col_date_nokey,
 | 
						|
  col_time_nokey,
 | 
						|
  col_datetime_nokey,
 | 
						|
  col_VARCHAR_nokey
 | 
						|
) VALUES
 | 
						|
(0, NULL, '21:22:34.025509', '2002-02-13 17:30:06.013935', 'j'),
 | 
						|
(8, '2004-09-18', '10:50:38.059966', '2008-09-27
 | 
						|
00:34:58.026613', 'v');
 | 
						|
 | 
						|
EXPLAIN SELECT col_INT_key FROM b;
 | 
						|
SELECT col_INT_key FROM b;
 | 
						|
SELECT col_INT_nokey, col_INT_key FROM b;
 | 
						|
DELETE FROM b;
 | 
						|
 | 
						|
DROP TABLE b;
 | 
						|
 | 
						|
let $row_format=COMPACT;
 | 
						|
--source inc/innodb_v_large_col.inc
 | 
						|
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` BLOB,
 | 
						|
  `b` BLOB,
 | 
						|
  `c` BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
 | 
						|
  `d` BLOB GENERATED ALWAYS AS (b) VIRTUAL,
 | 
						|
  `e` INT(11) GENERATED ALWAYS AS (10) VIRTUAL,
 | 
						|
  `h` INT(11) NOT NULL,
 | 
						|
  PRIMARY KEY (`h`)
 | 
						|
) ENGINE=InnoDB;
 | 
						|
 | 
						|
INSERT INTO t VALUES (REPEAT('g', 16000), REPEAT('x', 16000), DEFAULT, DEFAULT, DEFAULT, 1);
 | 
						|
INSERT INTO t VALUES (REPEAT('a', 32000), REPEAT('b', 11000), DEFAULT, DEFAULT, DEFAULT, 2);
 | 
						|
INSERT INTO t VALUES (REPEAT('m', 18000), REPEAT('n', 46000), DEFAULT, DEFAULT, DEFAULT, 3);
 | 
						|
 | 
						|
CREATE INDEX idx ON t(c(100), d(20));
 | 
						|
 | 
						|
UPDATE t SET a = NULL WHERE h=1;
 | 
						|
 | 
						|
UPDATE t SET a = REPEAT(CAST(1 AS CHAR), 2000) WHERE h = 1;
 | 
						|
 | 
						|
UPDATE t SET a = REPEAT(CAST(1 AS CHAR), 1000) WHERE h = 1;
 | 
						|
 | 
						|
delimiter |;
 | 
						|
 | 
						|
CREATE PROCEDURE UPDATE_t()
 | 
						|
begin
 | 
						|
        DECLARE i INT DEFAULT 1;
 | 
						|
        WHILE (i <= 200) DO
 | 
						|
                UPDATE t SET a = REPEAT(CAST(i AS CHAR), 2000) WHERE h = 1;
 | 
						|
                SET i = i + 1;
 | 
						|
        END WHILE;
 | 
						|
END|
 | 
						|
 | 
						|
CREATE PROCEDURE DELETE_insert_t()
 | 
						|
begin
 | 
						|
        DECLARE i INT DEFAULT 1;
 | 
						|
        WHILE (i <= 200) DO
 | 
						|
                DELETE FROM t WHERE h = 1;
 | 
						|
                INSERT INTO t VALUES (REPEAT(CAST(i AS CHAR), 2000) ,  REPEAT('b', 2000), DEFAULT, DEFAULT, DEFAULT, 1);
 | 
						|
                SET i = i + 1;
 | 
						|
        END WHILE;
 | 
						|
END|
 | 
						|
delimiter ;|
 | 
						|
 | 
						|
CALL UPDATE_t();
 | 
						|
CALL DELETE_insert_t();
 | 
						|
 | 
						|
UPDATE t SET a = NULL WHERE h=1;
 | 
						|
 | 
						|
DROP PROCEDURE DELETE_insert_t;
 | 
						|
DROP PROCEDURE UPDATE_t;
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `m1` INT(11) DEFAULT NULL,
 | 
						|
  `m2` INT(11) DEFAULT NULL,
 | 
						|
  `m3` INT(11) GENERATED ALWAYS AS (m1 + m2) VIRTUAL,
 | 
						|
  `m4` INT(11) DEFAULT NULL,
 | 
						|
  `m5` CHAR(10) DEFAULT NULL,
 | 
						|
  `m6` CHAR(12) GENERATED ALWAYS AS (m5) VIRTUAL,
 | 
						|
  `a` VARCHAR(10000) DEFAULT NULL,
 | 
						|
  `b` VARCHAR(3000) DEFAULT NULL,
 | 
						|
  `c` VARCHAR(14000) GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
 | 
						|
  `d` VARCHAR(5000) GENERATED ALWAYS AS (b) VIRTUAL,
 | 
						|
  `e` INT(11) GENERATED ALWAYS AS (10) VIRTUAL,
 | 
						|
  `h` INT(11) NOT NULL,
 | 
						|
  PRIMARY KEY (`h`),
 | 
						|
  KEY `m3` (`m3`),
 | 
						|
  KEY `c` (`c`(100)),
 | 
						|
  KEY `e` (`e`,`d`(20))
 | 
						|
) ENGINE=InnoDB;
 | 
						|
 | 
						|
INSERT INTO t VALUES (1, 2, DEFAULT, 3, "aaa", DEFAULT, REPEAT('g', 10000), REPEAT('x', 2800), DEFAULT, DEFAULT, DEFAULT, 1);
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 21, DEFAULT, 31, "bbb", DEFAULT, REPEAT('a', 9000), REPEAT('b', 2000), DEFAULT, DEFAULT, DEFAULT, 2);
 | 
						|
 | 
						|
INSERT INTO t VALUES (21, 31, DEFAULT, 41, "zzz", DEFAULT, REPEAT('m', 8000), REPEAT('n', 3000), DEFAULT, DEFAULT, DEFAULT, 3);
 | 
						|
 | 
						|
ALTER TABLE t DROP COLUMN c;
 | 
						|
 | 
						|
DELETE FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
 | 
						|
 | 
						|
CREATE INDEX idx ON t(a, c);
 | 
						|
SELECT a, c FROM t;
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
 | 
						|
UPDATE t SET a = 13 where a = 11;
 | 
						|
 | 
						|
ROLLBACK;
 | 
						|
DELETE FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10), m int);
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, "a", 1);
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, "b", 2);
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, "c", 3 );
 | 
						|
INSERT INTO t VALUES (null, null, DEFAULT, "d", 4);
 | 
						|
 | 
						|
CREATE INDEX idx ON t(a, c, h);
 | 
						|
SELECT a, c FROM t;
 | 
						|
 | 
						|
START TRANSACTION;
 | 
						|
UPDATE t SET m =10 WHERE m = 1;
 | 
						|
UPDATE t SET h = "e" WHERE h="a";
 | 
						|
ROLLBACK;
 | 
						|
SELECT a, c, h FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
# bug#21065137 - WL8149:FAILING ASSERTION: NAME_OFS < FULL_LEN 
 | 
						|
CREATE TABLE `t1` (
 | 
						|
  `col1` int(11) NOT NULL,
 | 
						|
  `col2` int(11) NOT NULL,
 | 
						|
  `col3` int(11) NOT NULL,
 | 
						|
  `col4` int(11) DEFAULT NULL,
 | 
						|
  `col5` int(11) GENERATED ALWAYS AS (col2 % col3) VIRTUAL,
 | 
						|
  `col7` int(11) GENERATED ALWAYS AS (col5 * col5) VIRTUAL,
 | 
						|
  `col8` int(11) GENERATED ALWAYS AS (col5 % col5) VIRTUAL,
 | 
						|
  `col9` text,
 | 
						|
  `extra` int(11) DEFAULT NULL,
 | 
						|
  UNIQUE KEY `uidx` (`col5`)
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
						|
 | 
						|
ALTER TABLE t1 CHANGE COLUMN extra col6 INT;
 | 
						|
 | 
						|
SHOW CREATE TABLE t1;
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
# No spatial and FTS index on virtual columns
 | 
						|
--error ER_SPATIAL_CANT_HAVE_NULL
 | 
						|
CREATE TABLE t (a INT, b INT GENERATED ALWAYS AS (a), c point, d point GENERATED ALWAYS AS (c), spatial index idx (d));
 | 
						|
 | 
						|
--error ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN
 | 
						|
CREATE TABLE t (a INT, b INT GENERATED ALWAYS AS (a), c CHAR(10), d char(20) GENERATED ALWAYS AS (c), fulltext index idx (d));
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10), j INT, m INT  GENERATED ALWAYS AS(b + j), n VARCHAR(10), p VARCHAR(20) GENERATED ALWAYS AS(CONCAT(n, h)), INDEX idx1(c), INDEX idx2 (m), INDEX idx3(p));
 | 
						|
 | 
						|
INSERT INTO t VALUES(11, 22, DEFAULT, "AAA", 8, DEFAULT, "XXX", DEFAULT);
 | 
						|
INSERT INTO t VALUES(1, 2, DEFAULT, "uuu", 9, DEFAULT, "uu", DEFAULT);
 | 
						|
INSERT INTO t VALUES(3, 4, DEFAULT, "uooo", 1, DEFAULT, "umm", DEFAULT);
 | 
						|
 | 
						|
alter table t add  x int, add xx int generated ALWAYS AS(x);
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10), j INT, m INT  GENERATED ALWAYS AS(b + j), n VARCHAR(10), p VARCHAR(20) GENERATED ALWAYS AS(CONCAT(n, h)), INDEX idx1(c), INDEX idx2 (m), INDEX idx3(p));
 | 
						|
 | 
						|
INSERT INTO t VALUES(11, 22, DEFAULT, "AAA", 8, DEFAULT, "XXX", DEFAULT);
 | 
						|
INSERT INTO t VALUES(1, 2, DEFAULT, "uuu", 9, DEFAULT, "uu", DEFAULT);
 | 
						|
INSERT INTO t VALUES(3, 4, DEFAULT, "uooo", 1, DEFAULT, "umm", DEFAULT);
 | 
						|
 | 
						|
ALTER TABLE t DROP COLUMN c, algorithm=inplace;
 | 
						|
ALTER TABLE t DROP COLUMN p, ADD COLUMN s VARCHAR(20) GENERATED ALWAYS AS(CONCAT(n, h)), algorithm=inplace;
 | 
						|
 | 
						|
# This should fail
 | 
						|
#ALTER TABLE t ADD  x INT, DROP COLUMN m, algorithm=inplace;
 | 
						|
SELECT s FROM t;
 | 
						|
 | 
						|
ALTER TABLE t ADD  x VARCHAR(20) GENERATED ALWAYS AS(CONCAT(n, h)), ADD INDEX idx (x), algorithm=inplace;
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE `t1` (
 | 
						|
  `col1` int(11) DEFAULT NULL,
 | 
						|
  `col2` int(11) DEFAULT NULL,
 | 
						|
  `col3` int(11) DEFAULT NULL,
 | 
						|
  `col4` int(11) DEFAULT NULL,
 | 
						|
  `col5` int(11) GENERATED ALWAYS AS (col4 * col2) VIRTUAL,
 | 
						|
  `col6` int(11) GENERATED ALWAYS AS (col2 % col4) VIRTUAL,
 | 
						|
  `col7` int(11) GENERATED ALWAYS AS (col5 / col6) VIRTUAL,
 | 
						|
  `col8` int(11) GENERATED ALWAYS AS (col5 + col5) VIRTUAL,
 | 
						|
  `col9` text,
 | 
						|
  `extra` int(11) DEFAULT NULL
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
						|
 | 
						|
ALTER TABLE t1 DROP COLUMN col7;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE t1 (
 | 
						|
  col1 INTEGER NOT NULL,
 | 
						|
  gv_col INTEGER GENERATED ALWAYS AS (col1) VIRTUAL,
 | 
						|
  txt1 TEXT,
 | 
						|
  FULLTEXT INDEX fi(txt1)
 | 
						|
);
 | 
						|
 | 
						|
select * from t1; 
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE t1 (
 | 
						|
  col1 INTEGER NOT NULL,
 | 
						|
  col2 INTEGER NOT NULL,
 | 
						|
  col3 INTEGER DEFAULT NULL,
 | 
						|
  col4 INTEGER DEFAULT NULL,
 | 
						|
  col5 INTEGER DEFAULT NULL,
 | 
						|
  col6 INTEGER DEFAULT NULL,
 | 
						|
  col7 INTEGER DEFAULT NULL,
 | 
						|
  col8 INTEGER DEFAULT NULL,
 | 
						|
  col9 INTEGER DEFAULT NULL,
 | 
						|
  col10 INTEGER DEFAULT NULL,
 | 
						|
  col11 INTEGER DEFAULT NULL,
 | 
						|
  col12 INTEGER DEFAULT NULL,
 | 
						|
  col13 INTEGER DEFAULT NULL,
 | 
						|
  col14 INTEGER DEFAULT NULL,
 | 
						|
  col15 INTEGER DEFAULT NULL,
 | 
						|
  col16 INTEGER DEFAULT NULL,
 | 
						|
  col17 INTEGER DEFAULT NULL,
 | 
						|
  col18 INTEGER DEFAULT NULL,
 | 
						|
  col19 INTEGER DEFAULT NULL,
 | 
						|
  col20 INTEGER DEFAULT NULL,
 | 
						|
  col21 INTEGER DEFAULT NULL,
 | 
						|
  col22 INTEGER DEFAULT NULL,
 | 
						|
  col23 INTEGER DEFAULT NULL,
 | 
						|
  col24 INTEGER DEFAULT NULL,
 | 
						|
  col25 INTEGER DEFAULT NULL,
 | 
						|
  col26 INTEGER DEFAULT NULL,
 | 
						|
  col27 INTEGER DEFAULT NULL,
 | 
						|
  col28 INTEGER DEFAULT NULL,
 | 
						|
  col29 INTEGER DEFAULT NULL,
 | 
						|
  col30 INTEGER DEFAULT NULL,
 | 
						|
  col31 INTEGER DEFAULT NULL,
 | 
						|
  col32 INTEGER DEFAULT NULL,
 | 
						|
  col33 INTEGER DEFAULT NULL,
 | 
						|
  gcol1 INTEGER GENERATED ALWAYS AS (col1 + col2) VIRTUAL,
 | 
						|
  KEY idx1 (gcol1)
 | 
						|
);
 | 
						|
 | 
						|
INSERT INTO t1 (col1, col2)
 | 
						|
  VALUES (0,1), (1,2), (2,3), (3,4), (4,5);
 | 
						|
 | 
						|
SELECT gcol1 FROM t1 FORCE INDEX(idx1);
 | 
						|
 | 
						|
ALTER TABLE t1 ADD COLUMN extra INTEGER;
 | 
						|
 | 
						|
SELECT gcol1 FROM t1 FORCE INDEX(idx1);
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE t1 (
 | 
						|
    id INT NOT NULL,
 | 
						|
    store_id INT NOT NULL,
 | 
						|
    x INT GENERATED ALWAYS AS (id + store_id)
 | 
						|
)
 | 
						|
PARTITION BY RANGE (store_id) (
 | 
						|
    PARTITION p0 VALUES LESS THAN (6),
 | 
						|
    PARTITION p1 VALUES LESS THAN (11),
 | 
						|
    PARTITION p2 VALUES LESS THAN (16),
 | 
						|
    PARTITION p3 VALUES LESS THAN (21)
 | 
						|
);
 | 
						|
 | 
						|
INSERT INTO t1 VALUES(1, 2, default);
 | 
						|
INSERT INTO t1 VALUES(3, 4, default);
 | 
						|
 | 
						|
INSERT INTO t1 VALUES(3, 12, default);
 | 
						|
INSERT INTO t1 VALUES(4, 18, default);
 | 
						|
 | 
						|
CREATE INDEX idx ON t1(x);
 | 
						|
 | 
						|
SELECT x FROM t1;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE t1 (
 | 
						|
    id INT NOT NULL,
 | 
						|
    store_id INT NOT NULL,
 | 
						|
    x INT GENERATED ALWAYS AS (id + store_id)
 | 
						|
)
 | 
						|
PARTITION BY RANGE (x) (
 | 
						|
    PARTITION p0 VALUES LESS THAN (6),
 | 
						|
    PARTITION p1 VALUES LESS THAN (11),
 | 
						|
    PARTITION p2 VALUES LESS THAN (16),
 | 
						|
    PARTITION p3 VALUES LESS THAN (21)
 | 
						|
);
 | 
						|
 | 
						|
insert into t1 values(1, 2, default);
 | 
						|
insert into t1 values(3, 4, default);
 | 
						|
 | 
						|
insert into t1 values(3, 12, default);
 | 
						|
--error ER_NO_PARTITION_FOR_GIVEN_VALUE
 | 
						|
insert into t1 values(4, 18, default);
 | 
						|
 | 
						|
CREATE INDEX idx ON t1(x);
 | 
						|
SELECT x FROM t1;
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE t1 (a INT, b INT GENERATED ALWAYS AS (a+1) ,c int) PARTITION BY RANGE (b) (
 | 
						|
PARTITION p0 VALUES LESS THAN (6),
 | 
						|
PARTITION p1 VALUES LESS THAN (11),
 | 
						|
PARTITION p2 VALUES LESS THAN (16),
 | 
						|
PARTITION p3 VALUES LESS THAN (21) );
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (10,DEFAULT,2);
 | 
						|
INSERT INTO t1 VALUES (19,DEFAULT,8);
 | 
						|
 | 
						|
CREATE INDEX idx ON t1 (b);
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (5,DEFAULT,9);
 | 
						|
 | 
						|
SELECT * FROM t1;
 | 
						|
 | 
						|
ALTER TABLE t1 REMOVE PARTITIONING;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE `t#P#1` (a INT, bt INT GENERATED ALWAYS AS (a+1) ,c int)
 | 
						|
PARTITION BY RANGE (bt)
 | 
						|
subpartition by hash (bt)
 | 
						|
 (
 | 
						|
    PARTITION p0 VALUES LESS THAN (6) (
 | 
						|
        SUBPARTITION s0,
 | 
						|
        SUBPARTITION s1),
 | 
						|
    PARTITION p1 VALUES LESS THAN (11) (
 | 
						|
        SUBPARTITION s2,
 | 
						|
        SUBPARTITION s3),
 | 
						|
    PARTITION p2 VALUES LESS THAN (16) (
 | 
						|
        SUBPARTITION s4,
 | 
						|
        SUBPARTITION s5),
 | 
						|
    PARTITION p3 VALUES LESS THAN (21) (
 | 
						|
        SUBPARTITION s6,
 | 
						|
        SUBPARTITION s7)
 | 
						|
 );
 | 
						|
insert into `t#P#1` values (10,DEFAULT,2);
 | 
						|
insert into `t#P#1` values (19,DEFAULT,8);
 | 
						|
create index idx on `t#P#1` (bt);
 | 
						|
insert into `t#P#1` values (5,DEFAULT,9);
 | 
						|
select * from `t#P#1`;
 | 
						|
alter table `t#P#1` remove partitioning;
 | 
						|
drop table `t#P#1`;
 | 
						|
 | 
						|
let $row_format=DYNAMIC;
 | 
						|
--source inc/innodb_v_large_col.inc
 | 
						|
 | 
						|
let $row_format=REDUNDANT;
 | 
						|
--source inc/innodb_v_large_col.inc
 | 
						|
 | 
						|
let $row_format=COMPRESSED;
 | 
						|
--disable_query_log
 | 
						|
SET @save_innodb_read_only_compressed=@@GLOBAL.innodb_read_only_compressed;
 | 
						|
SET GLOBAL innodb_read_only_compressed=OFF;
 | 
						|
--enable_query_log
 | 
						|
--source inc/innodb_v_large_col.inc
 | 
						|
--disable_query_log
 | 
						|
SET GLOBAL innodb_read_only_compressed=@save_innodb_read_only_compressed;
 | 
						|
--enable_query_log
 | 
						|
 | 
						|
# Make sure FTS_DOC_ID for FULLTEXT index set with correct column id with
 | 
						|
# virtual columns
 | 
						|
CREATE TABLE t(a TEXT CHARSET UTF8)ENGINE=INNODB;
 | 
						|
ALTER TABLE t ADD COLUMN b BLOB GENERATED ALWAYS AS (a) VIRTUAL ;
 | 
						|
ALTER TABLE t ADD FULLTEXT INDEX (a) ;
 | 
						|
ALTER TABLE t ADD INDEX (b(1)) ;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t(a TEXT CHARSET UTF8, FULLTEXT INDEX(a))ENGINE=INNODB;
 | 
						|
ALTER TABLE t ADD COLUMN b BLOB GENERATED ALWAYS AS (a) VIRTUAL ;
 | 
						|
ALTER TABLE t ADD INDEX (b(1)) ;
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
# Virtual column cannot be used as DOC ID column for FULLTEXT index
 | 
						|
CREATE TABLE t(a TEXT CHARSET UTF8)ENGINE=INNODB;
 | 
						|
ALTER TABLE t ADD COLUMN FTS_DOC_ID BLOB GENERATED ALWAYS AS (a) VIRTUAL ;
 | 
						|
--error ER_INNODB_FT_WRONG_DOCID_COLUMN
 | 
						|
ALTER TABLE t ADD FULLTEXT INDEX (a) ;
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
# Test uses ICP on column h and d
 | 
						|
create table t (a int,b int,c int,d int,e int,
 | 
						|
f int generated always as (a+b) virtual,
 | 
						|
g int,h blob,i int,unique key (d,h(25))) engine=innodb;
 | 
						|
 | 
						|
select h from t where d is null;
 | 
						|
drop table t;
 | 
						|
 | 
						|
# Test Add virtual column of MySQL long true type
 | 
						|
create table t(a blob not null) engine=innodb;
 | 
						|
alter table t add column b int;
 | 
						|
alter table t add column c varbinary (1000) generated always as (a) virtual;
 | 
						|
alter table t add unique index (c(39));
 | 
						|
replace into t set a = 'a',b =1;
 | 
						|
replace into t set a = 'a',b =1;
 | 
						|
drop table t;
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
 | 
						|
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED
 | 
						|
ALTER TABLE t ADD COLUMN xs INT GENERATED ALWAYS AS(a+b), ADD COLUMN mm INT
 | 
						|
GENERATED ALWAYS AS(a+b) STORED, ALGORITHM = INPLACE;
 | 
						|
 | 
						|
ALTER TABLE t ADD COLUMN x INT GENERATED ALWAYS AS(a+b), ALGORITHM = INPLACE;
 | 
						|
 | 
						|
ALTER TABLE t DROP COLUMN x,  ALGORITHM = INPLACE;
 | 
						|
 | 
						|
ALTER TABLE t ADD COLUMN x1 INT GENERATED ALWAYS AS(a+b), DROP COLUMN c,
 | 
						|
ALGORITHM = INPLACE;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
if (0) {
 | 
						|
# Some test on virtual/stored column numbering for spatial indexing
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `b` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `c` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `d` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `e` POINT GENERATED ALWAYS AS (1) STORED
 | 
						|
) ENGINE=INNODB;
 | 
						|
ALTER TABLE t ADD SPATIAL INDEX (`e`);
 | 
						|
DROP TABLE t;
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `b` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `c` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `d` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `e` POINT GENERATED ALWAYS AS (1) STORED,
 | 
						|
   SPATIAL INDEX (`e`)
 | 
						|
) ENGINE=INNODB;
 | 
						|
DROP TABLE t;
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `b` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `c` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `d` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `e2` POINT GENERATED ALWAYS AS (1) STORED,
 | 
						|
  `e` POINT GENERATED ALWAYS AS (1) STORED
 | 
						|
) ENGINE=INNODB;
 | 
						|
ALTER TABLE t ADD SPATIAL INDEX (`e`);
 | 
						|
DROP TABLE t;
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `b` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `c` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `d` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `e2` POINT GENERATED ALWAYS AS (1) STORED,
 | 
						|
  `d2` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `e` POINT GENERATED ALWAYS AS (1) STORED
 | 
						|
) ENGINE=INNODB;
 | 
						|
ALTER TABLE t ADD SPATIAL INDEX (`e`);
 | 
						|
DROP TABLE t;
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `b` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `c` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `d` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `e2` POINT GENERATED ALWAYS AS (1) STORED,
 | 
						|
  `d2` INT GENERATED ALWAYS AS (1) VIRTUAL,
 | 
						|
  `e` int
 | 
						|
) ENGINE=INNODB;
 | 
						|
ALTER TABLE t ADD INDEX (`e`);
 | 
						|
DROP TABLE t;
 | 
						|
}
 | 
						|
 | 
						|
CREATE TABLE t (a INT GENERATED ALWAYS AS(1) VIRTUAL,KEY(a)) ENGINE=INNODB;
 | 
						|
INSERT INTO t VALUES(default);
 | 
						|
SELECT a FROM t FOR UPDATE;
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
# Test add virtual column and add index at the same time
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, 'mm');
 | 
						|
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, 'mm');
 | 
						|
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, 'mm');
 | 
						|
 | 
						|
INSERT INTO t VALUES (null, null, DEFAULT, 'mm');
 | 
						|
 | 
						|
--enable_info
 | 
						|
ALTER TABLE t ADD COLUMN x INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (x);
 | 
						|
--disable_info
 | 
						|
 | 
						|
SELECT x FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
CREATE TABLE t1 (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (11, 3, DEFAULT, 'mm');
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (18, 1, DEFAULT, 'mm');
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (28, 1, DEFAULT, 'mm');
 | 
						|
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t1 ADD INDEX idx12 (c) , FORCE, LOCK=NONE;
 | 
						|
ALTER TABLE t1 ADD INDEX idx12 (c), LOCK=NONE;
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t1 DROP COLUMN h,  ADD INDEX idx (c) , FORCE, LOCK=NONE;
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t1 DROP COLUMN h,  ADD INDEX idx (c), LOCK=NONE;
 | 
						|
 | 
						|
DROP TABLE t1 ;
 | 
						|
 | 
						|
# Check ALTER TABLE CHANGE VIRTUAL COLUMN TYPE and ORDER
 | 
						|
CREATE TABLE t1 (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), d INT GENERATED ALWAYS AS(a+b), h VARCHAR(10));
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (11, 3, DEFAULT, DEFAULT, 'mm');
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (18, 1, DEFAULT, DEFAULT, 'mm');
 | 
						|
 | 
						|
INSERT INTO t1 VALUES (28, 1, DEFAULT, DEFAULT, 'mm');
 | 
						|
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t1 CHANGE  d d INT GENERATED ALWAYS AS(a+b) FIRST, ALGORITHM = INPLACE;
 | 
						|
 | 
						|
# Change column type is not allow for inplace also
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED
 | 
						|
ALTER TABLE t1 CHANGE  d d VARCHAR(10) GENERATED ALWAYS AS(h), ALGORITHM = INPLACE;
 | 
						|
 | 
						|
ALTER TABLE t1 CHANGE  d d INT GENERATED ALWAYS AS(a+b) FIRST;
 | 
						|
 | 
						|
SHOW CREATE TABLE t1;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
# Test foreign key which could be a base column of indexed virtual column
 | 
						|
CREATE TABLE parent (id INT PRIMARY KEY) ENGINE=INNODB;
 | 
						|
 | 
						|
CREATE TABLE child (
 | 
						|
    id INT,
 | 
						|
    parent_id INT,
 | 
						|
    x int(11) GENERATED ALWAYS AS (parent_id+1),
 | 
						|
    INDEX par_ind (parent_id),
 | 
						|
    FOREIGN KEY (parent_id)
 | 
						|
        REFERENCES parent(id)
 | 
						|
        ON DELETE CASCADE
 | 
						|
) ENGINE=INNODB;
 | 
						|
 | 
						|
ALTER TABLE child ADD INDEX `i1` (x);
 | 
						|
 | 
						|
# If foreign constrain does not have cascade clause, or with "no action" clause
 | 
						|
# the index can still be created
 | 
						|
CREATE TABLE child_1 (
 | 
						|
    id INT,
 | 
						|
    parent_id INT,
 | 
						|
    x int(11) GENERATED ALWAYS AS (parent_id+1),
 | 
						|
    INDEX par_ind (parent_id),
 | 
						|
    FOREIGN KEY (parent_id)
 | 
						|
        REFERENCES parent(id)
 | 
						|
) ENGINE=INNODB;
 | 
						|
 | 
						|
# This should be successful
 | 
						|
ALTER TABLE child_1 ADD INDEX `i1` (x);
 | 
						|
 | 
						|
DROP TABLE child_1;
 | 
						|
 | 
						|
DROP TABLE child;
 | 
						|
 | 
						|
CREATE TABLE child (
 | 
						|
    id INT,
 | 
						|
    parent_id INT,
 | 
						|
    x int(11) GENERATED ALWAYS AS (parent_id+1),
 | 
						|
    INDEX par_ind (parent_id),
 | 
						|
    INDEX i1 (x),
 | 
						|
 | 
						|
    FOREIGN KEY (parent_id)
 | 
						|
        REFERENCES parent(id)
 | 
						|
        ON DELETE CASCADE
 | 
						|
) ENGINE=INNODB;
 | 
						|
 | 
						|
DROP TABLE child;
 | 
						|
 | 
						|
CREATE TABLE child (
 | 
						|
    id INT,
 | 
						|
    parent_id INT,
 | 
						|
    x int(11) GENERATED ALWAYS AS (parent_id+1),
 | 
						|
    INDEX par_ind (parent_id),
 | 
						|
    INDEX `i1` (x)
 | 
						|
) ENGINE=INNODB;
 | 
						|
 | 
						|
ALTER TABLE child ADD FOREIGN KEY (parent_id)
 | 
						|
REFERENCES parent(id)
 | 
						|
ON DELETE CASCADE;
 | 
						|
 | 
						|
# Check inplace option
 | 
						|
SET foreign_key_checks = 0;
 | 
						|
 | 
						|
ALTER TABLE child ADD FOREIGN KEY (parent_id)
 | 
						|
REFERENCES parent(id)
 | 
						|
ON DELETE CASCADE;
 | 
						|
 | 
						|
ALTER TABLE child ADD FOREIGN KEY (parent_id)
 | 
						|
REFERENCES parent(id)
 | 
						|
ON DELETE SET NULL;
 | 
						|
 | 
						|
ALTER TABLE child ADD FOREIGN KEY (parent_id)
 | 
						|
REFERENCES parent(id)
 | 
						|
ON UPDATE CASCADE;
 | 
						|
 | 
						|
# this should be successful
 | 
						|
ALTER TABLE child ADD FOREIGN KEY (parent_id)
 | 
						|
REFERENCES parent(id);
 | 
						|
 | 
						|
SET foreign_key_checks = 1;
 | 
						|
 | 
						|
DROP TABLE child;
 | 
						|
 | 
						|
DROP TABLE parent;
 | 
						|
 | 
						|
# Test for Bug 21890816 - ASSERT UPDATE->OLD_VROW, VIRTUAL COLUMNS
 | 
						|
CREATE TABLE `ibstd_16` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  `d` int(11) DEFAULT NULL,
 | 
						|
  `b` varchar(198) DEFAULT NULL,
 | 
						|
  `c` char(179) DEFAULT NULL,
 | 
						|
  `vadcol` int(11) GENERATED ALWAYS AS (a+length(d)) STORED,
 | 
						|
  `vbcol` char(2) GENERATED ALWAYS AS (substr(b,2,2)) VIRTUAL,
 | 
						|
  `vbidxcol` char(3) GENERATED ALWAYS AS (substr(b,1,3)) VIRTUAL,
 | 
						|
  UNIQUE KEY `b` (`b`(10),`d`),
 | 
						|
  KEY `d` (`d`),
 | 
						|
  KEY `a` (`a`),
 | 
						|
  KEY `c` (`c`(99),`b`(33)),
 | 
						|
  KEY `b_2` (`b`(5),`c`(10),`a`),
 | 
						|
  KEY `vbidxcol` (`vbidxcol`),
 | 
						|
  KEY `a_2` (`a`,`vbidxcol`),
 | 
						|
  KEY `vbidxcol_2` (`vbidxcol`,`d`)
 | 
						|
)  ENGINE=INNODB;
 | 
						|
 | 
						|
# Block when FK constraint on base column of stored column.
 | 
						|
--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED
 | 
						|
CREATE TABLE `ibstd_16_fk` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  `d` int(11) DEFAULT NULL,
 | 
						|
  `b` varchar(198) DEFAULT NULL,
 | 
						|
  `c` char(179) DEFAULT NULL,
 | 
						|
  `vadcol` int(11) GENERATED ALWAYS AS (a+length(d)) STORED,
 | 
						|
  `vbcol` char(2) GENERATED ALWAYS AS (substr(b,2,2)) VIRTUAL,
 | 
						|
  `vbidxcol` char(3) GENERATED ALWAYS AS (substr(b,1,3)) VIRTUAL,
 | 
						|
  UNIQUE KEY `b` (`b`(10),`a`,`d`),
 | 
						|
  KEY `d` (`d`),
 | 
						|
  KEY `a` (`a`),
 | 
						|
  KEY `c` (`c`(99),`b`(33)),
 | 
						|
  KEY `b_2` (`b`(5),`c`(10),`a`),
 | 
						|
  KEY `vbidxcol` (`vbidxcol`),
 | 
						|
  KEY `a_2` (`a`,`vbidxcol`),
 | 
						|
  KEY `vbidxcol_2` (`vbidxcol`,`d`),
 | 
						|
  CONSTRAINT `fk_16` FOREIGN KEY (`a`) REFERENCES `ibstd_16` (`a`) ON DELETE SET NULL
 | 
						|
) ENGINE=InnoDB;
 | 
						|
 | 
						|
# Take out "KEY `a_2` (`a`,`vbidxcol`)", this should then be successful
 | 
						|
CREATE TABLE `ibstd_16_fk` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  `d` int(11) DEFAULT NULL,
 | 
						|
  `b` varchar(198) DEFAULT NULL,
 | 
						|
  `c` char(179) DEFAULT NULL,
 | 
						|
  `vbcol` char(2) GENERATED ALWAYS AS (substr(b,2,2)) VIRTUAL,
 | 
						|
  `vbidxcol` char(3) GENERATED ALWAYS AS (substr(b,1,3)) VIRTUAL,
 | 
						|
  UNIQUE KEY `b` (`b`(10),`a`,`d`),
 | 
						|
  KEY `d` (`d`),
 | 
						|
  KEY `a` (`a`),
 | 
						|
  KEY `c` (`c`(99),`b`(33)),
 | 
						|
  KEY `b_2` (`b`(5),`c`(10),`a`),
 | 
						|
  KEY `vbidxcol` (`vbidxcol`),
 | 
						|
  KEY `vbidxcol_2` (`vbidxcol`,`d`),
 | 
						|
  CONSTRAINT `fk_16` FOREIGN KEY (`a`) REFERENCES `ibstd_16` (`a`) ON DELETE SET NULL
 | 
						|
) ENGINE=InnoDB;
 | 
						|
 | 
						|
ALTER TABLE ibstd_16_fk ADD INDEX `a_2` (`a`,`vbidxcol`);
 | 
						|
 | 
						|
# Now try to add a table with virtual index, and then add constraint
 | 
						|
DROP TABLE ibstd_16_fk;
 | 
						|
 | 
						|
# Create a table without constraint
 | 
						|
CREATE TABLE `ibstd_16_fk` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  `d` int(11) DEFAULT NULL,
 | 
						|
  `b` varchar(198) DEFAULT NULL,
 | 
						|
  `c` char(179) DEFAULT NULL,
 | 
						|
  `vbcol` char(2)  GENERATED ALWAYS AS (substr(b,2,2)) VIRTUAL,
 | 
						|
  `vbidxcol` char(3) GENERATED ALWAYS AS (substr(b,1,3)) VIRTUAL,
 | 
						|
  UNIQUE KEY `b` (`b`(10),`a`,`d`),
 | 
						|
  KEY `d` (`d`),
 | 
						|
  KEY `a` (`a`),
 | 
						|
  KEY `c` (`c`(99),`b`(33)),
 | 
						|
  KEY `b_2` (`b`(5),`c`(10),`a`),
 | 
						|
  KEY `vbidxcol` (`vbidxcol`),
 | 
						|
  KEY `a_2` (`a`,`vbidxcol`),
 | 
						|
  KEY `vbidxcol_2` (`vbidxcol`,`d`)
 | 
						|
) ENGINE=InnoDB;
 | 
						|
 | 
						|
ALTER TABLE `ibstd_16_fk` ADD CONSTRAINT `fk_16` FOREIGN KEY (`a`) REFERENCES `ibstd_16` (`a`) ON DELETE SET NULL;
 | 
						|
 | 
						|
# DROP the index
 | 
						|
DROP INDEX a_2 ON ibstd_16_fk;
 | 
						|
 | 
						|
INSERT INTO ibstd_16 VALUES (1, 2, "aaa", "bbb", default, default, default);
 | 
						|
INSERT INTO ibstd_16_fk VALUES(1, 3, "mmm", "SSS", default, default);
 | 
						|
 | 
						|
# Cascading delete/update on column non-related to virtual column or virtual
 | 
						|
# index will be fine
 | 
						|
DELETE FROM ibstd_16 WHERE a = 1;
 | 
						|
 | 
						|
DROP TABLE ibstd_16_fk;
 | 
						|
DROP TABLE ibstd_16;
 | 
						|
 | 
						|
# Bug 21941320 - GCOLS: FAILING ASSERTION: N_IDX > 0
 | 
						|
create table t(a int) engine=innodb;
 | 
						|
insert into t set a=1;
 | 
						|
alter table t add column c int generated always as (1) virtual;
 | 
						|
insert into t set a=2;
 | 
						|
 | 
						|
# Following will cause create index fail, we need to make sure the column
 | 
						|
# ord_part is reset
 | 
						|
--error ER_DUP_ENTRY
 | 
						|
alter table t add unique index(c);
 | 
						|
insert into t set a=1;
 | 
						|
drop table t;
 | 
						|
 | 
						|
# Bug 21875974 - VCOL : READ OF FREED MEMORY IN DTUPLE_GET_N_FIELDS
 | 
						|
# CAUSE CRASH
 | 
						|
 | 
						|
create table t (
 | 
						|
  x int,
 | 
						|
  a int generated always as (x) virtual,
 | 
						|
  b int generated always as (1) stored,
 | 
						|
  c int not null,
 | 
						|
  unique (b),
 | 
						|
  unique (a,b)
 | 
						|
) engine=innodb;
 | 
						|
 | 
						|
insert into t(x, c) values(1, 3);
 | 
						|
 | 
						|
# This will exercise row_vers_impl_x_locked_low() for virtual columns
 | 
						|
replace into t(x, c) values(1, 0);
 | 
						|
 | 
						|
drop table t;
 | 
						|
 | 
						|
# Bug22123674 VCOL:INNODB: FAILING ASSERTION: !UT_STRCMP(NAME,
 | 
						|
# FIELD->FIELD_NAME)
 | 
						|
 | 
						|
CREATE TABLE t(
 | 
						|
c7c CHAR(1)GENERATED ALWAYS AS (c3) VIRTUAL,
 | 
						|
c1 int(1),
 | 
						|
c2 int(1),
 | 
						|
c3 int(1),
 | 
						|
c4 int(1),
 | 
						|
c5 int(1)GENERATED ALWAYS AS ((c2 - c4)) VIRTUAL,
 | 
						|
UNIQUE KEY c5_9(c5)
 | 
						|
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
						|
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED
 | 
						|
ALTER TABLE t CHANGE COLUMN c5 c5 INT(1) GENERATED ALWAYS AS(c2 -
 | 
						|
c4)VIRTUAL AFTER c3,ALGORITHM=INPLACE;
 | 
						|
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED
 | 
						|
ALTER TABLE t CHANGE COLUMN c7c c7c INT(1) GENERATED ALWAYS AS(c3)
 | 
						|
VIRTUAL AFTER c5,ALGORITHM=INPLACE;
 | 
						|
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t DROP COLUMN c7c,ADD COLUMN c5c INT GENERATED ALWAYS AS(c4/
 | 
						|
c3)VIRTUAL AFTER c3,ALGORITHM=INPLACE;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
# Bug22111464	VCOL:INNODB: FAILING ASSERTION: I < TABLE->N_DEF
 | 
						|
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `col1` int(11) DEFAULT NULL,
 | 
						|
  `col2` int(11) DEFAULT NULL,
 | 
						|
  `col4` int(11) DEFAULT NULL,
 | 
						|
  `col5` int(11) GENERATED ALWAYS AS ((`col2` % `col4`)) VIRTUAL,
 | 
						|
  `col6` int(11) GENERATED ALWAYS AS ((`col2` - `col2`)) VIRTUAL,
 | 
						|
  `col5x` int(11) GENERATED ALWAYS AS ((`col1` / `col1`)) VIRTUAL,
 | 
						|
  `col6x` int(11) GENERATED ALWAYS AS ((`col2` / `col4`)) VIRTUAL,
 | 
						|
  `col7x` int(11) GENERATED ALWAYS AS ((`col6` % `col6x`)) VIRTUAL,
 | 
						|
  `col8x` int(11) GENERATED ALWAYS AS ((`col6` / `col6`)) VIRTUAL,
 | 
						|
  `col9` text,
 | 
						|
  `col7c` int(11) GENERATED ALWAYS AS ((`col6x` % `col6x`)) VIRTUAL,
 | 
						|
  `col1b` varchar(20) GENERATED ALWAYS AS (`col1`) VIRTUAL,
 | 
						|
  `col3` int(11) DEFAULT NULL,
 | 
						|
  `col7` int(11) DEFAULT NULL,
 | 
						|
  `col5c` int(11) GENERATED ALWAYS AS ((`col5x` * `col6`)) VIRTUAL,
 | 
						|
  `col6c` varchar(20) GENERATED ALWAYS AS (`col5x`) VIRTUAL,
 | 
						|
  `col3b` bigint(20) GENERATED ALWAYS AS ((`col6x` * `col6`)) VIRTUAL,
 | 
						|
  `col1a` varchar(20) GENERATED ALWAYS AS (`col1`) VIRTUAL,
 | 
						|
  `col8` int(11) DEFAULT NULL,
 | 
						|
  UNIQUE KEY `col5` (`col5`),
 | 
						|
  UNIQUE KEY `col6x` (`col6x`),
 | 
						|
  UNIQUE KEY `col5_2` (`col5`),
 | 
						|
  KEY `idx2` (`col9`(10)),
 | 
						|
  KEY `idx4` (`col2`),
 | 
						|
  KEY `idx8` (`col9`(10),`col5`),
 | 
						|
  KEY `idx9` (`col6`),
 | 
						|
  KEY `idx6` (`col6`)
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
						|
 | 
						|
ALTER TABLE t CHANGE COLUMN col3b col8a BIGINT GENERATED ALWAYS AS
 | 
						|
(col6x * col6) VIRTUAL, ADD UNIQUE KEY uidx ( col8a );
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Bug 22141031 - GCOLS: PURGED THREAD DIES: TRIED TO PURGE
 | 
						|
--echo # NON-DELETE-MARKED RECORD IN INDEX
 | 
						|
--echo #
 | 
						|
create table t (
 | 
						|
  a int,b int,c text,d int,e int,f int,g int,
 | 
						|
  h text generated always as ('1') virtual,
 | 
						|
  i int,j int,k int,l int,m int,
 | 
						|
  primary key (c(1)),unique key (c(1)),
 | 
						|
  key (i),key (h(1))
 | 
						|
) engine=innodb default charset latin1;
 | 
						|
 | 
						|
replace into t(c) values ('');
 | 
						|
replace into t(c) values ('');
 | 
						|
alter table t drop column d ;
 | 
						|
 | 
						|
drop table t;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Bug 22139917 - ASSERTION: DICT_TABLE_GET_NTH_COL(USER_TABLE, NTH_COL)
 | 
						|
--echo # ->LEN < NEW_LEN
 | 
						|
--echo #
 | 
						|
 | 
						|
create table t (
 | 
						|
  a int generated always as (1) virtual,
 | 
						|
  b varbinary(1),
 | 
						|
  c varbinary(1) generated always as (b) virtual
 | 
						|
) engine=innodb;
 | 
						|
alter table t change column b b varbinary(2), algorithm=inplace;
 | 
						|
alter table t change column c c varbinary(2) generated always as (b) virtual, algorithm=inplace;
 | 
						|
 | 
						|
drop table t;
 | 
						|
 | 
						|
# Bug22202788	GCOL:ASSERTION:0 IN ROW_SEL_GET_CLUST_REC_FOR_MYSQL AT
 | 
						|
# ROW0SEL.CC
 | 
						|
SET @@SESSION.sql_mode=0;
 | 
						|
 | 
						|
CREATE TABLE t(
 | 
						|
	c1 INT AUTO_INCREMENT,
 | 
						|
	c2 INT,
 | 
						|
	c3 INT GENERATED ALWAYS AS(c2 + c2)VIRTUAL,
 | 
						|
	c3k INT GENERATED ALWAYS AS(c2 + c3)VIRTUAL,
 | 
						|
	c4 DATE,
 | 
						|
	c5 DATE GENERATED ALWAYS AS(DATE_ADD(c4,interval 30 day)) VIRTUAL,
 | 
						|
	c5k DATE GENERATED ALWAYS AS(DATE_ADD(c4,interval 30 day)) VIRTUAL,
 | 
						|
	c5time_gckey DATE,
 | 
						|
	c6 TIME,
 | 
						|
	c5time DATE GENERATED ALWAYS AS(ADDTIME(c5time_gckey,c6)) VIRTUAL,
 | 
						|
	c7 TIME GENERATED ALWAYS AS(ADDTIME(c5time_gckey,c6)) VIRTUAL,
 | 
						|
	c5timek DATE GENERATED ALWAYS AS(ADDTIME(c5time_gckey,c7)) VIRTUAL,
 | 
						|
	c7k TIME GENERATED ALWAYS AS(ADDTIME(c5time,c6)) VIRTUAL,
 | 
						|
	c8 CHAR(10),
 | 
						|
	c9 CHAR(20)GENERATED ALWAYS AS (CONCAT(RTRIM(c8),RTRIM(c8))) VIRTUAL,
 | 
						|
	c9k CHAR(15)GENERATED ALWAYS AS (CONCAT(RTRIM(c8),0)) VIRTUAL,
 | 
						|
	PRIMARY KEY(c1),
 | 
						|
	KEY(c3),
 | 
						|
	KEY(c9(10)),
 | 
						|
	UNIQUE KEY(c9k),
 | 
						|
	UNIQUE KEY(c3k,c9k(5),c5k,c7k,c5timek,c3,c9(5),c5,c7,c5time)
 | 
						|
)ENGINE=INNODB;
 | 
						|
 | 
						|
--error ER_DUP_ENTRY
 | 
						|
INSERT INTO
 | 
						|
t(c2,c4,c6,c5time_gckey,c8)VALUES(1,0,0,0,0),(0,0,0,0,'ityzg'),(0,0,1,0,'tyzgk
 | 
						|
t'),(0,1,0,1,'yzgktb'),(0,0,0,0,'zgktb'),(0,0,0,0,'gktbkj'),(0,0,0,0,0),(0,0,1
 | 
						|
,0,1),(0,0,0,0,1),(0,0,0,0,'tbkjrkm'),(0,0,0,0,'bkjr'),(0,0,0,0,0),(0,0,0,0,0)
 | 
						|
,(0,0,0,0,'rk'),(0,0,0,0,'kmqmknbtoe'),(1,0,0,0,'mqmknbt'),(0,1,0,0,'qmknb'),(
 | 
						|
0,0,0,0,'mkn'),(0,0,0,0,'knbtoervql'),(0,0,1,0,1),(0,0,0,0,'nbtoerv'),(0,0,0,0
 | 
						|
,'btoerv'),(0,0,1,0,'toer'),(1,0,0,0,0),(0,0,0,0,'ervq'),(0,0,0,0,'rvqlzsvasu'
 | 
						|
),(0,0,0,0,'vqlzs'),(0,0,0,0,0),(0,1,0,0,'lzsvasu'),(0,0,0,0,'zsvasurq');
 | 
						|
 | 
						|
SELECT
 | 
						|
DISTINCT * FROM t
 | 
						|
FORCE KEY(PRIMARY,c3k,c3,c9k,c9)
 | 
						|
WHERE
 | 
						|
(c9 IS NULL AND (c9=0))
 | 
						|
OR(
 | 
						|
(c9k NOT IN ('ixfq','xfq','New Mexico','fq')OR c9 IS NULL)
 | 
						|
)
 | 
						|
OR(c9 BETWEEN 'hwstqua' AND 'wstquadcji' OR (c9k=0))
 | 
						|
AND(c3 IS NULL OR c3 IN (0,0,0));
 | 
						|
 | 
						|
drop table t;
 | 
						|
 | 
						|
#
 | 
						|
# BUG#22082762 RE-ENABLE SUPPORT FOR ADDING VIRTUAL INDEX WHILE DROPPING VIRTUAL COLUMN
 | 
						|
#
 | 
						|
 | 
						|
CREATE TABLE t (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), d INT
 | 
						|
GENERATED ALWAYS AS(a+b+b), e INT  GENERATED ALWAYS AS(a), h VARCHAR(10));
 | 
						|
 | 
						|
INSERT INTO t VALUES (11, 3, DEFAULT, DEFAULT, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (18, 1, DEFAULT, DEFAULT, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (28, 1, DEFAULT, DEFAULT, DEFAULT, 'mm');
 | 
						|
INSERT INTO t VALUES (null, null, DEFAULT, DEFAULT, DEFAULT, 'mm');
 | 
						|
CREATE INDEX idx ON t(c, d);
 | 
						|
CREATE INDEX idx1 ON t(c);
 | 
						|
CREATE INDEX idx2 ON t(e, c, d);
 | 
						|
 | 
						|
# This will drop column c, drop index idx1 on column c, and build index
 | 
						|
# idx and idx2, so they become idx(d) and idx2(e, d) respectively.
 | 
						|
ALTER TABLE t DROP COLUMN c, ALGORITHM=INPLACE;
 | 
						|
 | 
						|
SELECT d FROM t;
 | 
						|
 | 
						|
SHOW CREATE TABLE t;
 | 
						|
 | 
						|
# Drop a column, adding a new column and also adding a index on this new column
 | 
						|
# is not allowed for INPLACE algorithm
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t DROP COLUMN d, ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (c), ALGORITHM=INPLACE;
 | 
						|
 | 
						|
# Add an index on existing column along with dropping a column is allowed
 | 
						|
ALTER TABLE t DROP COLUMN d, ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (e), ALGORITHM=INPLACE, LOCK=NONE;
 | 
						|
SHOW CREATE TABLE t;
 | 
						|
 | 
						|
# Add an index on existing column along with adding a virtual column and droping a virtual index
 | 
						|
ALTER TABLE t ADD INDEX idx4(c, e), ADD COLUMN x VARCHAR(10) GENERATED ALWAYS AS(h), DROP INDEX idx, ALGORITHM=INPLACE, LOCK=NONE;
 | 
						|
SHOW CREATE TABLE t;
 | 
						|
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t ADD COLUMN i INT GENERATED ALWAYS AS(a+a+b), ADD COLUMN j INT, ALGORITHM=INPLACE;
 | 
						|
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t ADD INDEX (x), ADD COLUMN j INT, ALGORITHM=INPLACE, LOCK=NONE;
 | 
						|
ALTER TABLE t ADD INDEX (x), ADD COLUMN j INT, ALGORITHM=INPLACE;
 | 
						|
SHOW CREATE TABLE t;
 | 
						|
 | 
						|
# Online add an index on newly added virtual column is not allowed.
 | 
						|
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 | 
						|
ALTER TABLE t ADD COLUMN i INT GENERATED ALWAYS AS(a+a+b), ADD INDEX (i), ALGORITHM=INPLACE, LOCK=NONE;
 | 
						|
 | 
						|
ALTER TABLE t ADD COLUMN i INT GENERATED ALWAYS AS(a+a+b), ADD INDEX (i), ALGORITHM=INPLACE, LOCK=SHARED;
 | 
						|
SHOW CREATE TABLE t;
 | 
						|
 | 
						|
SELECT i FROM t;
 | 
						|
 | 
						|
SELECT * FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
#
 | 
						|
# BUG#22469459 WRONG VALUES IN ADDED INDEX WHILE DROPPING VIRTUAL COLUMN
 | 
						|
#
 | 
						|
 | 
						|
# Drop column with existing index on it.
 | 
						|
CREATE TABLE t (
 | 
						|
  a INT,
 | 
						|
  b INT,
 | 
						|
  c INT GENERATED ALWAYS AS(a+b),
 | 
						|
  d INT GENERATED ALWAYS AS(a+b+b),
 | 
						|
  KEY vidx (c, d)
 | 
						|
)ENGINE=INNODB;
 | 
						|
 | 
						|
INSERT INTO t (a,b) VALUES (0, 0), (1, NULL), (NULL, 2), (NULL, NULL);
 | 
						|
 | 
						|
SELECT c, d FROM t;
 | 
						|
 | 
						|
SELECT * FROM t;
 | 
						|
 | 
						|
ALTER TABLE t DROP COLUMN c, ALGORITHM=INPLACE;
 | 
						|
 | 
						|
SELECT d FROM t;
 | 
						|
 | 
						|
SELECT * FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
# Drop column with a new index.
 | 
						|
CREATE TABLE t (
 | 
						|
  a INT,
 | 
						|
  b INT,
 | 
						|
  c INT GENERATED ALWAYS AS(a+b),
 | 
						|
  d INT GENERATED ALWAYS AS(a+b+b)
 | 
						|
)ENGINE=INNODB;
 | 
						|
 | 
						|
INSERT INTO t (a,b) VALUES (0, 0), (1, NULL), (NULL, 2), (NULL, NULL);
 | 
						|
 | 
						|
SELECT * FROM t;
 | 
						|
 | 
						|
ALTER TABLE t DROP COLUMN c, ADD INDEX vidx(d), ALGORITHM=INPLACE;
 | 
						|
 | 
						|
SELECT d FROM t;
 | 
						|
 | 
						|
SELECT * FROM t WHERE d > 0;
 | 
						|
 | 
						|
SELECT * FROM t;
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Bug #22162200 MEMORY LEAK IN HA_INNOPART_SHARE
 | 
						|
--echo # ::SET_V_TEMPL PARTITIONED ON VIRTUAL COLUMN
 | 
						|
--echo #
 | 
						|
create table t (
 | 
						|
  c tinyint,
 | 
						|
  d longblob generated always as (c) virtual
 | 
						|
) engine=innodb partition by key (c) partitions 2;
 | 
						|
 | 
						|
select d in(select d from t)from t group by d;
 | 
						|
drop table t;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # BUG#23052231 - ASSERTION FAILURE: ROW0MERGE.CC:2100:ADD_AUTOINC
 | 
						|
--echo # < DICT_TABLE_GET_N_USER_COLS
 | 
						|
--echo #
 | 
						|
CREATE TABLE `t` (
 | 
						|
  `a` int(11) NOT NULL,
 | 
						|
  `d` int(11) NOT NULL,
 | 
						|
  `b` varchar(198) NOT NULL,
 | 
						|
  `c` char(177) DEFAULT NULL,
 | 
						|
  `vadcol` int(11) GENERATED ALWAYS AS ((`a` + length(`d`))) STORED,
 | 
						|
  `vbcol` char(2) GENERATED ALWAYS AS (substr(`b`,2,2)) VIRTUAL,
 | 
						|
  `vbidxcol` char(3) GENERATED ALWAYS AS (substr(`b`,1,3)) VIRTUAL,
 | 
						|
  PRIMARY KEY (`b`(10),`a`,`d`),
 | 
						|
  KEY `d` (`d`),
 | 
						|
  KEY `a` (`a`),
 | 
						|
  KEY `c_renamed` (`c`(99),`b`(35)),
 | 
						|
  KEY `b` (`b`(5),`c`(10),`a`),
 | 
						|
  KEY `vbidxcol` (`vbidxcol`),
 | 
						|
  KEY `a_2` (`a`,`vbidxcol`),
 | 
						|
  KEY `vbidxcol_2` (`vbidxcol`,`d`)
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
						|
 | 
						|
INSERT INTO t values (11, 1, "11", "aa", default, default, default);
 | 
						|
 | 
						|
ALTER TABLE t ADD COLUMN nc01128 BIGINT  AUTO_INCREMENT NOT NULL, ADD KEY auto_nc01128(nc01128);
 | 
						|
 | 
						|
DROP TABLE t;
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo #Bug #22965271 NEEDS REBUILD FOR COLUMN LENGTH CHANGE THAT IS
 | 
						|
--echo #PART OF VIRTUAL INDEX.
 | 
						|
--echo #
 | 
						|
 | 
						|
CREATE TABLE t1(
 | 
						|
a VARCHAR(45) CHARACTER SET LATIN1,
 | 
						|
b VARCHAR(115) CHARACTER SET UTF8 GENERATED ALWAYS AS ('f1') VIRTUAL,
 | 
						|
UNIQUE KEY (b,a))ENGINE=INNODB;
 | 
						|
INSERT INTO t1(a) VALUES ('');
 | 
						|
ALTER TABLE t1 CHANGE COLUMN a a VARCHAR(85);
 | 
						|
SELECT * FROM t1;
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
CREATE TABLE t1 (a INT GENERATED ALWAYS AS(1) VIRTUAL) ENGINE=InnoDB;
 | 
						|
ALTER TABLE t1 ADD b INT GENERATED ALWAYS AS (2) VIRTUAL;
 | 
						|
ALTER TABLE t1 ADD c INT;
 | 
						|
SELECT * FROM t1;
 | 
						|
INSERT INTO t1 SET c=3;
 | 
						|
SELECT * FROM t1;
 | 
						|
DROP TABLE t1;
 |