1
0
mirror of https://github.com/MariaDB/server.git synced 2025-12-24 11:21:21 +03:00

MDEV-5800 InnoDB support for indexed vcols

* remove old 5.2+ InnoDB support for virtual columns
  * enable corresponding parts of the innodb-5.7 sources
  * copy corresponding test cases from 5.7
  * copy detailed Alter_inplace_info::HA_ALTER_FLAGS flags from 5.7
     - and more detailed detection of changes in fill_alter_inplace_info()
  * more "innodb compatibility hooks" in sql_class.cc to
     - create/destroy/reset a THD (used by background purge threads)
     - find a prelocked table by name
     - open a table (from a background purge thread)

  * different from 5.7:
    - new service thread "thd_destructor_proxy" to make sure all THDs are
      destroyed at the correct point in time during the server shutdown
    - proper opening/closing of tables for vcol evaluations in
       + FK checks (use already opened prelocked tables)
       + purge threads (open the table, MDLock it, add it to tdc, close
         when not needed)
    - cache open tables in vc_templ
    - avoid unnecessary allocations, reuse table->record[0] and table->s->default_values
    - not needed in 5.7, because it overcalculates:
      + tell the server to calculate vcols for an on-going inline ADD INDEX
      + calculate vcols for correct error messages

  * update other engines (mroonga/tokudb) accordingly
This commit is contained in:
Sergei Golubchik
2016-11-07 22:35:02 +01:00
parent 7fca91f2b4
commit 1cae1af6f9
65 changed files with 7367 additions and 1106 deletions

View File

@@ -9,9 +9,13 @@ innodb-locks
innodb-buffer-pool-stats
innodb-buffer-page
innodb-buffer-page-lru
innodb-sys-columns
innodb-sys-fields
innodb-sys-foreign
innodb-sys-foreign-cols
innodb-sys-indexes
innodb-sys-tables
innodb-sys-virtual
innodb-metrics
[xtradb_plugin]
@@ -54,6 +58,10 @@ innodb-metrics
innodb-buffer-pool-stats
innodb-buffer-page
innodb-buffer-page-lru
innodb-sys-columns
innodb-sys-fields
innodb-sys-foreign
innodb-sys-foreign-cols
innodb-sys-indexes
innodb-sys-tables
innodb-sys-virtual

View File

@@ -395,7 +395,7 @@ ALTER TABLE t CHANGE c c varchar(10) as ('a');
ALTER TABLE t CHANGE dd d varchar(10);
if ($support_virtual_index)
{
# no RENAME INDEX yet
#ALTER TABLE t ADD INDEX idx(a), ADD INDEX idx1(c);
#ALTER TABLE t RENAME INDEX idx TO idx2, RENAME INDEX idx1 TO idx3;
#ALTER TABLE t DROP INDEX idx2, DROP INDEX idx3;

View File

@@ -0,0 +1,53 @@
--source include/have_innodb.inc
eval CREATE TABLE `t` (
`a` VARCHAR(10000), `b` VARCHAR(3000),
`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`) ) ROW_FORMAT=$row_format ENGINE=InnoDB;
SHOW CREATE TABLE t;
INSERT INTO t VALUES (REPEAT('g', 10000), REPEAT('x', 2800), DEFAULT, DEFAULT, DEFAULT, 1);
INSERT INTO t VALUES (REPEAT('a', 9000), REPEAT('b', 2000), DEFAULT, DEFAULT, DEFAULT, 2);
INSERT INTO t VALUES (REPEAT('m', 8000), REPEAT('n', 3000), DEFAULT, DEFAULT, DEFAULT, 3);
CREATE INDEX idx ON t(c(100), d(20));
UPDATE t SET a = REPEAT(CAST(1 AS CHAR), 2000) WHERE h = 1;
delimiter |;
CREATE PROCEDURE UPDATE_t()
begin
DECLARE i INT DEFAULT 1;
WHILE (i <= 100) 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 <= 100) 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;
START TRANSACTION;
CALL UPDATE_t();
ROLLBACK;
DROP PROCEDURE DELETE_insert_t;
DROP PROCEDURE UPDATE_t;
DROP TABLE t;

View File

@@ -59,189 +59,147 @@ DROP TABLE t1;
#
CREATE TABLE c (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER /*! NULL */,
col_int_key INTEGER GENERATED ALWAYS AS
(col_int_nokey + col_int_nokey) VIRTUAL not null,
col_date_nokey DATE /*! NULL */,
col_date_key DATE GENERATED ALWAYS AS
(DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL not null,
col_datetime_nokey DATETIME /*! NULL */,
col_time_nokey TIME /*! NULL */,
col_datetime_key DATETIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_time_key TIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_varchar_nokey VARCHAR(1) /*! NULL */,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS
(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL not null,
col_int_nokey INTEGER,
gcol_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_date_nokey DATE,
gcol_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL,
col_datetime_nokey DATETIME,
col_time_nokey TIME,
gcol_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
gcol_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_varchar_nokey VARCHAR(1),
gcol_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
PRIMARY KEY (pk),
UNIQUE KEY (col_int_key),
UNIQUE KEY (col_varchar_key),
UNIQUE KEY (col_date_key),
KEY (col_time_key),
KEY (col_datetime_key),
UNIQUE KEY (col_int_key, col_varchar_key),
KEY (col_int_key, col_int_nokey),
KEY(col_int_key,col_date_key),
KEY(col_int_key, col_time_key),
KEY(col_int_key, col_datetime_key),
UNIQUE
KEY(col_date_key,col_time_key,col_datetime_key),
UNIQUE KEY (col_varchar_key, col_varchar_nokey),
UNIQUE KEY (col_int_key, col_varchar_key,
col_date_key, col_time_key, col_datetime_key)
UNIQUE KEY (gcol_int_key),
UNIQUE KEY (gcol_varchar_key),
UNIQUE KEY (gcol_date_key),
KEY (gcol_time_key),
KEY (gcol_datetime_key),
UNIQUE KEY (gcol_int_key, gcol_varchar_key),
KEY (gcol_int_key, col_int_nokey),
KEY(gcol_int_key,gcol_date_key),
KEY(gcol_int_key, gcol_time_key),
KEY(gcol_int_key, gcol_datetime_key),
UNIQUE KEY(gcol_date_key,gcol_time_key,gcol_datetime_key),
UNIQUE KEY (gcol_varchar_key, col_varchar_nokey),
UNIQUE KEY (gcol_int_key, gcol_varchar_key, gcol_date_key, gcol_time_key, gcol_datetime_key)
) ENGINE=INNODB;
INSERT /*! IGNORE */ INTO c (
col_int_nokey,
col_date_nokey,
col_time_nokey,
col_datetime_nokey,
col_varchar_nokey
) VALUES (7, '2004-04-09', '14:03:03.042673',
'2001-11-28 00:50:27.051028', 'c'),(1, '2006-05-13', '01:46:09.016386',
'2007-10-09 19:53:04.008332', NULL);
INSERT IGNORE INTO c ( col_int_nokey, col_date_nokey, col_time_nokey, col_datetime_nokey, col_varchar_nokey)
VALUES (7, '2004-04-09', '14:03:03.042673', '2001-11-28 00:50:27.051028', 'c'),
(1, '2006-05-13', '01:46:09.016386', '2007-10-09 19:53:04.008332', NULL);
Warnings:
Warning 1048 Column 'col_varchar_key' cannot be null
Note 1265 Data truncated for column 'gcol_time_key' at row 1
Note 1265 Data truncated for column 'gcol_time_key' at row 2
CREATE TABLE bb (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER /*! NULL */,
col_int_key INTEGER GENERATED ALWAYS AS
(col_int_nokey + col_int_nokey) VIRTUAL not null,
col_date_nokey DATE /*! NULL */,
col_date_key DATE GENERATED ALWAYS AS
(DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL not null,
col_datetime_nokey DATETIME /*! NULL */,
col_time_nokey TIME /*! NULL */,
col_datetime_key DATETIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_time_key TIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_varchar_nokey VARCHAR(1) /*! NULL */,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS
(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL not null,
col_int_nokey INTEGER,
gcol_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_date_nokey DATE,
gcol_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL,
col_datetime_nokey DATETIME,
col_time_nokey TIME,
gcol_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
gcol_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_varchar_nokey VARCHAR(1),
gcol_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
PRIMARY KEY (pk),
UNIQUE KEY (col_int_key),
UNIQUE KEY (col_varchar_key),
UNIQUE KEY (col_date_key),
KEY (col_time_key),
KEY (col_datetime_key),
UNIQUE KEY (col_int_key, col_varchar_key),
KEY (col_int_key, col_int_nokey),
KEY(col_int_key,col_date_key),
KEY(col_int_key, col_time_key),
KEY(col_int_key, col_datetime_key),
UNIQUE
KEY(col_date_key,col_time_key,col_datetime_key),
UNIQUE KEY (col_varchar_key, col_varchar_nokey),
UNIQUE KEY (col_int_key, col_varchar_key,
col_date_key, col_time_key, col_datetime_key)
UNIQUE KEY (gcol_int_key),
UNIQUE KEY (gcol_varchar_key),
UNIQUE KEY (gcol_date_key),
KEY (gcol_time_key),
KEY (gcol_datetime_key),
UNIQUE KEY (gcol_int_key, gcol_varchar_key),
KEY (gcol_int_key, col_int_nokey),
KEY(gcol_int_key,gcol_date_key),
KEY(gcol_int_key, gcol_time_key),
KEY(gcol_int_key, gcol_datetime_key),
UNIQUE KEY(gcol_date_key,gcol_time_key,gcol_datetime_key),
UNIQUE KEY (gcol_varchar_key, col_varchar_nokey),
UNIQUE KEY (gcol_int_key, gcol_varchar_key, gcol_date_key, gcol_time_key, gcol_datetime_key)
) AUTO_INCREMENT=10 ENGINE=INNODB;
INSERT /*! IGNORE */ INTO bb (
col_int_nokey,
col_date_nokey,
col_time_nokey,
col_datetime_nokey,
col_varchar_nokey
) VALUES (0, '2003-08-04', '01:48:05.048577',
'2006-11-03 00:00:00', 'p'),(2, '2007-11-06', '00:00:00', '2009-11-26 19:28:11.005115', 'n');
INSERT IGNORE INTO bb ( col_int_nokey, col_date_nokey, col_time_nokey, col_datetime_nokey, col_varchar_nokey)
VALUES (0, '2003-08-04', '01:48:05.048577', '2006-11-03 00:00:00', 'p'),
(2, '2007-11-06', '00:00:00', '2009-11-26 19:28:11.005115', 'n');
Warnings:
Note 1265 Data truncated for column 'gcol_time_key' at row 1
Note 1265 Data truncated for column 'gcol_time_key' at row 2
CREATE TABLE cc (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER /*! NULL */,
col_int_key INTEGER GENERATED ALWAYS AS
(col_int_nokey + col_int_nokey) VIRTUAL not null,
col_date_nokey DATE /*! NULL */,
col_date_key DATE GENERATED ALWAYS AS
(DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL not null,
col_datetime_nokey DATETIME /*! NULL */,
col_time_nokey TIME /*! NULL */,
col_datetime_key DATETIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_time_key TIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_varchar_nokey VARCHAR(1) /*! NULL */,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS
(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL not null,
col_int_nokey INTEGER,
gcol_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_date_nokey DATE,
gcol_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL,
col_datetime_nokey DATETIME,
col_time_nokey TIME,
gcol_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
gcol_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_varchar_nokey VARCHAR(1),
gcol_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
PRIMARY KEY (pk),
UNIQUE KEY (col_int_key),
UNIQUE KEY (col_varchar_key),
UNIQUE KEY (col_date_key),
KEY (col_time_key),
KEY (col_datetime_key),
UNIQUE KEY (col_int_key, col_varchar_key),
KEY (col_int_key, col_int_nokey),
KEY(col_int_key,col_date_key),
KEY(col_int_key, col_time_key),
KEY(col_int_key, col_datetime_key),
UNIQUE
KEY(col_date_key,col_time_key,col_datetime_key),
UNIQUE KEY (col_varchar_key, col_varchar_nokey),
UNIQUE KEY (col_int_key, col_varchar_key,
col_date_key, col_time_key, col_datetime_key)
UNIQUE KEY (gcol_int_key),
UNIQUE KEY (gcol_varchar_key),
UNIQUE KEY (gcol_date_key),
KEY (gcol_time_key),
KEY (gcol_datetime_key),
UNIQUE KEY (gcol_int_key, gcol_varchar_key),
KEY (gcol_int_key, col_int_nokey),
KEY(gcol_int_key,gcol_date_key),
KEY(gcol_int_key, gcol_time_key),
KEY(gcol_int_key, gcol_datetime_key),
UNIQUE KEY(gcol_date_key,gcol_time_key,gcol_datetime_key),
UNIQUE KEY (gcol_varchar_key, col_varchar_nokey),
UNIQUE KEY (gcol_int_key, gcol_varchar_key, gcol_date_key, gcol_time_key, gcol_datetime_key)
) AUTO_INCREMENT=10 ENGINE=INNODB;
INSERT /*! IGNORE */ INTO cc (
col_int_nokey,
col_date_nokey,
col_time_nokey,
col_datetime_nokey,
col_varchar_nokey
) VALUES (172, '2009-04-23', '00:00:00', '2000-12-07 10:17:40.013275', 'h'),(NULL, '2002-10-06', '00:50:49.017545', NULL, 'm');
INSERT IGNORE INTO cc (col_int_nokey, col_date_nokey, col_time_nokey, col_datetime_nokey, col_varchar_nokey)
VALUES (172, '2009-04-23', '00:00:00', '2000-12-07 10:17:40.013275', 'h'),
(NULL, '2002-10-06', '00:50:49.017545', NULL, 'm');
Warnings:
Warning 1048 Column 'col_int_key' cannot be null
Warning 1048 Column 'col_datetime_key' cannot be null
Warning 1048 Column 'col_time_key' cannot be null
Note 1265 Data truncated for column 'gcol_time_key' at row 1
EXPLAIN SELECT
gp1 . col_datetime_key AS g1
FROM cc AS gp1 LEFT JOIN c AS gp2 ON ( gp2 . col_datetime_key <> gp1 .
gp1 . gcol_datetime_key AS g1
FROM cc AS gp1 LEFT JOIN c AS gp2 ON ( gp2 . gcol_datetime_key <> gp1 .
col_time_nokey )
WHERE
gp1 . col_varchar_nokey IN
(
SELECT
DISTINCT p1 . col_varchar_key AS p1
DISTINCT p1 . gcol_varchar_key AS p1
FROM bb AS p1 LEFT JOIN bb AS p2
ON ( p1 . col_int_key = p2 . pk )
ON ( p1 . gcol_int_key = p2 . pk )
)
AND gp1 . col_varchar_nokey = 'b'
HAVING g1 > 6;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE gp1 NULL ALL NULL NULL NULL NULL 2 50.00 Using where
1 SIMPLE p1 NULL const col_varchar_key,col_varchar_key_2 col_varchar_key 4 const 1 100.00 NULL
1 SIMPLE p2 NULL eq_ref PRIMARY PRIMARY 4 test.p1.col_int_key 1 100.00 Using index; FirstMatch(gp1)
1 SIMPLE gp2 NULL index NULL col_datetime_key 5 NULL 2 100.00 Using where; Using index; Using join buffer (Block Nested Loop)
Warnings:
Warning 1292 Incorrect datetime value: '6' for column 'col_datetime_key' at row 1
Note 1003 /* select#1 */ select `test`.`gp1`.`col_datetime_key` AS `g1` from `test`.`cc` `gp1` semi join (`test`.`bb` `p1` left join `test`.`bb` `p2` on((`test`.`p1`.`col_int_key` = `test`.`p2`.`pk`))) left join `test`.`c` `gp2` on((`test`.`gp2`.`col_datetime_key` <> `test`.`gp1`.`col_time_nokey`)) where ((`test`.`gp1`.`col_varchar_nokey` = 'b') and ('b' = `test`.`p1`.`col_varchar_key`)) having (`g1` > 6)
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
SELECT
gp1 . col_datetime_key AS g1
FROM cc AS gp1 LEFT JOIN c AS gp2 ON ( gp2 . col_datetime_key <> gp1 .
gp1 . gcol_datetime_key AS g1
FROM cc AS gp1 LEFT JOIN c AS gp2 ON ( gp2 . gcol_datetime_key <> gp1 .
col_time_nokey )
WHERE
gp1 . col_varchar_nokey IN
(
SELECT
DISTINCT p1 . col_varchar_key AS p1
DISTINCT p1 . gcol_varchar_key AS p1
FROM bb AS p1 LEFT JOIN bb AS p2
ON ( p1 . col_int_key = p2 . pk )
ON ( p1 . gcol_int_key = p2 . pk )
)
AND gp1 . col_varchar_nokey = 'b'
HAVING g1 > 6;
g1
Warnings:
Warning 1292 Incorrect datetime value: '6' for column 'col_datetime_key' at row 1
DROP TABLE bb, c, cc;
# Bug#21284646: Assertion !(table || table->read_set || bitmap_is_set())
CREATE TABLE c (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER NOT NULL,
col_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL not null,
col_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_date_nokey DATE NOT NULL,
col_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL not null,
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)) VIRTUAL not null,
col_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_varchar_nokey VARCHAR(1) NOT NULL,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL not null,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
PRIMARY KEY (pk,col_int_nokey),
UNIQUE KEY (col_int_key),
UNIQUE KEY (col_varchar_key),
@@ -264,6 +222,13 @@ INSERT INTO c (col_int_nokey, col_date_nokey, col_time_nokey, col_datetime_nokey
(6, '2006-05-25', '19:47:59.011283', '2001-02-15 03:08:38.035426', 'y'),
(2, '2002-10-13', '00:00:00', '1900-01-01 00:00:00', 's'),
(4, '1900-01-01', '15:57:25.019666', '2005-08-15 00:00:00', 'r');
Warnings:
Note 1265 Data truncated for column 'col_time_key' at row 1
Note 1265 Data truncated for column 'col_time_key' at row 2
Note 1265 Data truncated for column 'col_time_key' at row 3
Note 1265 Data truncated for column 'col_time_key' at row 4
Note 1265 Data truncated for column 'col_time_key' at row 5
Note 1265 Data truncated for column 'col_time_key' at row 6
ANALYZE TABLE c;
Table Op Msg_type Msg_text
test.c analyze status OK
@@ -274,10 +239,8 @@ col_int_nokey <> 9 AND
pk >= 8
HAVING x > '2000-02-06'
ORDER BY col_time_nokey, pk;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE c NULL index_merge PRIMARY,col_varchar_key,col_int_key_2,col_varchar_key_2,col_int_key_7 col_varchar_key,PRIMARY 4,4 NULL 2 100.00 Using sort_union(col_varchar_key,PRIMARY); Using where
Warnings:
Note 1003 /* select#1 */ select count(distinct `test`.`c`.`col_varchar_key`) AS `x` from `test`.`c` where ((`test`.`c`.`col_varchar_key` in ('rr','rr')) or ((`test`.`c`.`col_int_nokey` <> 9) and (`test`.`c`.`pk` >= 8))) having (`x` > '2000-02-06')
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE c ALL PRIMARY,col_varchar_key,col_varchar_key_2 NULL NULL NULL 6 Using where
SELECT COUNT(DISTINCT col_varchar_key) AS x
FROM c
WHERE col_varchar_key IN ('rr', 'rr') OR
@@ -292,15 +255,15 @@ DROP TABLE c;
# Bug#21341044: Conditional jump at sort_param::make_sort_key
CREATE TABLE t1 (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER /*! NULL */,
col_int_nokey INTEGER,
col_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_blob_nokey BLOB /*! NULL */,
col_blob_nokey BLOB,
col_blob_key BLOB GENERATED ALWAYS AS (REPEAT(col_blob_nokey,15)) VIRTUAL,
col_longblob_nokey LONGBLOB /*! NULL */,
col_longtext_nokey LONGTEXT /*! NULL */,
col_longblob_nokey LONGBLOB,
col_longtext_nokey LONGTEXT,
col_longblob_key LONGBLOB GENERATED ALWAYS AS (REPEAT(col_longblob_nokey, 20)) VIRTUAL,
col_longtext_key LONGTEXT GENERATED ALWAYS AS (REPEAT(col_longblob_nokey, 18)) VIRTUAL,
col_text_nokey TEXT /*! NULL */,
col_text_nokey TEXT,
col_text_key TEXT GENERATED ALWAYS AS (REPEAT(col_text_nokey, 30)) VIRTUAL,
PRIMARY KEY (pk),
KEY (col_int_key),
@@ -350,7 +313,7 @@ CREATE TABLE t(a int);
ALTER TABLE t ADD COLUMN b int GENERATED ALWAYS AS (
date_sub(a,interval a month)) VIRTUAL;
ALTER TABLE t ADD COLUMN c int GENERATED ALWAYS AS (sum(a));
ERROR HY000: Invalid use of group function
ERROR HY000: Function or expression 'sum()' cannot be used in the GENERATED ALWAYS AS clause of `c`
DROP TABLE t;
#
# Bug#21628840: CRASH/MEMORY CORRUPTION ADDING INDEXES TO VIRTUAL COLUMN
@@ -368,10 +331,8 @@ test.t1 analyze status OK
# Make sure the index is correct. That's kinda important.
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 5 NULL 5 100.00 Using index
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`c` AS `c` from `test`.`t1`
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL c 5 NULL 5 Using index
SELECT c FROM t1;
c
1
@@ -408,20 +369,16 @@ b CHAR(2) GENERATED ALWAYS AS (a IN (1)) VIRTUAL,
KEY(c,b(1)));
INSERT INTO v (a,c) VALUES (1,1);
EXPLAIN SELECT 1 FROM t WHERE ( SELECT 1 FROM t ) >=ANY( SELECT c FROM v );
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
2 SUBQUERY t NULL ALL NULL NULL NULL NULL 1 100.00 NULL
Warnings:
Note 1003 /* select#1 */ select 1 AS `1` from `test`.`t` where 0
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table
SELECT 1 FROM t WHERE ( SELECT 1 FROM t ) >=ANY( SELECT c FROM v );
1
EXPLAIN SELECT (SELECT MAX(c) FROM v);
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
Warnings:
Note 1003 /* select#1 */ select (/* select#2 */ select max(`test`.`v`.`c`) from `test`.`v`) AS `(SELECT MAX(c) FROM v)`
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No tables used
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
SELECT (SELECT MAX(c) FROM v);
(SELECT MAX(c) FROM v)
1
@@ -479,13 +436,18 @@ PRIMARY KEY(c1),
UNIQUE KEY(c13)
);
INSERT INTO C (c8,c9) VALUES('1970-01-01',0),('1970-01-01',1);
Warnings:
Note 1265 Data truncated for column 'c11' at row 1
Note 1265 Data truncated for column 'c13' at row 1
Note 1265 Data truncated for column 'c11' at row 2
Note 1265 Data truncated for column 'c13' at row 2
CREATE VIEW view_C AS SELECT * FROM C;
SELECT /*+ NO_BNL(t1) */ t1.c13 FROM C AS t2 STRAIGHT_JOIN C AS t1 FORCE INDEX(c13);
c13
00:00:00
00:00:01
00:00:00
00:00:01
00:00:01
SELECT DISTINCT t1.c13 FROM C AS t1, view_C AS t2;
c13
00:00:00
@@ -493,17 +455,6 @@ c13
DROP TABLE C;
DROP VIEW view_C;
#
# Bug #21808680: JSON + GENERATED COLUMN CORRUPTS TABLE CACHE
# MEMORY, CRASHES
#
CREATE TABLE t (a INT, b JSON, c TEXT GENERATED ALWAYS AS (REPEAT(a=b, 2)));
INSERT INTO t (a, b) VALUES (1, '2'), (3, '3');
SELECT * FROM t;
a b c
1 2 00
3 3 11
DROP TABLE t;
#
# Bug#21810529: CRASH IN ITEM_FUNC::WALK WHEN CODE JUMPS TO GARBAGE
# LOCATION
#
@@ -522,10 +473,10 @@ DROP TABLE t;
#
CREATE TABLE t(b BLOB);
ALTER TABLE t ADD COLUMN c INT GENERATED ALWAYS AS ((1,1)) VIRTUAL;
ERROR HY000: Expression of generated column 'c' contains a disallowed function.
ERROR 21000: Operand should contain 1 column(s)
DROP TABLE t;
CREATE TABLE t(b BLOB, c INT GENERATED ALWAYS AS ((1,1)) VIRTUAL);
ERROR HY000: Expression of generated column 'c' contains a disallowed function.
ERROR 21000: Operand should contain 1 column(s)
#
# Bug#21929967 GCOLS: GCOL VALUE CHANGES WHEN SESSION CHANGES SQL_MODE
#
@@ -536,14 +487,12 @@ t1 CREATE TABLE `t1` (
`a` char(1) DEFAULT NULL,
`b` char(1) DEFAULT NULL,
`c` char(2) GENERATED ALWAYS AS ((`a` or `b`)) VIRTUAL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
) ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO t1 (a,b) VALUES('1','1');
SELECT * FROM t1;
a b c
1 1 1
SET SQL_MODE=PIPES_AS_CONCAT;
Warnings:
Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
SELECT * FROM t1;
a b c
1 1 1
@@ -559,7 +508,7 @@ t1 CREATE TABLE `t1` (
`a` char(1) DEFAULT NULL,
`b` char(1) DEFAULT NULL,
`c` char(2) GENERATED ALWAYS AS (concat(`a`,`b`)) VIRTUAL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
) ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO t1 (a,b) VALUES('1','1');
SELECT * FROM t1;
a b c
@@ -576,17 +525,18 @@ DROP TABLE t1;
# Bug#22018999: gcols: assertion failed: !error
SET @save_old_sql_mode= @@sql_mode;
SET sql_mode="";
Warnings:
Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
CREATE TABLE t (a INTEGER AS (SUBSTR('','a',1))) engine=innodb;
ERROR 22007: Truncated incorrect INTEGER value: 'a'
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'a'
DROP TABLE t;
CREATE TABLE t (a INTEGER) engine=innodb;
ALTER TABLE t ADD b INTEGER AS (SUBSTR('','a',1));
ERROR 22007: Truncated incorrect INTEGER value: 'a'
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'a'
Warning 1292 Truncated incorrect INTEGER value: 'a'
Warning 1292 Truncated incorrect INTEGER value: 'a'
DROP TABLE t;
set sql_mode= @save_old_sql_mode;
Warnings:
Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
# Bug#21875520 Problems with virtual column indexes
CREATE TABLE t(
a TIMESTAMP,

View File

@@ -22,11 +22,11 @@ drop table t1;
create table t1 (a int);
insert into t1 values(1);
alter table t1 add column (b int generated always as (a+1) virtual, c int);
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
alter table t1 add column (d int, e int generated always as (a+1) virtual);
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
alter table t1 add column (f int generated always as (a+1) virtual, g int as(5) stored);
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
@@ -49,13 +49,21 @@ alter table t1 add column b int generated always as (a+1) virtual AUTO_INCREMENT
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AUTO_INCREMENT' at line 1
drop table t1;
# [PRIMARY] KEY
create table t1 (a int, b int generated always as (a+1) virtual key);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key)' at line 1
create table t1 (a int, b int generated always as (a+1) stored key);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key)' at line 1
create table t1 (a int, b int generated always as (a+1) virtual primary key);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'primary key)' at line 1
create table t1 (a int, b int generated always as (a+1) stored primary key);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'primary key)' at line 1
create table t1 (a int);
alter table t1 add column b int generated always as (a+1) virtual key;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key' at line 1
alter table t1 add column b int generated always as (a+1) stored key;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key' at line 1
alter table t1 add column c int generated always as (a+2) virtual primary key;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'primary key' at line 1
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -265,14 +273,6 @@ a b c
1 -1 0
2 -2 -1
drop table t1,tt;
# Bug#20769299: INCORRECT KEY ERROR WHEN TRYING TO CREATE INDEX ON
# VIRTUAL GC FOR MYISAM
CREATE TABLE A (
pk INTEGER,
col_int_nokey INTEGER,
col_int_key INTEGER GENERATED ALWAYS AS (pk + col_int_nokey) VIRTUAL, KEY
(col_int_key));
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
# Bug#20745142: GENERATED COLUMNS: ASSERTION FAILED:
# THD->CHANGE_LIST.IS_EMPTY()
#
@@ -369,6 +369,36 @@ SELECT * FROM t1;
c2 c1 5
2 1 5
DROP TABLE t1, t2;
# Bug#21074624:i WL8149:SIG 11 INNOBASE_GET_COMPUTED_VALUE |
# INNOBASE/HANDLER/HA_INNODB.CC:19082
CREATE TABLE t1 (
col1 int(11) NOT NULL,
col2 int(11) DEFAULT NULL,
col3 int(11) NOT NULL,
col4 int(11) DEFAULT NULL,
col5 int(11) GENERATED ALWAYS AS (col2 % col4) VIRTUAL,
col6 int(11) GENERATED ALWAYS AS (col3 + col3) VIRTUAL,
col7 int(11) GENERATED ALWAYS AS (col5 / col5) VIRTUAL,
col8 int(11) GENERATED ALWAYS AS (col6 / col5) VIRTUAL,
col9 text,
extra int(11) DEFAULT NULL,
KEY idx (col5)
);
INSERT INTO t1(col1,col2,col3,col4,col9,extra)
VALUES(0,6,3,4,REPEAT(4,1000),0);
ALTER TABLE t1 DROP COLUMN col1;
DROP TABLE t1;
# Bug#21390605:VALGRIND ERROR ON DELETE FROM TABLE CONTAINING
# AN INDEXED VIRTUAL COLUMN
CREATE TABLE t1 (
a INTEGER,
b INTEGER GENERATED ALWAYS AS (a) VIRTUAL,
c INTEGER GENERATED ALWAYS AS (b) VIRTUAL,
INDEX idx (b,c)
);
INSERT INTO t1 (a) VALUES (42);
DELETE FROM t1 WHERE c = 42;
DROP TABLE t1;
# Bug#20757211: GENERATED COLUMNS: ALTER TABLE CRASHES
# IN FIND_FIELD_IN_TABLE
#
@@ -426,11 +456,11 @@ INSERT INTO t(a,b) VALUES(1,2);
# Mixed drop/add/rename virtual with non-virtual columns,
# ALGORITHM=INPLACE is not supported for InnoDB
ALTER TABLE t DROP d, ADD e varchar(10);
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t ADD d int, ADD f char(10) AS ('aaa');
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t CHANGE d dd int, CHANGE f ff varchar(10) AS ('bbb');
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
@@ -446,11 +476,11 @@ affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
# Change order should be ALGORITHM=INPLACE on Innodb
ALTER TABLE t CHANGE c c int(11) as (a) after f;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t CHANGE b b int(11) after c;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
# TODO: Changing virtual column type should be ALGORITHM=INPLACE on InnoDB, current it goes only with COPY method
ALTER TABLE t CHANGE c c varchar(10) as ('a');
affected rows: 1
@@ -459,6 +489,12 @@ info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t CHANGE dd d varchar(10);
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t ADD INDEX idx(c), ADD INDEX idx1(d);
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE t DROP INDEX idx, DROP INDEX idx1;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
DROP TABLE t;
# Bug#21854004: GCOLS:INNODB: FAILING ASSERTION: I < TABLE->N_DEF
CREATE TABLE t1(
@@ -487,19 +523,34 @@ col1 col2 col3 col4 vgc1 sgc1
2 20 200 NULL 4000 0
ALTER TABLE t1 MODIFY COLUMN vgc1 INTEGER AS (col2 + col3) VIRTUAL;
ALTER TABLE t1 MODIFY COLUMN sgc1 INTEGER AS (col2 - col3) STORED;
ALTER TABLE t1 ADD INDEX vgc1 (vgc1);
ALTER TABLE t1 ADD INDEX sgc1 (sgc1);
ALTER TABLE t1 MODIFY COLUMN vgc1 INTEGER AS (col2 * col3) VIRTUAL;
SELECT * FROM t1 order by col1;
col1 col2 col3 col4 vgc1 sgc1
1 10 100 NULL 1000 -90
2 20 200 NULL 4000 -180
SELECT vgc1 FROM t1 order by vgc1;
vgc1
1000
4000
ALTER TABLE t1 MODIFY COLUMN sgc1 INTEGER AS (col2 / col3) STORED;
SELECT * FROM t1 order by col1;
col1 col2 col3 col4 vgc1 sgc1
1 10 100 NULL 110 0
2 20 200 NULL 220 0
1 10 100 NULL 1000 0
2 20 200 NULL 4000 0
SELECT sgc1 FROM t1 order by sgc1;
sgc1
0
0
ALTER TABLE t1 DROP INDEX vgc1;
ALTER TABLE t1 DROP INDEX sgc1;
ALTER TABLE t1 MODIFY COLUMN vgc1 INTEGER AS (col2 + col3) VIRTUAL;
ALTER TABLE t1 ADD UNIQUE INDEX vgc1 (vgc1);
ALTER TABLE t1 MODIFY COLUMN sgc1 INTEGER AS (col2 - col3) STORED;
ALTER TABLE t1 ADD UNIQUE INDEX sgc1 (sgc1);
ALTER TABLE t1 MODIFY COLUMN vgc1 INTEGER AS (col2 / col3) VIRTUAL;
ERROR 23000: Duplicate entry '0' for key 'vgc1'
ALTER TABLE t1 MODIFY COLUMN sgc1 INTEGER AS (col2 / col3) STORED;
ERROR 23000: Duplicate entry '0' for key 'sgc1'
ALTER TABLE t1 MODIFY COLUMN vgc1 INTEGER AS (col2 * col3) VIRTUAL;
@@ -536,9 +587,72 @@ col1 col2 col3 col4 vgc1 sgc1
2 20 200 222 4000 4000
DROP TABLE t1;
#
# bug#22018979: RECORD NOT FOUND ON UPDATE,
# VIRTUAL COLUMN, ASSERTION 0
SET @sql_mode_save= @@sql_mode;
SET sql_mode= 'ANSI';
CREATE TABLE t1 (
a INT,
b VARCHAR(10),
c CHAR(3) GENERATED ALWAYS AS (substr(b,1,3)) VIRTUAL,
PRIMARY KEY (a),
KEY c(c)
);
INSERT INTO t1(a, b) values(1, 'bbbb'), (2, 'cc');
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE "t1" (
"a" int(11) NOT NULL,
"b" varchar(10) DEFAULT NULL,
"c" char(3) AS (substr(b,1,3)) VIRTUAL,
PRIMARY KEY ("a"),
KEY "c" ("c")
)
SELECT * FROM t1 order by a;
a b c
1 bbbb bbb
2 cc cc
SET sql_mode= '';
FLUSH TABLE t1;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` varchar(10) DEFAULT NULL,
`c` char(3) AS (substr(b,1,3)) VIRTUAL,
PRIMARY KEY (`a`),
KEY `c` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SELECT * FROM t1 order by a;
a b c
1 bbbb bbb
2 cc cc
DELETE FROM t1 where a= 2;
SET sql_mode= @sql_mode_save;
DROP TABLE t1;
#
# Bug#22680839: DEFAULT IS NOT DETERMINISTIC AND SHOULD NOT BE
# ALLOWED IN GENERATED COLUMNS
#
CREATE TABLE tzz(a INT DEFAULT 5,
gc1 INT AS (a+DEFAULT(a)) VIRTUAL,
gc2 INT AS (a+DEFAULT(a)) STORED,
KEY k1(gc1));
INSERT INTO tzz(A) VALUES (1);
SELECT * FROM tzz;
a gc1 gc2
1 6 6
SELECT gc1 FROM tzz;
gc1
6
ALTER TABLE tzz MODIFY COLUMN a INT DEFAULT 6;
SELECT * FROM tzz;
a gc1 gc2
1 7 7
SELECT gc1 FROM tzz;
gc1
7
DROP TABLE tzz;
# Test 1: ALTER DEFAULT
#
CREATE TABLE t1(a INT PRIMARY KEY DEFAULT 5,
@@ -546,11 +660,11 @@ b INT AS (1 + DEFAULT(a)) STORED,
c INT AS (1 + DEFAULT(a)) VIRTUAL);
INSERT INTO t1 VALUES ();
ALTER TABLE t1 ALTER COLUMN a SET DEFAULT 7;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t1 MODIFY COLUMN a INT DEFAULT 8;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t1 CHANGE COLUMN a a DOUBLE DEFAULT 5;
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
@@ -565,8 +679,8 @@ affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t1 ALTER COLUMN a SET DEFAULT 7,
ADD COLUMN c1 INT AS (1 + DEFAULT(a)) VIRTUAL;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t1 ALTER COLUMN a SET DEFAULT 7,
ADD COLUMN b INT AS (1 + DEFAULT(a)) STORED,
ADD COLUMN c INT AS (1 + DEFAULT(a)) VIRTUAL;

View File

@@ -550,6 +550,10 @@ b TIMESTAMP(4) GENERATED ALWAYS AS ('') VIRTUAL,
KEY (a(183),b)
);
INSERT INTO t VALUES(), (), ();
Warnings:
Warning 1265 Data truncated for column 'b' at row 1
Warning 1265 Data truncated for column 'b' at row 2
Warning 1265 Data truncated for column 'b' at row 3
DELETE IGNORE FROM t;
DROP TABLE t;
#

View File

@@ -18,7 +18,6 @@ a b
9 9
BEGIN;
INSERT INTO t (a) VALUES (10);
# Kill and restart
SELECT * FROM t;
a b
9 9
@@ -32,8 +31,11 @@ INSERT INTO t (a,c) VALUES (9, 10);
SELECT * FROM t;
a b c
9 9 10
connect con1,localhost,root,,;
connection con1;
SET DEBUG_SYNC = 'row_log_apply_after SIGNAL created WAIT_FOR dml_done';
ALTER TABLE t ADD KEY(b(57)), ALGORITHM=INPLACE;
connection default;
SET DEBUG_SYNC = 'now WAIT_FOR created';
BEGIN;
INSERT INTO t (a,c) VALUES (10, 12);
@@ -43,6 +45,9 @@ a b c
10 10 12
ROLLBACK;
SET DEBUG_SYNC = 'now SIGNAL dml_done';
connection con1;
disconnect con1;
connection default;
SELECT * FROM t;
a b c
9 9 10
@@ -58,8 +63,11 @@ INSERT INTO t (a,b) VALUES (9, 10);
SELECT * FROM t;
a b c d
9 10 19 29
connect con1,localhost,root,,;
connection con1;
SET DEBUG_SYNC = 'row_log_apply_after SIGNAL created WAIT_FOR dml_done';
ALTER TABLE t DROP COLUMN c, ALGORITHM=INPLACE;
connection default;
SET DEBUG_SYNC = 'now WAIT_FOR created';
BEGIN;
INSERT INTO t (a,b) VALUES (10, 12);
@@ -69,7 +77,11 @@ a b c d
10 12 22 34
ROLLBACK;
SET DEBUG_SYNC = 'now SIGNAL dml_done';
connection con1;
disconnect con1;
connection default;
SELECT * FROM t;
a b d
9 10 29
DROP TABLE t;
SET DEBUG_SYNC = 'RESET';

View File

@@ -563,6 +563,8 @@ id select_type table type possible_keys key key_len ref rows Extra
SELECT /*+ bka() */ 1 AS c FROM t AS b RIGHT JOIN t AS c ON b.a > c.c
WHERE b.b>c.a;
c
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'cccc'
DROP TABLE t;
set @optimizer_switch_save = @@optimizer_switch;
set optimizer_switch='mrr_cost_based=off';

View File

@@ -0,0 +1,26 @@
#
# Bug#22444530 - GCOLS + PARTITIONED TABLE, CRASH IN
#
set sql_mode='';
create table t (
a int not null,
b int generated always as (1) virtual,
c int generated always as (1) virtual,
key (c)
) engine=innodb partition by key (a) partitions 2;
insert into t(a) values(1);
select b from t group by c;
b
1
drop table t;
create table t (
a int not null,
b blob generated always as ("a") virtual,
c int generated always as (1) virtual,
key (c)
) engine=innodb partition by key (a) partitions 2;
insert into t(a) values(1);
select b from t group by c;
b
a
drop table t;

View File

@@ -0,0 +1,15 @@
#Bug #22445211 GCOLS: SIMPLE DML, FAILING ASSERTION:
#!CURSOR->INDEX->IS_COMMITTED()
#Create and alter table examples for virtual column for full
#column index followed by prefix index.
CREATE TABLE t1(
f1 INT DEFAULT NULL,
f2 CHAR(2) GENERATED ALWAYS AS ('11') VIRTUAL,
f3 INT,
UNIQUE KEY(f1),
UNIQUE KEY(f3,f1),
KEY(f2,f1),
key(f1,f2(1))
)ENGINE=INNODB;
REPLACE INTO t1(f3) VALUES (1),(1);
DROP TABLE t1;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
#
# Bug#22046353 ALTER: ASSERT PAGE_SIZE.EQUALS_TO(SPACE_PAGE_SIZE),
# BTR_COPY_BLOB_PREFIX
#
CREATE TABLE t1
( f1 int primary key, f2 blob,
f3 blob generated always as (f2))
row_format=compressed, engine=innodb;
insert into t1 (f1, f2) values (1, repeat('&', 50000));
alter table t1 add index i1 (f3(200)) ;
alter table t1 row_format=compact;
drop table t1;

View File

@@ -0,0 +1,227 @@
set default_storage_engine=innodb;
CREATE TABLE `t` (
`a` VARCHAR(100),
`b` VARCHAR(100),
`c` VARCHAR(200) GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
`h` VARCHAR(10) DEFAULT NULL,
`i` int
) ENGINE=InnoDB;
INSERT INTO t VALUES (REPEAT('g', 100), REPEAT('x', 10), DEFAULT, "kk", 1);
INSERT INTO t VALUES (REPEAT('a', 100), REPEAT('b', 100), DEFAULT, "mm", 2);
CREATE INDEX idx ON t(c(100));
SET session debug_dbug="+d,ib_alter_add_virtual_fail";
ALTER TABLE t ADD COLUMN x VARCHAR(200) GENERATED ALWAYS AS (a) VIRTUAL,
ALGORITHM = INPLACE;
ERROR 42000: The storage engine InnoDB can't index column `x`
ALTER TABLE t DROP COLUMN c, ALGORITHM = INPLACE;
ERROR 42000: The storage engine InnoDB can't index column `c`
SET session debug_dbug="";
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, "mx");
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
CREATE INDEX idx ON t(c);
connect con1,localhost,root,,;
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
update t set a=0 where a = 11;
start transaction;
update t set a=1 where a = 0;
ROLLBACK;
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
SELECT c FROM t;
c
NULL
3
19
29
SHOW CREATE TABLE t;
Table Create Table
t CREATE TABLE `t` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) AS ((`a` + `b`)) VIRTUAL,
`h` varchar(10) DEFAULT NULL,
KEY `idx` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SELECT * FROM t;
a b c h
0 3 3 mm
18 1 19 mm
28 1 29 mm
NULL NULL NULL mx
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
ALTER TABLE t ADD COLUMN x INT;
connection con1;
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
start transaction;
update t set a=1 where a = 0;
rollback;
start transaction;
delete from t;
insert into t values(1,null,default,null);
rollback;
start transaction;
update t set b=b+1;
rollback;
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
check table t;
Table Op Msg_type Msg_text
test.t check status OK
SELECT c FROM t;
c
NULL
3
19
29
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
ALTER TABLE t ADD COLUMN x2 INT;
connection con1;
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
start transaction;
DELETE FROM t WHERE a = 0;
ROLLBACK;
DELETE FROM t WHERE a = 0;
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
SELECT c FROM t;
c
NULL
19
29
disconnect con1;
DROP TABLE t;
SET DEBUG_SYNC = 'RESET';
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_1 on t(c);
SET SESSION debug_dbug="+d,create_index_fail";
ALTER TABLE t ADD COLUMN x INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (x);
ERROR 23000: Duplicate entry '' for key '*UNKNOWN*'
SET SESSION debug_dbug="";
affected rows: 0
SHOW CREATE TABLE t;
Table Create Table
t CREATE TABLE `t` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) AS ((`a` + `b`)) VIRTUAL,
`h` varchar(10) DEFAULT NULL,
KEY `idx_1` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SELECT c FROM t;
c
NULL
14
19
29
DROP TABLE t;
#
# Bug#22018532 ASSERTION WHEN ONLINE REAPPLY REBUILD LOG ON
# MULTIPLE INDEXED VIRTUAL COLUMNS
#
create table t (
a int as (1) virtual,
b int,
c int as (1) virtual,
unique(b),
unique(c),
key(a)
) engine=innodb;
insert ignore into t values();
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
optimize table t;
connect con1,localhost,root,,;
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
insert ignore into t values();
Warnings:
Warning 1062 Duplicate entry '1' for key 'c'
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
/* connection default */ optimize table t;
Table Op Msg_type Msg_text
test.t optimize note Table does not support optimize, doing recreate + analyze instead
test.t optimize error Duplicate entry '1' for key 'a'
test.t optimize status Operation failed
Warnings:
Error 1062 Duplicate entry '1' for key 'a'
SELECT c FROM t;
c
1
SHOW CREATE TABLE t;
Table Create Table
t CREATE TABLE `t` (
`a` int(11) AS (1) VIRTUAL,
`b` int(11) DEFAULT NULL,
`c` int(11) AS (1) VIRTUAL,
UNIQUE KEY `b` (`b`),
UNIQUE KEY `c` (`c`),
KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SELECT * FROM t;
a b c
1 NULL 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');
CREATE INDEX idx ON t(c);
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_rebuild WAIT_FOR go_ahead';
optimize table t;
connection con1;
SET DEBUG_SYNC = 'now WAIT_FOR start_rebuild';
INSERT INTO t VALUES (48, 2, DEFAULT, 'xx');
INSERT INTO t VALUES (68, 3, DEFAULT, 'sx');
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
/* connection default */ optimize table t;
Table Op Msg_type Msg_text
test.t optimize note Table does not support optimize, doing recreate + analyze instead
test.t optimize status OK
SELECT c FROM t;
c
NULL
14
19
29
50
71
disconnect con1;
DROP TABLE t;
#
# Bug#22951879 - ASSERTS RELATED TO ONLINE DDL AND GCOL
#
create table ibstd_14 (a int not null, d int not null, b varchar(198) not null, c char(181), vadcol int as (a+length(d)) stored, vbcol char(2) as (substr(b,2,2)) virtual, vbidxcol char(3) as (substr(b,1,3)) virtual , index(d), index(a), index(vbidxcol), index(a,vbidxcol), index(vbidxcol,d), unique key (b(10), a, d), index(c(99), b(31)), index(b(5), c(10), a) , index(a,d)) engine=InnoDB stats_persistent=1 row_format=dynamic;
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
alter table ibstd_14 row_format=compressed key_block_size=4,add key kn3 (d,c,vbcol,b);
connect con1,localhost,root;
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
insert into ibstd_14 (a,d,b,c, vbidxcol, vbcol) values ('118','6',repeat('oacolaarlruoacuroauurloraarucoooarcooauoolacalllaulrruarrrucruuooclacuoouccarrcoocloccorrrrarourcooalloocooccouruolaorlcaocualolc','1'),repeat('lolrrlalcocroraaulauclaaucolcorcuooaolruaooooluooooouaoorlarucorullalcrrloccououaooaorluorraclrcooouuolocoaolcocaaculruoocucoocoooauuolarcoraraocaoolulolarru','1'),default,default);
insert into ibstd_14 (a,d,b,c, vbidxcol, vbcol) values ('118','6', 'aaaa', 'lll', default, default);
update ibstd_14 set b='11111' where b='aaaa';
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
select * from ibstd_14;
a d b c vadcol vbcol vbidxcol
118 6 oacolaarlruoacuroauurloraarucoooarcooauoolacalllaulrruarrrucruuooclacuoouccarrcoocloccorrrrarourcooalloocooccouruolaorlcaocualolc lolrrlalcocroraaulauclaaucolcorcuooaolruaooooluooooouaoorlarucorullalcrrloccououaooaorluorraclrcooouuolocoaolcocaaculruoocucoocoooauuolarcoraraocaoolulolarru 119 ac oac
118 6 11111 lll 119 11 111
select d,c,vbcol,b from ibstd_14;
d c vbcol b
6 lll 11 11111
6 lolrrlalcocroraaulauclaaucolcorcuooaolruaooooluooooouaoorlarucorullalcrrloccououaooaorluorraclrcooouuolocoaolcocaaculruoocucoocoooauuolarcoraraocaoolulolarru ac oacolaarlruoacuroauurloraarucoooarcooauoolacalllaulrruarrrucruuooclacuoouccarrcoocloccorrrrarourcooalloocooccouruolaorlcaocualolc
select vbcol from ibstd_14;
vbcol
11
ac
drop table ibstd_14;
disconnect con1;
SET DEBUG_SYNC = 'RESET';

View File

@@ -0,0 +1,141 @@
set default_storage_engine=innodb;
set @old_dbug=@@global.debug_dbug;
CREATE TABLE `t` (
`a` BLOB,
`b` BLOB,
`c` BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
`h` VARCHAR(10) DEFAULT NULL,
`i` int
) ENGINE=InnoDB;
INSERT INTO t VALUES (REPEAT('g', 16000), REPEAT('x', 16000), DEFAULT, "kk", 1);
INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, "mm", 2);
CREATE INDEX idx ON t(c(100));
SET global debug_dbug="+d,ib_purge_virtual_index_callback";
UPDATE t SET a = REPEAT('m', 16000) WHERE a like "aaa%";
select sleep(3);
sleep(3)
0
SET global debug_dbug=@old_dbug;
DROP TABLE t;
CREATE TABLE t (
a TINYBLOB,
b TINYBLOB,
c TINYBLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
h VARCHAR(10) DEFAULT NULL,
i INT
) ROW_FORMAT=COMPACT ENGINE=InnoDB;
INSERT INTO t VALUES (REPEAT('g', 100), REPEAT('x', 100), DEFAULT, "kk", 1);
INSERT INTO t VALUES (REPEAT('a', 100), REPEAT('b', 100), DEFAULT, "mm", 2);
CREATE INDEX idx ON t(c(100));
SET global debug_dbug="+d,ib_purge_virtual_index_callback";
UPDATE t SET a = REPEAT('m', 100) WHERE a like "aaa%";
select sleep(3);
sleep(3)
0
SET global debug_dbug=@old_dbug;
DROP TABLE t;
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);
SET global debug_dbug="+d,ib_purge_virtual_index_callback";
UPDATE t1 SET id = 10 WHERE id = 1;
select sleep(3);
sleep(3)
0
SET global debug_dbug=@old_dbug;
DROP TABLE t1;
connect con1,localhost,root,,;
connection default;
CREATE TABLE t1 (a INT, b INT);
INSERT INTO t1(a, b) VALUES (1, 1), (2, 2), (3, 3);
connection con1;
# disable purge
CREATE TABLE t0 (a INT) ENGINE=InnoDB;
BEGIN;
SELECT * FROM t0;
a
connection default;
DELETE FROM t1 WHERE a = 1;
UPDATE t1 SET a = 4, b = 4 WHERE a = 3;
INSERT INTO t1(a, b) VALUES (5, 5);
SET DEBUG_SYNC= 'inplace_after_index_build SIGNAL uncommitted WAIT_FOR purged';
ALTER TABLE t1 ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=NONE;
ERROR 0A000: LOCK=NONE is not supported. Reason: INPLACE ADD or DROP of virtual columns cannot be combined with other ALTER TABLE actions. Try LOCK=SHARED
ALTER TABLE t1 ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=SHARED;
connection con1;
SET DEBUG_SYNC= 'now WAIT_FOR uncommitted';
# enable purge
COMMIT;
# wait for purge to process the deleted records.
Timeout in wait_innodb_all_purged.inc for INNODB_PURGE_TRX_ID_AGE = 3
SET DEBUG_SYNC= 'now SIGNAL purged';
connection default;
/* connection default */ ALTER TABLE t1 ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=SHARED;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) AS ((`a` + `b`)) VIRTUAL,
KEY `idx` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SELECT * FROM t1;
a b c
2 2 4
4 4 8
5 5 10
DROP TABLE t1;
CREATE TABLE t1 (a INT, b INT, c INT GENERATED ALWAYS AS(a+b));
INSERT INTO t1(a, b) VALUES (1, 1), (2, 2), (3, 3), (4, 4);
connection con1;
# disable purge
BEGIN;
SELECT * FROM t0;
a
connection default;
DELETE FROM t1 WHERE a = 1;
UPDATE t1 SET a = 2, b = 2 WHERE a = 5;
INSERT INTO t1(a, b) VALUES (6, 6);
SET DEBUG_SYNC= 'inplace_after_index_build SIGNAL uncommitted WAIT_FOR purged';
ALTER TABLE t1 ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=NONE;
connection con1;
SET DEBUG_SYNC= 'now WAIT_FOR uncommitted';
DELETE FROM t1 WHERE a = 3;
UPDATE t1 SET a = 7, b = 7 WHERE a = 4;
INSERT INTO t1(a, b) VALUES (8, 8);
# enable purge
COMMIT;
# wait for purge to process the deleted/updated records.
SET DEBUG_SYNC= 'now SIGNAL purged';
disconnect con1;
connection default;
/* connection default */ ALTER TABLE t1 ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=NONE;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) AS ((`a` + `b`)) VIRTUAL,
KEY `idx` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SELECT * FROM t1;
a b c
2 2 4
7 7 14
6 6 12
8 8 16
DROP TABLE t0, t1;
set debug_sync=reset;

View File

@@ -0,0 +1,590 @@
set default_storage_engine=innodb;
#
# Bug#22469130: FOREIGN KEY ON DELETE CASCADE NOT ALLOWED
# WHEN A VIRTUAL INDEX EXISTS.
# UPDATE CASCADE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
2
SELECT * FROM t2;
fld1 fld2
2 2
DROP TABLE t2, t1;
# UPDATE SET NULL
CREATE TABLE t1(fld1 INT NOT NULL, fld2 INT NOT NULL PRIMARY KEY,
KEY(fld1));
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE SET NULL);
INSERT INTO t1 VALUES(1, 2);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
NULL
SELECT * FROM t2;
fld1 fld2
NULL NULL
DROP TABLE t2, t1;
# DELETE CASCADE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t1 VALUES(2);
INSERT INTO t2 VALUES(1, DEFAULT);
INSERT INTO t2 VALUES(2, DEFAULT);
DELETE FROM t1 WHERE fld1= 1;
SELECT fld2 FROM t2;
fld2
2
SELECT * FROM t2;
fld1 fld2
2 2
DROP TABLE t2, t1;
# DELETE SET NULL
CREATE TABLE t1(fld1 INT NOT NULL, fld2 INT NOT NULL PRIMARY KEY, KEY(fld1));
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE SET NULL);
INSERT INTO t1 VALUES(1, 1);
INSERT INTO t1 VALUES(2, 2);
INSERT INTO t2 VALUES(1, DEFAULT);
INSERT INTO t2 VALUES(2, DEFAULT);
DELETE FROM t1 WHERE fld1= 1;
SELECT fld2 FROM t2;
fld2
NULL
2
SELECT * FROM t2;
fld1 fld2
NULL NULL
2 2
DROP TABLE t2, t1;
# VIRTUAL INDEX CONTAINS FK CONSTRAINT COLUMN
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT, fld3 INT AS (fld2) VIRTUAL,
KEY(fld3, fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 3);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
fld3 fld1
3 2
SELECT * FROM t2;
fld1 fld2 fld3
2 3 3
DROP TABLE t2, t1;
# Multiple level of VIRTUAL columns.
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld3), KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
2
SELECT fld3 FROM t2;
fld3
2
SELECT * FROM t2;
fld1 fld2 fld3
2 2 2
DROP TABLE t2, t1;
# Drop the VIRTUAL INDEX using alter copy ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY vk(fld2),
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2, fld1 FROM t2;
fld2 fld1
2 2
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld2, fld1 FROM t2;
fld2 fld1
3 3
DROP TABLE t2, t1;
# Drop the VIRTUAL INDEX using INPLACE alter ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY vk(fld2), KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2, fld1 FROM t2;
fld2 fld1
2 2
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld2, fld1 FROM t2;
fld2 fld1
3 3
DROP TABLE t2, t1;
# Add the VIRTUAL INDEX using COPY alter ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2, fld1 FROM t2;
fld2 fld1
2 2
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld2, fld1 FROM t2;
fld2 fld1
3 3
DROP TABLE t2, t1;
# Add the VIRTUAL INDEX using INPLACE alter ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,fld2 INT AS (fld1) VIRTUAL,
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2, fld1 FROM t2;
fld2 fld1
2 2
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM= INPLACE;
UPDATE t1 SET fld1= 3;
SELECT fld2, fld1 FROM t2;
fld2 fld1
3 3
DROP TABLE t2, t1;
# Drop the VIRTUAL INDEX contains fk constraint column
# using alter copy ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY vk(fld3, fld1),
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 2
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 3
DROP TABLE t2, t1;
# Drop the VIRTUAL INDEX which contains fk constraint column
# using INPLACE alter operation
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY vk(fld3, fld1),
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 2
alter TABLE t2 DROP INDEX vk, ALGORITHM= INPLACE;
UPDATE t1 SET fld1= 3;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 3
DROP TABLE t2, t1;
# Add the VIRTUAL INDEX contains fk constraint column
# using copy alter operatiON
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 2
alter TABLE t2 ADD INDEX vk(fld3, fld1), ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 3
DROP TABLE t2, t1;
# Cascading UPDATEs and DELETEs for the multiple
# fk dependent TABLEs
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld1), KEY(fld2, fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld2, fld1),
FOREIGN KEY(fld1) REFERENCES t2(fld1) ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2(fld1) VALUES(1), (2);
INSERT INTO t3(fld1) VALUES(1), (2);
UPDATE t1 SET fld1= 4 WHERE fld1= 1;
SELECT fld2, fld1 FROM t2;
fld2 fld1
2 2
4 4
SELECT fld2, fld1 FROM t3;
fld2 fld1
2 2
4 4
DROP TABLE t3, t2, t1;
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1), KEY(fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1),
FOREIGN KEY(fld1) REFERENCES t2(fld1) ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, 1, DEFAULT), (2, 2, default);
INSERT INTO t3 VALUES(1, 1, DEFAULT), (2, 2, default);
UPDATE t1 SET fld1= 4 WHERE fld1= 1;
SELECT fld3, fld1 FROM t2;
fld3 fld1
1 4
2 2
SELECT fld3, fld1 FROM t3;
fld3 fld1
1 4
2 2
DROP TABLE t3, t2, t1;
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld1), KEY(fld2, fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE CASCADE);
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld2, fld1), FOREIGN KEY(fld1) REFERENCES t2(fld1)
ON DELETE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2(fld1) VALUES(1), (2);
INSERT INTO t3(fld1) VALUES(1), (2);
DELETE FROM t1 WHERE fld1= 1;
SELECT fld2, fld1 FROM t2;
fld2 fld1
2 2
SELECT fld2, fld1 FROM t3;
fld2 fld1
2 2
DROP TABLE t3, t2, t1;
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL,
KEY(fld3, fld1), KEY(fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON DELETE CASCADE);
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1),
FOREIGN KEY(fld1) REFERENCES t2(fld1)
ON DELETE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, 1, DEFAULT), (2, 2, default);
INSERT INTO t3 VALUES(1, 1, DEFAULT), (2, 2, default);
DELETE FROM t1 WHERE fld1= 1;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 2
SELECT fld3, fld1 FROM t3;
fld3 fld1
2 2
DROP TABLE t3, t2, t1;
# RENAME TABLE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY(fld2, fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON DELETE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
RENAME TABLE t2 to t3;
DELETE FROM t1 WHERE fld1= 1;
SELECT fld2, fld1 FROM t3;
fld2 fld1
2 2
DROP TABLE t3, t1;
# FOREIGN_KEY_CHECKS disabled DURING INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
SET foreign_key_checks = 0;
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM=INPLACE;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 3 WHERE fld1= 2;
SELECT fld2 FROM t2;
fld2
1
3
DROP TABLE t2, t1;
# GENERATED COLUMN COMPUTATION FAILS when SQL_MODE
# is set to ERROR_FOR_DIVISION_BY_ZERO
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (100/fld1) VIRTUAL,
KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
UPDATE t1 SET fld1= 0 WHERE fld1= 2;
SELECT fld2 FROM t2;
fld2
NULL
100
DROP TABLE t2, t1;
# CHANGE SQL_MODE and try the ERROR_FOR_DIVISION_BY_ZERO
SET sql_mode = STRICT_ALL_TABLES;
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (100/fld1) VIRTUAL,
KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
UPDATE t1 SET fld1= 0 WHERE fld1= 2;
SELECT fld2 FROM t2;
fld2
NULL
100
SELECT * FROM t2;
fld1 fld2
1 100
0 NULL
DROP TABLE t2, t1;
SET sql_mode = default;
# ADD FOREIGN CONSTRAINT USING COPY
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL, KEY(fld2));
ALTER TABLE t2 ADD FOREIGN KEY (fld1)
REFERENCES t1(fld1) ON UPDATE CASCADE,
ALGORITHM=copy;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
2
SELECT * FROM t2;
fld1 fld2
2 2
DROP TABLE t2, t1;
# ADD FOREIGN CONSTRAINT USING INPLACE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL, KEY(fld2));
SET foreign_key_checks = 0;
ALTER TABLE t2 ADD FOREIGN KEY (fld1)
REFERENCES t1(fld1) ON UPDATE CASCADE,
ALGORITHM=inplace;
SET foreign_key_checks = 1;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
2
SELECT * FROM t2;
fld1 fld2
2 2
DROP TABLE t2, t1;
# DROP FOREIGN CONSTRAINT USING COPY
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
CONSTRAINT fidx FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 DROP FOREIGN KEY fidx, ALGORITHM=COPY;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
1
SELECT * FROM t2;
fld1 fld2
1 1
DROP TABLE t2, t1;
# DROP FOREIGN CONSTRAINT USING INPLACE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
CONSTRAINT fidx FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
SET foreign_key_checks = 0;
ALTER TABLE t2 DROP FOREIGN KEY fidx, ALGORITHM=INPLACE;
SET foreign_key_checks = 1;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
1
SELECT * FROM t2;
fld1 fld2
1 1
DROP TABLE t2, t1;
# ADD VC INDEX and ADD FK IN SAME COPY ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 ADD INDEX(fld2), ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE, ALGORITHM=copy;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
2
SELECT * FROM t2;
fld1 fld2
2 2
DROP TABLE t2, t1;
# ADD VC INDEX and ADD FK IN SAME INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
SET foreign_key_checks = 0;
ALTER TABLE t2 ADD INDEX(fld2), ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE, ALGORITHM=inplace;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
2
SELECT * FROM t2;
fld1 fld2
2 2
DROP TABLE t2, t1;
# ADD VC INDEX and DROP FK IN SAME COPY ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 ADD INDEX(fld2), DROP FOREIGN KEY fidx, ALGORITHM=copy;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
1
SELECT * FROM t2;
fld1 fld2
1 1
DROP TABLE t2, t1;
# ADD VC INDEX and DROP FK IN SAME INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
SET foreign_key_checks = 0;
ALTER TABLE t2 ADD INDEX(fld2), DROP FOREIGN KEY fidx, ALGORITHM=inplace;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
1
SELECT * FROM t2;
fld1 fld2
1 1
DROP TABLE t2, t1;
# DROP VC INDEX and ADD FK IN SAME COPY ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY idx(fld2));
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 DROP INDEX idx, ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE, ALGORITHM=COPY;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
2
SELECT * FROM t2;
fld1 fld2
2 2
DROP TABLE t2, t1;
# DROP VC INDEX and ADD FK IN SAME INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY idx(fld2));
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
SET foreign_key_checks = 0;
ALTER TABLE t2 DROP INDEX idx, ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE, ALGORITHM=INPLACE;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
2
SELECT * FROM t2;
fld1 fld2
2 2
DROP TABLE t2, t1;
# DROP VC INDEX and DROP FK IN SAME COPY ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY idx(fld2),
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 DROP KEY idx, DROP FOREIGN KEY fidx, ALGORITHM=COPY;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
1
SELECT * FROM t2;
fld1 fld2
1 1
DROP TABLE t2, t1;
# DROP VC INDEX and DROP FK IN SAME INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY idx(fld2),
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
SET foreign_key_checks = 0;
ALTER TABLE t2 DROP KEY idx, DROP FOREIGN KEY fidx, ALGORITHM=INPLACE;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
fld2
1
SELECT * FROM t2;
fld1 fld2
1 1
DROP TABLE t2, t1;

View File

@@ -0,0 +1,44 @@
#
# Bug#22469130: FOREIGN KEY ON DELETE CASCADE NOT ALLOWED
# WHEN A VIRTUAL INDEX EXISTS.
# Add the VIRTUAL INDEX contains fk constraINT column
# using INPLACE alter operatiON
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY) engine=innodb;
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE) engine=innodb;
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 2
alter TABLE t2 ADD INDEX vk(fld3, fld1), ALGORITHM=INPLACE;
UPDATE t1 SET fld1=3;
SELECT fld3, fld1 FROM t2;
fld3 fld1
2 3
DROP TABLE t2, t1;
# TEMPORARY TABLE NAME and CHILD TABLE NAME are same
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY) engine=innodb;
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE) engine=innodb;
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
CREATE TEMPORARY TABLE t2 (fld1 INT NOT NULL)ENGINE=INNODB;
UPDATE t1 SET fld1= 3 WHERE fld1= 2;
connect con1,localhost,root,,test;
SELECT fld2 FROM t2;
fld2
1
3
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
connection default;
disconnect con1;
DROP TABLE t2;
DROP TABLE t2, t1;

View File

@@ -0,0 +1,196 @@
#
# Bug 21922176 - PREBUILT->SEARCH_TUPLE CREATED WITHOUT INCLUDING
# THE NUMBER OF VIRTUAL COLUMNS
#
CREATE TABLE t1 (a INT, a1 INT GENERATED ALWAYS AS (a) VIRTUAL, a2 INT
GENERATED ALWAYS AS (a) VIRTUAL, a3 INT GENERATED ALWAYS AS (a) VIRTUAL, a4
INT GENERATED ALWAYS AS (a) VIRTUAL, a5 INT GENERATED ALWAYS AS (a) VIRTUAL,
a6 INT GENERATED ALWAYS AS (a) VIRTUAL, a7 INT GENERATED ALWAYS AS (a)
VIRTUAL, a8 INT GENERATED ALWAYS AS (a) VIRTUAL, a9 INT GENERATED ALWAYS AS
(a) VIRTUAL, INDEX(a1, a2, a3, a4, a5, a6, a7, a8, a9)) ;
INSERT INTO t1(a) VALUES(10);
SELECT * FROM t1 WHERE a1=10 AND a2 = 10 AND a3 =10 AND a4 = 10 AND a5=10 AND
a6=10 AND a7=10 AND a8=10 AND a9=10;
a a1 a2 a3 a4 a5 a6 a7 a8 a9
10 10 10 10 10 10 10 10 10 10
DROP TABLE t1;
#
# Bug 22572997 - GCOL:INNODB: FAILING ASSERTION: N < REC_OFFS_N_FIELDS(
# OFFSETS)
#
SET @@SESSION.sql_mode=0;
CREATE TABLE t1(
c1 int(1)AUTO_INCREMENT,
c2 int(1),
c3 int(1)GENERATED ALWAYS AS ((c2 + c2)) VIRTUAL,
c4 int(1)GENERATED ALWAYS AS ((c3 + c2)) VIRTUAL,
c5 date,
c6 date GENERATED ALWAYS AS((c5 + interval 30 day)) VIRTUAL,
c7 DATE,
c8 time,
c9 DATE GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c10 time GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c11 DATE GENERATED ALWAYS AS(addtime(c9,c8)) VIRTUAL,
c12 CHAR(1),
c13 CHAR(1)GENERATED ALWAYS AS (concat(c12,c12)) VIRTUAL,
c14 CHAR(2)GENERATED ALWAYS AS (concat(c13,'x')) VIRTUAL,
PRIMARY KEY(c1),
KEY c4_6(c4,c11)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE t2(
c1 int(1)AUTO_INCREMENT,
c2 int(1),
c3 int(1)GENERATED ALWAYS AS ((c2 + c2)) VIRTUAL,
c4 int(1)GENERATED ALWAYS AS ((c3 + c2)) VIRTUAL,
c5 date,
c6 date GENERATED ALWAYS AS((c5 + interval 30 day)) VIRTUAL,
c6a date GENERATED ALWAYS AS((c6 + interval 30 day)) VIRTUAL,
c7 DATE,
c8 time,
c9 DATE GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c10 time GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c11 DATE GENERATED ALWAYS AS(addtime(c9,c8)) VIRTUAL,
c11a time GENERATED ALWAYS AS(addtime(c7,c10)) VIRTUAL,
c12 CHAR(1),
c13 CHAR(2)GENERATED ALWAYS AS (concat(c12,c12)) VIRTUAL,
c14 CHAR(4)GENERATED ALWAYS AS (concat(c13,'x')) VIRTUAL,
PRIMARY KEY(c1),
KEY c13(c13),
KEY c4_6(c4,c11)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO t2(c1,c2,c5,c7,c8,c12)VALUES (0,0,0,0,0,'v');
CREATE TABLE t3(
c1 int(1)AUTO_INCREMENT,
c2 int(1),
c3 int(1)GENERATED ALWAYS AS ((c2 + c2)) VIRTUAL,
c4 int(1)GENERATED ALWAYS AS ((c3 + c2)) VIRTUAL,
c5 date,
c7 DATE,
c8 time,
c9 DATE GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c11 DATE GENERATED ALWAYS AS(addtime(c9,c8)) VIRTUAL,
c12 CHAR(1),
PRIMARY KEY(c1),
KEY c4_6(c4,c11)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO t3(c1,c2,c5,c7,c8,c12)VALUES
(0,0,0,0,0,'q'),(0,0,0,0,0,'g'),(0,0,0,0,0,'l'),(0,0,0,0,0,1),(0,0,0,0,0,'v'),
(0,1,0,0,0,'c'),(0,0,0,0,0,'x');
UPDATE
t2 AS O1,t3 AS O2
SET O1.c12=1
WHERE O1.c14 NOT IN
(
SELECT
DISTINCT I1.c14 AS y
FROM t1 AS I1
ORDER BY I1.c14);
SET @@SESSION.sql_mode=default;
DROP TABLE t1, t2, t3;
#
# Bug 22650296 - ASSERTION IN INNOBASE_BUILD_COL_MAP, ALTER
#
CREATE TABLE `ibstd_08` (
`nc00577` tinyint(4) DEFAULT NULL,
`nc07844` varchar(41) DEFAULT NULL,
`gc01908` point NOT NULL,
`nc04156` char(17) DEFAULT NULL,
`nc09536` longblob NOT NULL,
`nc09231` decimal(10,0) NOT NULL,
`a` int(11) NOT NULL,
`b` varchar(198) NOT NULL,
`nc04560` mediumtext,
`c` char(187) DEFAULT NULL,
`vbidxcol` char(3) GENERATED ALWAYS AS (substr(`b`,1,3)) VIRTUAL,
`gc00881` polygon NOT NULL,
`nc05121` int(11) NOT NULL DEFAULT '85941481',
KEY `a` (`a`),
KEY `b` (`b`(3),`a`),
KEY `c` (`c`(99),`b`(25)),
KEY `b_2` (`b`(5),`c`(10),`a`),
KEY `vbidxcol` (`vbidxcol`),
KEY `a_2` (`a`,`vbidxcol`),
KEY `vbidxcol_2` (`vbidxcol`),
FULLTEXT KEY `ftsic` (`c`,`b`)
) ENGINE=InnoDB;
Warnings:
Note 1831 Duplicate index 'vbidxcol_2' defined on the table 'test.ibstd_08'. This is deprecated and will be disallowed in a future release
ALTER TABLE ibstd_08 ADD COLUMN nc07006 BIGINT AUTO_INCREMENT NOT NULL , ADD KEY auto_nc07006(nc07006);
Warnings:
Warning 124 InnoDB rebuilding table to add column FTS_DOC_ID
DROP TABLE ibstd_08;
#
# Bug 22899305 - GCOLS: FAILING ASSERTION: !(COL->PRTYPE & 256)
# AND SEGFAULT
#
set sql_mode="";
create table t (a int) engine=innodb;
create table s (
b int generated always as (1) virtual,
c int,
d int generated always as (1) virtual,
key (d)
) engine=innodb;
insert into t(a) values ((select d from s for update));
insert into s(c) values ('');
Warnings:
Warning 1366 Incorrect integer value: '' for column 'c' at row 1
SET sql_mode = default;
drop table if exists t,s;
#
# Bug 23014521 - GCOL:INNODB: FAILING ASSERTION: !IS_V
#
CREATE TABLE t1 (
col1 int(11) NOT NULL,
col2 int(11) DEFAULT NULL,
col3 int(11) NOT NULL,
col4 int(11) DEFAULT NULL,
col5 int(11) GENERATED ALWAYS AS ((col1 % col4)) VIRTUAL,
col6 int(11) GENERATED ALWAYS AS ((col2 - col4)) VIRTUAL,
col5x int(11) GENERATED ALWAYS AS ((col3 / col2)) VIRTUAL,
col6b varchar(20) GENERATED ALWAYS AS (col2) VIRTUAL,
col6x int(11) GENERATED ALWAYS AS ((col2 % col1)) VIRTUAL,
col7 int(11) GENERATED ALWAYS AS ((col6x + col5x)) VIRTUAL,
col8 int(11) GENERATED ALWAYS AS ((col5x / col5)) VIRTUAL,
col7x int(11) GENERATED ALWAYS AS ((col5x + col5)) VIRTUAL,
col8x int(11) GENERATED ALWAYS AS ((col5 / col5x)) VIRTUAL,
col9 text,
col2b varchar(20) GENERATED ALWAYS AS (col4) VIRTUAL,
col8a int(11) GENERATED ALWAYS AS (col2) VIRTUAL,
col4b varchar(20) GENERATED ALWAYS AS (col4) VIRTUAL,
col1c int(11) GENERATED ALWAYS AS ((col2 * col1)) VIRTUAL,
extra int(11) DEFAULT NULL,
col5c int(11) GENERATED ALWAYS AS ((col1 / col1)) VIRTUAL,
col6a bigint(20) GENERATED ALWAYS AS ((col3 / col1)) VIRTUAL,
col1a varchar(20) GENERATED ALWAYS AS (col6) VIRTUAL,
col6c int(11) GENERATED ALWAYS AS ((col2 % col2)) VIRTUAL,
col7c bigint(20) GENERATED ALWAYS AS ((col2 / col1)) VIRTUAL,
col2c int(11) GENERATED ALWAYS AS ((col5 % col5)) VIRTUAL,
col1b int(11) GENERATED ALWAYS AS ((col1 / col2)) VIRTUAL,
col3b bigint(20) GENERATED ALWAYS AS ((col6x % col6)) VIRTUAL,
UNIQUE KEY idx7 (col1,col3,col2),
UNIQUE KEY uidx (col9(10)),
KEY idx15 (col9(10) DESC,col2 DESC),
KEY idx10 (col9(10) DESC,col1 DESC),
KEY idx11 (col6x DESC),
KEY idx6 (col9(10) DESC,col7 DESC),
KEY idx14 (col6 DESC)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE t1 ADD COLUMN col7a INT GENERATED ALWAYS AS (col5x % col6x)
VIRTUAL, ADD FULLTEXT KEY ftidx ( col9 ), algorithm=inplace;
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
CREATE FULLTEXT INDEX idx ON t1(col9);
Warnings:
Warning 124 InnoDB rebuilding table to add column FTS_DOC_ID
ALTER TABLE t1 ADD COLUMN col7a INT GENERATED ALWAYS AS (col5x % col6x)
VIRTUAL, ADD FULLTEXT KEY ftidx ( col9 ), algorithm=inplace;
DROP TABLE t1;
CREATE TABLE t1 (
col1 int(11) NOT NULL,
col2 int(11) DEFAULT NULL,
col3 int(11) NOT NULL,
col4 int(11) DEFAULT NULL) engine=innodb;
ALTER TABLE t1 ADD COLUMN col7a INT GENERATED ALWAYS AS (col1 % col2)
VIRTUAL, ADD UNIQUE index idx (col1), algorithm=inplace;
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
DROP TABLE t1;

View File

@@ -0,0 +1,140 @@
#
# Bug#21869656 UNDO LOG DOES NOT CONTAIN ENOUGH INFORMATION
# ON INDEXED VIRTUAL COLUMNS
#
CREATE TABLE t1 (a INT, b INT,
a1 INT GENERATED ALWAYS AS (a) VIRTUAL, INDEX(a1)
) ENGINE=InnoDB;
INSERT INTO t1 (a,b) VALUES(1,1);
connect con1,localhost,root,,;
CREATE TABLE t0 (a INT) ENGINE=InnoDB;
BEGIN;
SELECT * FROM t0;
a
connection default;
UPDATE t1 SET a=0;
ALTER TABLE t1 DROP COLUMN a1, ALGORITHM=INPLACE;
ALTER TABLE t1 ADD COLUMN b1 INT GENERATED ALWAYS AS (b) VIRTUAL, ADD
INDEX(b1),
ALGORITHM=INPLACE;
connection con1;
COMMIT;
UPDATE t1 SET a=1;
connection default;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT b1 FROM t1;
b1
1
ALTER TABLE t1
ADD COLUMN a1 INT GENERATED ALWAYS AS (a) VIRTUAL,
ADD COLUMN a2 INT GENERATED ALWAYS AS (a + b) VIRTUAL,
ADD COLUMN a3 INT GENERATED ALWAYS AS (a - b) VIRTUAL,
ADD COLUMN a4 INT GENERATED ALWAYS AS (a - b) VIRTUAL,
ADD INDEX(a1), ADD INDEX(a2), ADD INDEX(a3), ALGORITHM=INPLACE;
CREATE TABLE t2 (
a BLOB,
b BLOB,
c BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
h VARCHAR(10) DEFAULT NULL
) ENGINE=InnoDB;
INSERT INTO t2 VALUES (REPEAT('g', 16000), REPEAT('x', 16000), DEFAULT, 'kk');
INSERT INTO t2 VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, 'mm');
CREATE INDEX idx ON t2(c(100));
INSERT INTO t1 (a, b) VALUES(1,1);
connection con1;
BEGIN;
SELECT * FROM t0;
a
connection default;
UPDATE t1 SET a=0;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
UPDATE t1 SET b=0;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
ALTER TABLE t1 DROP COLUMN a3, ALGORITHM=INPLACE;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t1 SET a=2;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
ALTER TABLE t1 DROP COLUMN a2, ALGORITHM=INPLACE;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t1 SET b=3;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
ALTER TABLE t1 ADD COLUMN b2 INT GENERATED ALWAYS AS (b) VIRTUAL,
ADD INDEX(b2), ALGORITHM=INPLACE;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t1 SET b=9;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
ALTER TABLE t1 ADD COLUMN b3 INT GENERATED ALWAYS AS (a) VIRTUAL,
ADD INDEX(b3), ALGORITHM=INPLACE;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t1 SET b=10;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
ALTER TABLE t2 DROP COLUMN c;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t2 SET a = REPEAT('s', 6000) WHERE a like 'aaa%';
affected rows: 1
info: Rows matched: 1 Changed: 1 Warnings: 0
ALTER TABLE t2 ADD COLUMN x1 BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
ADD COLUMN x2 BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
ADD INDEX(x1(100), x2(120)), ADD INDEX (x1(20));
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t1 SET a=5;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
UPDATE t2 SET a = REPEAT('m', 16000) WHERE a like 'sss%';
affected rows: 1
info: Rows matched: 1 Changed: 1 Warnings: 0
ALTER TABLE t1 DROP COLUMN b2, ALGORITHM=INPLACE;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t1 SET a=6;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
ALTER TABLE t2 DROP COLUMN x1, DROP COLUMN x2, ALGORITHM=INPLACE;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t2 SET a = REPEAT('x', 1000) WHERE a like 'mmm%';
affected rows: 1
info: Rows matched: 1 Changed: 1 Warnings: 0
ALTER TABLE t1 DROP INDEX b3;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
UPDATE t1 SET a=100;
affected rows: 2
info: Rows matched: 2 Changed: 2 Warnings: 0
connection con1;
COMMIT;
disconnect con1;
connection default;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SELECT b1 FROM t1;
b1
10
10
SELECT * FROM t1;
a b b1 a1 a4 b3
100 10 10 100 90 100
100 10 10 100 90 100
CHECK TABLE t2;
Table Op Msg_type Msg_text
test.t2 check status OK
DROP TABLE t2, t1, t0;
CREATE TABLE t1 (a VARCHAR(30), b INT, a2 VARCHAR(30) GENERATED ALWAYS AS (a) VIRTUAL);
CREATE INDEX idx ON t1(a2(10), b, a2(20));
ERROR 42S21: Duplicate column name 'a2'
DROP TABLE t1;

View File

@@ -0,0 +1,52 @@
CREATE TABLE t_8114 (a int) ENGINE = INNODB;
ALTER TABLE t_8114 ADD b INT GENERATED ALWAYS AS (a) VIRTUAL;
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114";
NAME
test/t_8114
SELECT NAME, POS, MTYPE, PRTYPE, LEN FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS WHERE TABLE_ID IN (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114");
NAME POS MTYPE PRTYPE LEN
a 0 6 1027 4
b 65537 6 9219 4
INSERT INTO t_8114 VALUES (9, default);
INSERT INTO t_8114 VALUES (3, default);
INSERT INTO t_8114 VALUES (1, default);
INSERT INTO t_8114 VALUES (5, default);
SELECT * FROM t_8114;
a b
9 9
3 3
1 1
5 5
DROP TABLE t_8114;
CREATE TABLE t_8114 (Column_1 CHAR(5) GENERATED ALWAYS AS (PI()+5), Column_2 CHAR(5)) engine=innodb;
SELECT NAME, FLAG, N_COLS FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114";
NAME FLAG N_COLS
test/t_8114 33 4
SELECT NAME, POS, MTYPE, PRTYPE, LEN FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS WHERE TABLE_ID IN (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114");
NAME POS MTYPE PRTYPE LEN
Column_2 0 2 524542 5
Column_1 65536 2 532734 5
INSERT INTO t_8114 VALUES (default, "aa");
INSERT INTO t_8114 VALUES (default, "bb");
INSERT INTO t_8114 VALUES (default, "ee");
INSERT INTO t_8114 VALUES (default, "pp");
SELECT * FROM t_8114;
Column_1 Column_2
8.142 aa
8.142 bb
8.142 ee
8.142 pp
ALTER TABLE t_8114 DROP Column_1;
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114";
NAME
test/t_8114
SELECT NAME, POS, MTYPE, PRTYPE, LEN FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS WHERE TABLE_ID IN (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114");
NAME POS MTYPE PRTYPE LEN
Column_2 0 2 524542 5
SELECT * FROM t_8114;
Column_2
aa
bb
ee
pp
DROP TABLE t_8114;

View File

@@ -0,0 +1,52 @@
#
# Bug#22017616: ASSERTION FAILED: TABLE_SHARE->IS_MISSING_PRIMARY_KEY()
# == M_PREBUILT->CLUST_IND
#
# Ensure that adding indexes with virtual columns are not promoted to
# primary keys
#
# Base line with normal column - should be promoted
CREATE TABLE t0(a INT NOT NULL) ENGINE=INNODB;
ALTER TABLE t0 ADD UNIQUE INDEX (a);
# Case a: Create table with virtual unique not null column
CREATE TABLE t1(a POINT GENERATED ALWAYS AS (POINT(1,1)) VIRTUAL UNIQUE) ENGINE=INNODB;
SELECT * FROM t1;
a
# Case b: Create table with index on virtual point column
CREATE TABLE t2(a POINT GENERATED ALWAYS AS (POINT(1,1)) VIRTUAL, UNIQUE INDEX no_pk(a(1))) ENGINE=INNODB;
SELECT * FROM t2;
a
# Case c: Add unique index on virtual point column
CREATE TABLE t3(a POINT GENERATED ALWAYS AS (POINT(1,1)) VIRTUAL)
ENGINE=INNODB;
ALTER TABLE t3 ADD UNIQUE INDEX (a(1));
SELECT * FROM t3;
a
# Case d: Add unique index on virtual blob column
CREATE TABLE t4 (a BLOB, b BLOB GENERATED ALWAYS AS (a) VIRTUAL) ENGINE=INNODB;
ALTER TABLE t4 ADD UNIQUE INDEX (b(1));
SELECT * FROM t4;
a b
# Query I_S to verify that 'a' is promoted to pk only when it
# isn't virtual
SELECT T.NAME AS TABLE_NAME, I.NAME AS INDEX_NAME,
CASE (I.TYPE & 3)
WHEN 3 THEN "yes"
ELSE "no" END AS IS_PRIMARY_KEY,
F.NAME AS FIELD_NAME, F.POS AS FIELD_POS FROM
INFORMATION_SCHEMA.INNODB_SYS_TABLES AS T JOIN
INFORMATION_SCHEMA.INNODB_SYS_INDEXES AS I JOIN
INFORMATION_SCHEMA.INNODB_SYS_FIELDS AS F
ON I.INDEX_ID = F.INDEX_ID AND I.TABLE_ID = T.TABLE_ID
WHERE T.NAME LIKE 'test/%';
TABLE_NAME INDEX_NAME IS_PRIMARY_KEY FIELD_NAME FIELD_POS
test/t0 a yes a 0
test/t1 a no a 0
test/t2 no_pk no a 0
test/t3 a no a 0
test/t4 b no b 0
DROP TABLE t0;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE t4;

View File

@@ -0,0 +1,49 @@
CREATE DATABASE dump_generated;
USE dump_generated;
CREATE TABLE t1 (pk INTEGER, a INTEGER, b INTEGER, c VARCHAR(16),
sum INTEGER GENERATED ALWAYS AS (a+b),
sub VARCHAR(4) GENERATED ALWAYS AS (SUBSTRING(c, 1, 4)),
key k1(sum),
key k2(sub)
) engine=innodb;
INSERT INTO t1(pk, a, b, c) VALUES (1, 11, 12, 'oneone'), (2, 21, 22, 'twotwo');
SELECT * FROM t1;
pk a b c sum sub
1 11 12 oneone 23 oneo
2 21 22 twotwo 43 twot
DELETE FROM t1;
SELECT * FROM t1;
pk a b c sum sub
1 11 12 oneone 23 oneo
2 21 22 twotwo 43 twot
DELETE FROM t1;
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/t1.txt' INTO TABLE t1;
SELECT * FROM t1;
pk a b c sum sub
1 11 12 oneone 23 oneo
2 21 22 twotwo 43 twot
DROP TABLE t1;
# A table with regular columns after generated
CREATE TABLE t2 (pk INTEGER, a INTEGER, b INTEGER,
sum INTEGER GENERATED ALWAYS AS (a+b),
c VARCHAR(16),
key k1(sum)
) engine=innodb;
INSERT INTO t2(pk, a, b, c) VALUES (1, 11, 12, 'oneone'), (2, 21, 22, 'twotwo');
SELECT * FROM t2;
pk a b sum c
1 11 12 23 oneone
2 21 22 43 twotwo
DELETE FROM t2;
SELECT * FROM t2;
pk a b sum c
1 11 12 23 oneone
2 21 22 43 twotwo
DELETE FROM t2;
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/t2.txt' INTO TABLE t2;
SELECT * FROM t2;
pk a b sum c
1 11 12 23 oneone
2 21 22 43 twotwo
DROP TABLE t2;
DROP DATABASE dump_generated;

View File

@@ -80,164 +80,113 @@ DROP TABLE t1;
--echo #
CREATE TABLE c (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER /*! NULL */,
col_int_key INTEGER GENERATED ALWAYS AS
(col_int_nokey + col_int_nokey) VIRTUAL not null,
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER,
gcol_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_date_nokey DATE,
gcol_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL,
col_datetime_nokey DATETIME,
col_time_nokey TIME,
gcol_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
gcol_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_varchar_nokey VARCHAR(1),
gcol_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
PRIMARY KEY (pk),
UNIQUE KEY (gcol_int_key),
UNIQUE KEY (gcol_varchar_key),
UNIQUE KEY (gcol_date_key),
KEY (gcol_time_key),
KEY (gcol_datetime_key),
UNIQUE KEY (gcol_int_key, gcol_varchar_key),
KEY (gcol_int_key, col_int_nokey),
KEY(gcol_int_key,gcol_date_key),
KEY(gcol_int_key, gcol_time_key),
KEY(gcol_int_key, gcol_datetime_key),
UNIQUE KEY(gcol_date_key,gcol_time_key,gcol_datetime_key),
UNIQUE KEY (gcol_varchar_key, col_varchar_nokey),
UNIQUE KEY (gcol_int_key, gcol_varchar_key, gcol_date_key, gcol_time_key, gcol_datetime_key)
) ENGINE=INNODB;
col_date_nokey DATE /*! NULL */,
col_date_key DATE GENERATED ALWAYS AS
(DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL not null,
col_datetime_nokey DATETIME /*! NULL */,
col_time_nokey TIME /*! NULL */,
col_datetime_key DATETIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_time_key TIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_varchar_nokey VARCHAR(1) /*! NULL */,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS
(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL not null,
PRIMARY KEY (pk),
UNIQUE KEY (col_int_key),
UNIQUE KEY (col_varchar_key),
UNIQUE KEY (col_date_key),
KEY (col_time_key),
KEY (col_datetime_key),
UNIQUE KEY (col_int_key, col_varchar_key),
KEY (col_int_key, col_int_nokey),
KEY(col_int_key,col_date_key),
KEY(col_int_key, col_time_key),
KEY(col_int_key, col_datetime_key),
UNIQUE
KEY(col_date_key,col_time_key,col_datetime_key),
UNIQUE KEY (col_varchar_key, col_varchar_nokey),
UNIQUE KEY (col_int_key, col_varchar_key,
col_date_key, col_time_key, col_datetime_key)
) ENGINE=INNODB;
INSERT /*! IGNORE */ INTO c (
col_int_nokey,
col_date_nokey,
col_time_nokey,
col_datetime_nokey,
col_varchar_nokey
) VALUES (7, '2004-04-09', '14:03:03.042673',
'2001-11-28 00:50:27.051028', 'c'),(1, '2006-05-13', '01:46:09.016386',
'2007-10-09 19:53:04.008332', NULL);
INSERT IGNORE INTO c ( col_int_nokey, col_date_nokey, col_time_nokey, col_datetime_nokey, col_varchar_nokey)
VALUES (7, '2004-04-09', '14:03:03.042673', '2001-11-28 00:50:27.051028', 'c'),
(1, '2006-05-13', '01:46:09.016386', '2007-10-09 19:53:04.008332', NULL);
CREATE TABLE bb (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER /*! NULL */,
col_int_key INTEGER GENERATED ALWAYS AS
(col_int_nokey + col_int_nokey) VIRTUAL not null,
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER,
gcol_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_date_nokey DATE,
gcol_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL,
col_datetime_nokey DATETIME,
col_time_nokey TIME,
gcol_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
gcol_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_varchar_nokey VARCHAR(1),
gcol_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
PRIMARY KEY (pk),
UNIQUE KEY (gcol_int_key),
UNIQUE KEY (gcol_varchar_key),
UNIQUE KEY (gcol_date_key),
KEY (gcol_time_key),
KEY (gcol_datetime_key),
UNIQUE KEY (gcol_int_key, gcol_varchar_key),
KEY (gcol_int_key, col_int_nokey),
KEY(gcol_int_key,gcol_date_key),
KEY(gcol_int_key, gcol_time_key),
KEY(gcol_int_key, gcol_datetime_key),
UNIQUE KEY(gcol_date_key,gcol_time_key,gcol_datetime_key),
UNIQUE KEY (gcol_varchar_key, col_varchar_nokey),
UNIQUE KEY (gcol_int_key, gcol_varchar_key, gcol_date_key, gcol_time_key, gcol_datetime_key)
) AUTO_INCREMENT=10 ENGINE=INNODB;
col_date_nokey DATE /*! NULL */,
col_date_key DATE GENERATED ALWAYS AS
(DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL not null,
col_datetime_nokey DATETIME /*! NULL */,
col_time_nokey TIME /*! NULL */,
col_datetime_key DATETIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_time_key TIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_varchar_nokey VARCHAR(1) /*! NULL */,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS
(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL not null,
PRIMARY KEY (pk),
UNIQUE KEY (col_int_key),
UNIQUE KEY (col_varchar_key),
UNIQUE KEY (col_date_key),
KEY (col_time_key),
KEY (col_datetime_key),
UNIQUE KEY (col_int_key, col_varchar_key),
KEY (col_int_key, col_int_nokey),
KEY(col_int_key,col_date_key),
KEY(col_int_key, col_time_key),
KEY(col_int_key, col_datetime_key),
UNIQUE
KEY(col_date_key,col_time_key,col_datetime_key),
UNIQUE KEY (col_varchar_key, col_varchar_nokey),
UNIQUE KEY (col_int_key, col_varchar_key,
col_date_key, col_time_key, col_datetime_key)
) AUTO_INCREMENT=10 ENGINE=INNODB;
INSERT /*! IGNORE */ INTO bb (
col_int_nokey,
col_date_nokey,
col_time_nokey,
col_datetime_nokey,
col_varchar_nokey
) VALUES (0, '2003-08-04', '01:48:05.048577',
'2006-11-03 00:00:00', 'p'),(2, '2007-11-06', '00:00:00', '2009-11-26 19:28:11.005115', 'n');
INSERT IGNORE INTO bb ( col_int_nokey, col_date_nokey, col_time_nokey, col_datetime_nokey, col_varchar_nokey)
VALUES (0, '2003-08-04', '01:48:05.048577', '2006-11-03 00:00:00', 'p'),
(2, '2007-11-06', '00:00:00', '2009-11-26 19:28:11.005115', 'n');
CREATE TABLE cc (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER /*! NULL */,
col_int_key INTEGER GENERATED ALWAYS AS
(col_int_nokey + col_int_nokey) VIRTUAL not null,
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER,
gcol_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_date_nokey DATE,
gcol_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL,
col_datetime_nokey DATETIME,
col_time_nokey TIME,
gcol_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
gcol_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_varchar_nokey VARCHAR(1),
gcol_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
PRIMARY KEY (pk),
UNIQUE KEY (gcol_int_key),
UNIQUE KEY (gcol_varchar_key),
UNIQUE KEY (gcol_date_key),
KEY (gcol_time_key),
KEY (gcol_datetime_key),
UNIQUE KEY (gcol_int_key, gcol_varchar_key),
KEY (gcol_int_key, col_int_nokey),
KEY(gcol_int_key,gcol_date_key),
KEY(gcol_int_key, gcol_time_key),
KEY(gcol_int_key, gcol_datetime_key),
UNIQUE KEY(gcol_date_key,gcol_time_key,gcol_datetime_key),
UNIQUE KEY (gcol_varchar_key, col_varchar_nokey),
UNIQUE KEY (gcol_int_key, gcol_varchar_key, gcol_date_key, gcol_time_key, gcol_datetime_key)
) AUTO_INCREMENT=10 ENGINE=INNODB;
col_date_nokey DATE /*! NULL */,
col_date_key DATE GENERATED ALWAYS AS
(DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL not null,
col_datetime_nokey DATETIME /*! NULL */,
col_time_nokey TIME /*! NULL */,
col_datetime_key DATETIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_time_key TIME GENERATED ALWAYS AS
(ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_varchar_nokey VARCHAR(1) /*! NULL */,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS
(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL not null,
PRIMARY KEY (pk),
UNIQUE KEY (col_int_key),
UNIQUE KEY (col_varchar_key),
UNIQUE KEY (col_date_key),
KEY (col_time_key),
KEY (col_datetime_key),
UNIQUE KEY (col_int_key, col_varchar_key),
KEY (col_int_key, col_int_nokey),
KEY(col_int_key,col_date_key),
KEY(col_int_key, col_time_key),
KEY(col_int_key, col_datetime_key),
UNIQUE
KEY(col_date_key,col_time_key,col_datetime_key),
UNIQUE KEY (col_varchar_key, col_varchar_nokey),
UNIQUE KEY (col_int_key, col_varchar_key,
col_date_key, col_time_key, col_datetime_key)
) AUTO_INCREMENT=10 ENGINE=INNODB;
INSERT /*! IGNORE */ INTO cc (
col_int_nokey,
col_date_nokey,
col_time_nokey,
col_datetime_nokey,
col_varchar_nokey
) VALUES (172, '2009-04-23', '00:00:00', '2000-12-07 10:17:40.013275', 'h'),(NULL, '2002-10-06', '00:50:49.017545', NULL, 'm');
INSERT IGNORE INTO cc (col_int_nokey, col_date_nokey, col_time_nokey, col_datetime_nokey, col_varchar_nokey)
VALUES (172, '2009-04-23', '00:00:00', '2000-12-07 10:17:40.013275', 'h'),
(NULL, '2002-10-06', '00:50:49.017545', NULL, 'm');
let $query=
SELECT
gp1 . col_datetime_key AS g1
FROM cc AS gp1 LEFT JOIN c AS gp2 ON ( gp2 . col_datetime_key <> gp1 .
gp1 . gcol_datetime_key AS g1
FROM cc AS gp1 LEFT JOIN c AS gp2 ON ( gp2 . gcol_datetime_key <> gp1 .
col_time_nokey )
WHERE
gp1 . col_varchar_nokey IN
(
SELECT
DISTINCT p1 . col_varchar_key AS p1
DISTINCT p1 . gcol_varchar_key AS p1
FROM bb AS p1 LEFT JOIN bb AS p2
ON ( p1 . col_int_key = p2 . pk )
ON ( p1 . gcol_int_key = p2 . pk )
)
AND gp1 . col_varchar_nokey = 'b'
HAVING g1 > 6;
@@ -251,15 +200,15 @@ DROP TABLE bb, c, cc;
CREATE TABLE c (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER NOT NULL,
col_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL not null,
col_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_date_nokey DATE NOT NULL,
col_date_key DATE GENERATED ALWAYS AS (DATE_ADD(col_date_nokey,interval 30 day)) VIRTUAL not null,
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)) VIRTUAL not null,
col_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL not null,
col_datetime_key DATETIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_time_key TIME GENERATED ALWAYS AS (ADDTIME(col_datetime_nokey, col_time_nokey)) VIRTUAL,
col_varchar_nokey VARCHAR(1) NOT NULL,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL not null,
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS (CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
PRIMARY KEY (pk,col_int_nokey),
UNIQUE KEY (col_int_key),
UNIQUE KEY (col_varchar_key),
@@ -303,15 +252,15 @@ DROP TABLE c;
CREATE TABLE t1 (
pk INTEGER AUTO_INCREMENT,
col_int_nokey INTEGER /*! NULL */,
col_int_nokey INTEGER,
col_int_key INTEGER GENERATED ALWAYS AS (col_int_nokey + col_int_nokey) VIRTUAL,
col_blob_nokey BLOB /*! NULL */,
col_blob_nokey BLOB,
col_blob_key BLOB GENERATED ALWAYS AS (REPEAT(col_blob_nokey,15)) VIRTUAL,
col_longblob_nokey LONGBLOB /*! NULL */,
col_longtext_nokey LONGTEXT /*! NULL */,
col_longblob_nokey LONGBLOB,
col_longtext_nokey LONGTEXT,
col_longblob_key LONGBLOB GENERATED ALWAYS AS (REPEAT(col_longblob_nokey, 20)) VIRTUAL,
col_longtext_key LONGTEXT GENERATED ALWAYS AS (REPEAT(col_longblob_nokey, 18)) VIRTUAL,
col_text_nokey TEXT /*! NULL */,
col_text_nokey TEXT,
col_text_key TEXT GENERATED ALWAYS AS (REPEAT(col_text_nokey, 30)) VIRTUAL,
PRIMARY KEY (pk),
KEY (col_int_key),
@@ -339,7 +288,6 @@ VALUES
(5, 'bjjv', 'bjjv', 'bjjv', 'bjjv'),
(0, 'jjvvkymalu', 'jjvvkymalu', 'jjvvkymalu', 'jjvvkymalu'),
(3, 'j', 'j', 'j', 'j');
SELECT alias1.pk AS field1
FROM t1 AS alias1 LEFT OUTER JOIN t1 AS alias2
ON alias1.col_int_key = alias2.col_int_key
@@ -357,7 +305,7 @@ DROP TABLE t1;
CREATE TABLE t(a int);
ALTER TABLE t ADD COLUMN b int GENERATED ALWAYS AS (
date_sub(a,interval a month)) VIRTUAL;
--error 1111
--error ER_VIRTUAL_COLUMN_FUNCTION_IS_NOT_ALLOWED
ALTER TABLE t ADD COLUMN c int GENERATED ALWAYS AS (sum(a));
DROP TABLE t;
@@ -487,16 +435,6 @@ SELECT DISTINCT t1.c13 FROM C AS t1, view_C AS t2;
DROP TABLE C;
DROP VIEW view_C;
--echo #
--echo # Bug #21808680: JSON + GENERATED COLUMN CORRUPTS TABLE CACHE
--echo # MEMORY, CRASHES
--echo #
CREATE TABLE t (a INT, b JSON, c TEXT GENERATED ALWAYS AS (REPEAT(a=b, 2)));
INSERT INTO t (a, b) VALUES (1, '2'), (3, '3');
# The next statement used to crash.
SELECT * FROM t;
DROP TABLE t;
--echo #
--echo # Bug#21810529: CRASH IN ITEM_FUNC::WALK WHEN CODE JUMPS TO GARBAGE
--echo # LOCATION
@@ -517,10 +455,10 @@ DROP TABLE t;
--echo #
CREATE TABLE t(b BLOB);
--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED
--error ER_OPERAND_COLUMNS
ALTER TABLE t ADD COLUMN c INT GENERATED ALWAYS AS ((1,1)) VIRTUAL;
DROP TABLE t;
--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED
--error ER_OPERAND_COLUMNS
CREATE TABLE t(b BLOB, c INT GENERATED ALWAYS AS ((1,1)) VIRTUAL);
--echo #
@@ -552,12 +490,11 @@ DROP TABLE t1;
SET @save_old_sql_mode= @@sql_mode;
SET sql_mode="";
--error ER_TRUNCATED_WRONG_VALUE
CREATE TABLE t (a INTEGER AS (SUBSTR('','a',1))) engine=innodb;
DROP TABLE t;
CREATE TABLE t (a INTEGER) engine=innodb;
--error ER_TRUNCATED_WRONG_VALUE
ALTER TABLE t ADD b INTEGER AS (SUBSTR('','a',1));
DROP TABLE t;

View File

@@ -36,7 +36,7 @@ eval SET @@session.default_storage_engine = 'InnoDB';
#------------------------------------------------------------------------------#
# Execute the tests to be applied to all storage engines
let $support_virtual_index= 0;
let $support_virtual_index= 1;
--source suite/gcol/inc/gcol_column_def_options.inc
#------------------------------------------------------------------------------#

View File

@@ -26,7 +26,8 @@ SELECT * FROM t;
BEGIN;
INSERT INTO t (a) VALUES (10);
--source include/kill_and_restart_mysqld.inc
--let $shutdown_timeout= 0
--source include/restart_mysqld.inc
SELECT * FROM t;
DROP TABLE t;
@@ -103,6 +104,7 @@ connection default;
SELECT * FROM t;
DROP TABLE t;
SET DEBUG_SYNC = 'RESET';
# Wait till all disconnects are completed
--source include/wait_until_count_sessions.inc

View File

@@ -0,0 +1,30 @@
--source include/have_innodb.inc
--source include/have_partition.inc
--echo #
--echo # Bug#22444530 - GCOLS + PARTITIONED TABLE, CRASH IN
--echo #
set sql_mode='';
create table t (
a int not null,
b int generated always as (1) virtual,
c int generated always as (1) virtual,
key (c)
) engine=innodb partition by key (a) partitions 2;
insert into t(a) values(1);
select b from t group by c;
drop table t;
# Make column b a BLOB
create table t (
a int not null,
b blob generated always as ("a") virtual,
c int generated always as (1) virtual,
key (c)
) engine=innodb partition by key (a) partitions 2;
insert into t(a) values(1);
select b from t group by c;
drop table t;

View File

@@ -0,0 +1,22 @@
--source include/have_innodb.inc
--echo #Bug #22445211 GCOLS: SIMPLE DML, FAILING ASSERTION:
--echo #!CURSOR->INDEX->IS_COMMITTED()
--echo #Create and alter table examples for virtual column for full
--echo #column index followed by prefix index.
CREATE TABLE t1(
f1 INT DEFAULT NULL,
f2 CHAR(2) GENERATED ALWAYS AS ('11') VIRTUAL,
f3 INT,
UNIQUE KEY(f1),
UNIQUE KEY(f3,f1),
KEY(f2,f1),
key(f1,f2(1))
)ENGINE=INNODB;
REPLACE INTO t1(f3) VALUES (1),(1);
DROP TABLE t1;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,16 @@
--source include/have_innodb.inc
--echo #
--echo # Bug#22046353 ALTER: ASSERT PAGE_SIZE.EQUALS_TO(SPACE_PAGE_SIZE),
--echo # BTR_COPY_BLOB_PREFIX
--echo #
CREATE TABLE t1
( f1 int primary key, f2 blob,
f3 blob generated always as (f2))
row_format=compressed, engine=innodb;
insert into t1 (f1, f2) values (1, repeat('&', 50000));
alter table t1 add index i1 (f3(200)) ;
alter table t1 row_format=compact;
drop table t1;

View File

@@ -0,0 +1,240 @@
--source include/have_innodb.inc
--source include/have_debug_sync.inc
--source include/have_debug.inc
--source include/count_sessions.inc
set default_storage_engine=innodb;
CREATE TABLE `t` (
`a` VARCHAR(100),
`b` VARCHAR(100),
`c` VARCHAR(200) GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
`h` VARCHAR(10) DEFAULT NULL,
`i` int
) ENGINE=InnoDB;
INSERT INTO t VALUES (REPEAT('g', 100), REPEAT('x', 10), DEFAULT, "kk", 1);
INSERT INTO t VALUES (REPEAT('a', 100), REPEAT('b', 100), DEFAULT, "mm", 2);
CREATE INDEX idx ON t(c(100));
SET session debug_dbug="+d,ib_alter_add_virtual_fail";
--error ER_WRONG_KEY_COLUMN
ALTER TABLE t ADD COLUMN x VARCHAR(200) GENERATED ALWAYS AS (a) VIRTUAL,
ALGORITHM = INPLACE;
--error ER_WRONG_KEY_COLUMN
ALTER TABLE t DROP COLUMN c, ALGORITHM = INPLACE;
SET session debug_dbug="";
DROP TABLE t;
#online test
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, "mx");
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send CREATE INDEX idx ON t(c)
connect (con1,localhost,root,,);
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
update t set a=0 where a = 11;
start transaction;
update t set a=1 where a = 0;
ROLLBACK;
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
reap;
SELECT c FROM t;
SHOW CREATE TABLE t;
SELECT * FROM t;
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send ALTER TABLE t ADD COLUMN x INT
connection con1;
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
start transaction;
update t set a=1 where a = 0;
rollback;
start transaction;
delete from t;
insert into t values(1,null,default,null);
rollback;
start transaction;
update t set b=b+1;
rollback;
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
reap;
check table t;
SELECT c FROM t;
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send ALTER TABLE t ADD COLUMN x2 INT
connection con1;
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
start transaction;
DELETE FROM t WHERE a = 0;
ROLLBACK;
DELETE FROM t WHERE a = 0;
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
reap;
SELECT c FROM t;
disconnect con1;
DROP TABLE t;
SET DEBUG_SYNC = 'RESET';
# Test add virtual column and add index at the same time
# introduce some error
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_1 on t(c);
SET SESSION debug_dbug="+d,create_index_fail";
--enable_info
--error ER_DUP_ENTRY
ALTER TABLE t ADD COLUMN x INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (x);
SET SESSION debug_dbug="";
--disable_info
SHOW CREATE TABLE t;
SELECT c FROM t;
DROP TABLE t;
--echo #
--echo # Bug#22018532 ASSERTION WHEN ONLINE REAPPLY REBUILD LOG ON
--echo # MULTIPLE INDEXED VIRTUAL COLUMNS
--echo #
create table t (
a int as (1) virtual,
b int,
c int as (1) virtual,
unique(b),
unique(c),
key(a)
) engine=innodb;
insert ignore into t values();
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send optimize table t
connect (con1,localhost,root,,);
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
insert ignore into t values();
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
--echo /* connection default */ optimize table t;
reap;
SELECT c FROM t;
SHOW CREATE TABLE t;
SELECT * FROM t;
DROP TABLE t;
# Do another test without duplicate error
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);
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_rebuild WAIT_FOR go_ahead';
--send optimize table t
connection con1;
SET DEBUG_SYNC = 'now WAIT_FOR start_rebuild';
INSERT INTO t VALUES (48, 2, DEFAULT, 'xx');
INSERT INTO t VALUES (68, 3, DEFAULT, 'sx');
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
--echo /* connection default */ optimize table t;
reap;
SELECT c FROM t;
disconnect con1;
DROP TABLE t;
--echo #
--echo # Bug#22951879 - ASSERTS RELATED TO ONLINE DDL AND GCOL
--echo #
# Create a table with 2 virtual column, one (vbidxcol) is indexed and
# the other one (vbcol) is not
create table ibstd_14 (a int not null, d int not null, b varchar(198) not null, c char(181), vadcol int as (a+length(d)) stored, vbcol char(2) as (substr(b,2,2)) virtual, vbidxcol char(3) as (substr(b,1,3)) virtual , index(d), index(a), index(vbidxcol), index(a,vbidxcol), index(vbidxcol,d), unique key (b(10), a, d), index(c(99), b(31)), index(b(5), c(10), a) , index(a,d)) engine=InnoDB stats_persistent=1 row_format=dynamic;
# Do an alter table rebuild table and also create a new index on this
# non-indexed virtual column
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter SIGNAL start_create WAIT_FOR go_ahead';
--send alter table ibstd_14 row_format=compressed key_block_size=4,add key kn3 (d,c,vbcol,b)
# Do a concurrent insert, and make sure this newly indexed virtual column
# is also logged
connect (con1,localhost,root);
SET DEBUG_SYNC = 'now WAIT_FOR start_create';
insert into ibstd_14 (a,d,b,c, vbidxcol, vbcol) values ('118','6',repeat('oacolaarlruoacuroauurloraarucoooarcooauoolacalllaulrruarrrucruuooclacuoouccarrcoocloccorrrrarourcooalloocooccouruolaorlcaocualolc','1'),repeat('lolrrlalcocroraaulauclaaucolcorcuooaolruaooooluooooouaoorlarucorullalcrrloccououaooaorluorraclrcooouuolocoaolcocaaculruoocucoocoooauuolarcoraraocaoolulolarru','1'),default,default);
insert into ibstd_14 (a,d,b,c, vbidxcol, vbcol) values ('118','6', 'aaaa', 'lll', default, default);
# Also do an concurrent update, make sure this is performed
update ibstd_14 set b='11111' where b='aaaa';
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
connection default;
reap;
select * from ibstd_14;
# This will use the newly added "kn3" index, to check materialized vbcol
# after log reapply
select d,c,vbcol,b from ibstd_14;
# check the value is inserted into the index
select vbcol from ibstd_14;
drop table ibstd_14;
disconnect con1;
SET DEBUG_SYNC = 'RESET';
--source include/wait_until_count_sessions.inc

View File

@@ -0,0 +1,174 @@
--source include/have_innodb.inc
--source include/have_debug_sync.inc
--source include/have_debug.inc
--source include/have_partition.inc
set default_storage_engine=innodb;
set @old_dbug=@@global.debug_dbug;
CREATE TABLE `t` (
`a` BLOB,
`b` BLOB,
`c` BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
`h` VARCHAR(10) DEFAULT NULL,
`i` int
) ENGINE=InnoDB;
INSERT INTO t VALUES (REPEAT('g', 16000), REPEAT('x', 16000), DEFAULT, "kk", 1);
INSERT INTO t VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, "mm", 2);
CREATE INDEX idx ON t(c(100));
SET global debug_dbug="+d,ib_purge_virtual_index_callback";
UPDATE t SET a = REPEAT('m', 16000) WHERE a like "aaa%";
select sleep(3);
SET global debug_dbug=@old_dbug;
DROP TABLE t;
CREATE TABLE t (
a TINYBLOB,
b TINYBLOB,
c TINYBLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
h VARCHAR(10) DEFAULT NULL,
i INT
) ROW_FORMAT=COMPACT ENGINE=InnoDB;
INSERT INTO t VALUES (REPEAT('g', 100), REPEAT('x', 100), DEFAULT, "kk", 1);
INSERT INTO t VALUES (REPEAT('a', 100), REPEAT('b', 100), DEFAULT, "mm", 2);
CREATE INDEX idx ON t(c(100));
SET global debug_dbug="+d,ib_purge_virtual_index_callback";
UPDATE t SET a = REPEAT('m', 100) WHERE a like "aaa%";
select sleep(3);
SET global debug_dbug=@old_dbug;
DROP TABLE t;
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);
SET global debug_dbug="+d,ib_purge_virtual_index_callback";
UPDATE t1 SET id = 10 WHERE id = 1;
select sleep(3);
SET global debug_dbug=@old_dbug;
DROP TABLE t1;
#
# BUG#22082762 RE-ENABLE SUPPORT FOR ADDING VIRTUAL INDEX WHILE DROPPING VIRTUAL COLUMN
#
--source include/count_sessions.inc
connect (con1,localhost,root,,);
connection default;
# Test adding virtual index on newly added virtual column
CREATE TABLE t1 (a INT, b INT);
INSERT INTO t1(a, b) VALUES (1, 1), (2, 2), (3, 3);
connection con1;
--echo # disable purge
CREATE TABLE t0 (a INT) ENGINE=InnoDB;
BEGIN; SELECT * FROM t0;
connection default;
DELETE FROM t1 WHERE a = 1;
UPDATE t1 SET a = 4, b = 4 WHERE a = 3;
INSERT INTO t1(a, b) VALUES (5, 5);
SET DEBUG_SYNC= 'inplace_after_index_build SIGNAL uncommitted WAIT_FOR purged';
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE t1 ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=NONE;
send ALTER TABLE t1 ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=SHARED;
connection con1;
SET DEBUG_SYNC= 'now WAIT_FOR uncommitted';
--echo # enable purge
COMMIT;
--echo # wait for purge to process the deleted records.
--source include/wait_innodb_all_purged.inc
SET DEBUG_SYNC= 'now SIGNAL purged';
connection default;
--echo /* connection default */ ALTER TABLE t1 ADD COLUMN c INT GENERATED ALWAYS AS(a+b), ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=SHARED;
--reap
SHOW CREATE TABLE t1;
SELECT * FROM t1;
DROP TABLE t1;
# Test adding virutal index on existing virtual column
CREATE TABLE t1 (a INT, b INT, c INT GENERATED ALWAYS AS(a+b));
INSERT INTO t1(a, b) VALUES (1, 1), (2, 2), (3, 3), (4, 4);
connection con1;
--echo # disable purge
BEGIN; SELECT * FROM t0;
connection default;
DELETE FROM t1 WHERE a = 1;
UPDATE t1 SET a = 2, b = 2 WHERE a = 5;
INSERT INTO t1(a, b) VALUES (6, 6);
SET DEBUG_SYNC= 'inplace_after_index_build SIGNAL uncommitted WAIT_FOR purged';
send ALTER TABLE t1 ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=NONE;
connection con1;
SET DEBUG_SYNC= 'now WAIT_FOR uncommitted';
DELETE FROM t1 WHERE a = 3;
UPDATE t1 SET a = 7, b = 7 WHERE a = 4;
INSERT INTO t1(a, b) VALUES (8, 8);
--echo # enable purge
COMMIT;
--echo # wait for purge to process the deleted/updated records.
--source include/wait_innodb_all_purged.inc
SET DEBUG_SYNC= 'now SIGNAL purged';
disconnect con1;
connection default;
--echo /* connection default */ ALTER TABLE t1 ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=NONE;
--reap
SHOW CREATE TABLE t1;
SELECT * FROM t1;
DROP TABLE t0, t1;
--source include/wait_until_count_sessions.inc
set debug_sync=reset;

View File

@@ -0,0 +1,492 @@
-- source include/have_innodb.inc
set default_storage_engine=innodb;
--echo #
--echo # Bug#22469130: FOREIGN KEY ON DELETE CASCADE NOT ALLOWED
--echo # WHEN A VIRTUAL INDEX EXISTS.
--echo # UPDATE CASCADE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # UPDATE SET NULL
CREATE TABLE t1(fld1 INT NOT NULL, fld2 INT NOT NULL PRIMARY KEY,
KEY(fld1));
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE SET NULL);
INSERT INTO t1 VALUES(1, 2);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # DELETE CASCADE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t1 VALUES(2);
INSERT INTO t2 VALUES(1, DEFAULT);
INSERT INTO t2 VALUES(2, DEFAULT);
DELETE FROM t1 WHERE fld1= 1;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # DELETE SET NULL
CREATE TABLE t1(fld1 INT NOT NULL, fld2 INT NOT NULL PRIMARY KEY, KEY(fld1));
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE SET NULL);
INSERT INTO t1 VALUES(1, 1);
INSERT INTO t1 VALUES(2, 2);
INSERT INTO t2 VALUES(1, DEFAULT);
INSERT INTO t2 VALUES(2, DEFAULT);
DELETE FROM t1 WHERE fld1= 1;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # VIRTUAL INDEX CONTAINS FK CONSTRAINT COLUMN
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT, fld3 INT AS (fld2) VIRTUAL,
KEY(fld3, fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 3);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # Multiple level of VIRTUAL columns.
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld3), KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT fld3 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # Drop the VIRTUAL INDEX using alter copy ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY vk(fld2),
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2, fld1 FROM t2;
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld2, fld1 FROM t2;
DROP TABLE t2, t1;
--echo # Drop the VIRTUAL INDEX using INPLACE alter ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY vk(fld2), KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2, fld1 FROM t2;
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld2, fld1 FROM t2;
DROP TABLE t2, t1;
--echo # Add the VIRTUAL INDEX using COPY alter ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2, fld1 FROM t2;
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld2, fld1 FROM t2;
DROP TABLE t2, t1;
--echo # Add the VIRTUAL INDEX using INPLACE alter ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,fld2 INT AS (fld1) VIRTUAL,
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1) VALUES(1);
UPDATE t1 SET fld1= 2;
SELECT fld2, fld1 FROM t2;
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM= INPLACE;
UPDATE t1 SET fld1= 3;
SELECT fld2, fld1 FROM t2;
DROP TABLE t2, t1;
--echo # Drop the VIRTUAL INDEX contains fk constraint column
--echo # using alter copy ALGORITHM
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY vk(fld3, fld1),
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld3, fld1 FROM t2;
DROP TABLE t2, t1;
--echo # Drop the VIRTUAL INDEX which contains fk constraint column
--echo # using INPLACE alter operation
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY vk(fld3, fld1),
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
alter TABLE t2 DROP INDEX vk, ALGORITHM= INPLACE;
UPDATE t1 SET fld1= 3;
SELECT fld3, fld1 FROM t2;
DROP TABLE t2, t1;
--echo # Add the VIRTUAL INDEX contains fk constraint column
--echo # using copy alter operatiON
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
alter TABLE t2 ADD INDEX vk(fld3, fld1), ALGORITHM= COPY;
UPDATE t1 SET fld1= 3;
SELECT fld3, fld1 FROM t2;
DROP TABLE t2, t1;
--echo # Cascading UPDATEs and DELETEs for the multiple
--echo # fk dependent TABLEs
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld1), KEY(fld2, fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld2, fld1),
FOREIGN KEY(fld1) REFERENCES t2(fld1) ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2(fld1) VALUES(1), (2);
INSERT INTO t3(fld1) VALUES(1), (2);
UPDATE t1 SET fld1= 4 WHERE fld1= 1;
SELECT fld2, fld1 FROM t2;
SELECT fld2, fld1 FROM t3;
DROP TABLE t3, t2, t1;
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1), KEY(fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1),
FOREIGN KEY(fld1) REFERENCES t2(fld1) ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, 1, DEFAULT), (2, 2, default);
INSERT INTO t3 VALUES(1, 1, DEFAULT), (2, 2, default);
UPDATE t1 SET fld1= 4 WHERE fld1= 1;
SELECT fld3, fld1 FROM t2;
SELECT fld3, fld1 FROM t3;
DROP TABLE t3, t2, t1;
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld1), KEY(fld2, fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE CASCADE);
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
KEY(fld2, fld1), FOREIGN KEY(fld1) REFERENCES t2(fld1)
ON DELETE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2(fld1) VALUES(1), (2);
INSERT INTO t3(fld1) VALUES(1), (2);
DELETE FROM t1 WHERE fld1= 1;
SELECT fld2, fld1 FROM t2;
SELECT fld2, fld1 FROM t3;
DROP TABLE t3, t2, t1;
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL,
KEY(fld3, fld1), KEY(fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON DELETE CASCADE);
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1),
FOREIGN KEY(fld1) REFERENCES t2(fld1)
ON DELETE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, 1, DEFAULT), (2, 2, default);
INSERT INTO t3 VALUES(1, 1, DEFAULT), (2, 2, default);
DELETE FROM t1 WHERE fld1= 1;
SELECT fld3, fld1 FROM t2;
SELECT fld3, fld1 FROM t3;
DROP TABLE t3, t2, t1;
--echo # RENAME TABLE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY(fld2, fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON DELETE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
RENAME TABLE t2 to t3;
DELETE FROM t1 WHERE fld1= 1;
SELECT fld2, fld1 FROM t3;
DROP TABLE t3, t1;
--echo # FOREIGN_KEY_CHECKS disabled DURING INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
SET foreign_key_checks = 0;
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM=INPLACE;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 3 WHERE fld1= 2;
SELECT fld2 FROM t2;
DROP TABLE t2, t1;
--echo # GENERATED COLUMN COMPUTATION FAILS when SQL_MODE
--echo # is set to ERROR_FOR_DIVISION_BY_ZERO
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (100/fld1) VIRTUAL,
KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
#--error ER_DIVISION_BY_ZERO
UPDATE t1 SET fld1= 0 WHERE fld1= 2;
SELECT fld2 FROM t2;
DROP TABLE t2, t1;
--echo # CHANGE SQL_MODE and try the ERROR_FOR_DIVISION_BY_ZERO
SET sql_mode = STRICT_ALL_TABLES;
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (100/fld1) VIRTUAL,
KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
UPDATE t1 SET fld1= 0 WHERE fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
SET sql_mode = default;
--echo # ADD FOREIGN CONSTRAINT USING COPY
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL, KEY(fld2));
ALTER TABLE t2 ADD FOREIGN KEY (fld1)
REFERENCES t1(fld1) ON UPDATE CASCADE,
ALGORITHM=copy;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # ADD FOREIGN CONSTRAINT USING INPLACE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL, KEY(fld2));
SET foreign_key_checks = 0;
ALTER TABLE t2 ADD FOREIGN KEY (fld1)
REFERENCES t1(fld1) ON UPDATE CASCADE,
ALGORITHM=inplace;
SET foreign_key_checks = 1;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # DROP FOREIGN CONSTRAINT USING COPY
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
CONSTRAINT fidx FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 DROP FOREIGN KEY fidx, ALGORITHM=COPY;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # DROP FOREIGN CONSTRAINT USING INPLACE
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
CONSTRAINT fidx FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
SET foreign_key_checks = 0;
ALTER TABLE t2 DROP FOREIGN KEY fidx, ALGORITHM=INPLACE;
SET foreign_key_checks = 1;
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # ADD VC INDEX and ADD FK IN SAME COPY ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 ADD INDEX(fld2), ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE, ALGORITHM=copy;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # ADD VC INDEX and ADD FK IN SAME INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
SET foreign_key_checks = 0;
ALTER TABLE t2 ADD INDEX(fld2), ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE, ALGORITHM=inplace;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # ADD VC INDEX and DROP FK IN SAME COPY ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 ADD INDEX(fld2), DROP FOREIGN KEY fidx, ALGORITHM=copy;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # ADD VC INDEX and DROP FK IN SAME INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
SET foreign_key_checks = 0;
ALTER TABLE t2 ADD INDEX(fld2), DROP FOREIGN KEY fidx, ALGORITHM=inplace;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # DROP VC INDEX and ADD FK IN SAME COPY ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY idx(fld2));
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 DROP INDEX idx, ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE, ALGORITHM=COPY;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # DROP VC INDEX and ADD FK IN SAME INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY idx(fld2));
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
SET foreign_key_checks = 0;
ALTER TABLE t2 DROP INDEX idx, ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE, ALGORITHM=INPLACE;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # DROP VC INDEX and DROP FK IN SAME COPY ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY idx(fld2),
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
ALTER TABLE t2 DROP KEY idx, DROP FOREIGN KEY fidx, ALGORITHM=COPY;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;
--echo # DROP VC INDEX and DROP FK IN SAME INPLACE ALTER
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY idx(fld2),
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE);
INSERT INTO t1 VALUES(1);
INSERT INTO t2 VALUES(1, DEFAULT);
SET foreign_key_checks = 0;
ALTER TABLE t2 DROP KEY idx, DROP FOREIGN KEY fidx, ALGORITHM=INPLACE;
SET foreign_key_checks = 1;
UPDATE t1 SET fld1= 2;
SELECT fld2 FROM t2;
SELECT * FROM t2;
DROP TABLE t2, t1;

View File

@@ -0,0 +1,42 @@
-- source include/have_innodb.inc
-- source include/not_embedded.inc
--echo #
--echo # Bug#22469130: FOREIGN KEY ON DELETE CASCADE NOT ALLOWED
--echo # WHEN A VIRTUAL INDEX EXISTS.
--echo # Add the VIRTUAL INDEX contains fk constraINT column
--echo # using INPLACE alter operatiON
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY) engine=innodb;
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
fld3 INT AS (fld2) VIRTUAL, KEY(fld1),
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE) engine=innodb;
INSERT INTO t1(fld1) VALUES(1);
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
--source include/restart_mysqld.inc
UPDATE t1 SET fld1= 2;
SELECT fld3, fld1 FROM t2;
alter TABLE t2 ADD INDEX vk(fld3, fld1), ALGORITHM=INPLACE;
UPDATE t1 SET fld1=3;
SELECT fld3, fld1 FROM t2;
DROP TABLE t2, t1;
--echo # TEMPORARY TABLE NAME and CHILD TABLE NAME are same
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY) engine=innodb;
CREATE TABLE t2(fld1 INT NOT NULL,
fld2 INT AS (fld1) VIRTUAL,
KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t1(fld1)
ON UPDATE CASCADE) engine=innodb;
INSERT INTO t1 VALUES(1), (2);
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
--source include/restart_mysqld.inc
CREATE TEMPORARY TABLE t2 (fld1 INT NOT NULL)ENGINE=INNODB;
UPDATE t1 SET fld1= 3 WHERE fld1= 2;
--connect(con1,localhost,root,,test)
SELECT fld2 FROM t2;
CHECK TABLE t2;
connection default;
disconnect con1;
DROP TABLE t2;
DROP TABLE t2, t1;

View File

@@ -0,0 +1,220 @@
--source include/have_innodb.inc
--echo #
--echo # Bug 21922176 - PREBUILT->SEARCH_TUPLE CREATED WITHOUT INCLUDING
--echo # THE NUMBER OF VIRTUAL COLUMNS
--echo #
CREATE TABLE t1 (a INT, a1 INT GENERATED ALWAYS AS (a) VIRTUAL, a2 INT
GENERATED ALWAYS AS (a) VIRTUAL, a3 INT GENERATED ALWAYS AS (a) VIRTUAL, a4
INT GENERATED ALWAYS AS (a) VIRTUAL, a5 INT GENERATED ALWAYS AS (a) VIRTUAL,
a6 INT GENERATED ALWAYS AS (a) VIRTUAL, a7 INT GENERATED ALWAYS AS (a)
VIRTUAL, a8 INT GENERATED ALWAYS AS (a) VIRTUAL, a9 INT GENERATED ALWAYS AS
(a) VIRTUAL, INDEX(a1, a2, a3, a4, a5, a6, a7, a8, a9)) ;
INSERT INTO t1(a) VALUES(10);
SELECT * FROM t1 WHERE a1=10 AND a2 = 10 AND a3 =10 AND a4 = 10 AND a5=10 AND
a6=10 AND a7=10 AND a8=10 AND a9=10;
DROP TABLE t1;
--echo #
--echo # Bug 22572997 - GCOL:INNODB: FAILING ASSERTION: N < REC_OFFS_N_FIELDS(
--echo # OFFSETS)
--echo #
SET @@SESSION.sql_mode=0;
CREATE TABLE t1(
c1 int(1)AUTO_INCREMENT,
c2 int(1),
c3 int(1)GENERATED ALWAYS AS ((c2 + c2)) VIRTUAL,
c4 int(1)GENERATED ALWAYS AS ((c3 + c2)) VIRTUAL,
c5 date,
c6 date GENERATED ALWAYS AS((c5 + interval 30 day)) VIRTUAL,
c7 DATE,
c8 time,
c9 DATE GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c10 time GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c11 DATE GENERATED ALWAYS AS(addtime(c9,c8)) VIRTUAL,
c12 CHAR(1),
c13 CHAR(1)GENERATED ALWAYS AS (concat(c12,c12)) VIRTUAL,
c14 CHAR(2)GENERATED ALWAYS AS (concat(c13,'x')) VIRTUAL,
PRIMARY KEY(c1),
KEY c4_6(c4,c11)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE t2(
c1 int(1)AUTO_INCREMENT,
c2 int(1),
c3 int(1)GENERATED ALWAYS AS ((c2 + c2)) VIRTUAL,
c4 int(1)GENERATED ALWAYS AS ((c3 + c2)) VIRTUAL,
c5 date,
c6 date GENERATED ALWAYS AS((c5 + interval 30 day)) VIRTUAL,
c6a date GENERATED ALWAYS AS((c6 + interval 30 day)) VIRTUAL,
c7 DATE,
c8 time,
c9 DATE GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c10 time GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c11 DATE GENERATED ALWAYS AS(addtime(c9,c8)) VIRTUAL,
c11a time GENERATED ALWAYS AS(addtime(c7,c10)) VIRTUAL,
c12 CHAR(1),
c13 CHAR(2)GENERATED ALWAYS AS (concat(c12,c12)) VIRTUAL,
c14 CHAR(4)GENERATED ALWAYS AS (concat(c13,'x')) VIRTUAL,
PRIMARY KEY(c1),
KEY c13(c13),
KEY c4_6(c4,c11)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO t2(c1,c2,c5,c7,c8,c12)VALUES (0,0,0,0,0,'v');
CREATE TABLE t3(
c1 int(1)AUTO_INCREMENT,
c2 int(1),
c3 int(1)GENERATED ALWAYS AS ((c2 + c2)) VIRTUAL,
c4 int(1)GENERATED ALWAYS AS ((c3 + c2)) VIRTUAL,
c5 date,
c7 DATE,
c8 time,
c9 DATE GENERATED ALWAYS AS(addtime(c7,c8)) VIRTUAL,
c11 DATE GENERATED ALWAYS AS(addtime(c9,c8)) VIRTUAL,
c12 CHAR(1),
PRIMARY KEY(c1),
KEY c4_6(c4,c11)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO t3(c1,c2,c5,c7,c8,c12)VALUES
(0,0,0,0,0,'q'),(0,0,0,0,0,'g'),(0,0,0,0,0,'l'),(0,0,0,0,0,1),(0,0,0,0,0,'v'),
(0,1,0,0,0,'c'),(0,0,0,0,0,'x');
UPDATE
t2 AS O1,t3 AS O2
SET O1.c12=1
WHERE O1.c14 NOT IN
(
SELECT
DISTINCT I1.c14 AS y
FROM t1 AS I1
ORDER BY I1.c14);
SET @@SESSION.sql_mode=default;
DROP TABLE t1, t2, t3;
--echo #
--echo # Bug 22650296 - ASSERTION IN INNOBASE_BUILD_COL_MAP, ALTER
--echo #
CREATE TABLE `ibstd_08` (
`nc00577` tinyint(4) DEFAULT NULL,
`nc07844` varchar(41) DEFAULT NULL,
`gc01908` point NOT NULL,
`nc04156` char(17) DEFAULT NULL,
`nc09536` longblob NOT NULL,
`nc09231` decimal(10,0) NOT NULL,
`a` int(11) NOT NULL,
`b` varchar(198) NOT NULL,
`nc04560` mediumtext,
`c` char(187) DEFAULT NULL,
`vbidxcol` char(3) GENERATED ALWAYS AS (substr(`b`,1,3)) VIRTUAL,
`gc00881` polygon NOT NULL,
`nc05121` int(11) NOT NULL DEFAULT '85941481',
KEY `a` (`a`),
KEY `b` (`b`(3),`a`),
KEY `c` (`c`(99),`b`(25)),
KEY `b_2` (`b`(5),`c`(10),`a`),
KEY `vbidxcol` (`vbidxcol`),
KEY `a_2` (`a`,`vbidxcol`),
KEY `vbidxcol_2` (`vbidxcol`),
FULLTEXT KEY `ftsic` (`c`,`b`)
) ENGINE=InnoDB;
ALTER TABLE ibstd_08 ADD COLUMN nc07006 BIGINT AUTO_INCREMENT NOT NULL , ADD KEY auto_nc07006(nc07006);
DROP TABLE ibstd_08;
--echo #
--echo # Bug 22899305 - GCOLS: FAILING ASSERTION: !(COL->PRTYPE & 256)
--echo # AND SEGFAULT
--echo #
set sql_mode="";
create table t (a int) engine=innodb;
create table s (
b int generated always as (1) virtual,
c int,
d int generated always as (1) virtual,
key (d)
) engine=innodb;
insert into t(a) values ((select d from s for update));
insert into s(c) values ('');
SET sql_mode = default;
drop table if exists t,s;
--echo #
--echo # Bug 23014521 - GCOL:INNODB: FAILING ASSERTION: !IS_V
--echo #
CREATE TABLE t1 (
col1 int(11) NOT NULL,
col2 int(11) DEFAULT NULL,
col3 int(11) NOT NULL,
col4 int(11) DEFAULT NULL,
col5 int(11) GENERATED ALWAYS AS ((col1 % col4)) VIRTUAL,
col6 int(11) GENERATED ALWAYS AS ((col2 - col4)) VIRTUAL,
col5x int(11) GENERATED ALWAYS AS ((col3 / col2)) VIRTUAL,
col6b varchar(20) GENERATED ALWAYS AS (col2) VIRTUAL,
col6x int(11) GENERATED ALWAYS AS ((col2 % col1)) VIRTUAL,
col7 int(11) GENERATED ALWAYS AS ((col6x + col5x)) VIRTUAL,
col8 int(11) GENERATED ALWAYS AS ((col5x / col5)) VIRTUAL,
col7x int(11) GENERATED ALWAYS AS ((col5x + col5)) VIRTUAL,
col8x int(11) GENERATED ALWAYS AS ((col5 / col5x)) VIRTUAL,
col9 text,
col2b varchar(20) GENERATED ALWAYS AS (col4) VIRTUAL,
col8a int(11) GENERATED ALWAYS AS (col2) VIRTUAL,
col4b varchar(20) GENERATED ALWAYS AS (col4) VIRTUAL,
col1c int(11) GENERATED ALWAYS AS ((col2 * col1)) VIRTUAL,
extra int(11) DEFAULT NULL,
col5c int(11) GENERATED ALWAYS AS ((col1 / col1)) VIRTUAL,
col6a bigint(20) GENERATED ALWAYS AS ((col3 / col1)) VIRTUAL,
col1a varchar(20) GENERATED ALWAYS AS (col6) VIRTUAL,
col6c int(11) GENERATED ALWAYS AS ((col2 % col2)) VIRTUAL,
col7c bigint(20) GENERATED ALWAYS AS ((col2 / col1)) VIRTUAL,
col2c int(11) GENERATED ALWAYS AS ((col5 % col5)) VIRTUAL,
col1b int(11) GENERATED ALWAYS AS ((col1 / col2)) VIRTUAL,
col3b bigint(20) GENERATED ALWAYS AS ((col6x % col6)) VIRTUAL,
UNIQUE KEY idx7 (col1,col3,col2),
UNIQUE KEY uidx (col9(10)),
KEY idx15 (col9(10) DESC,col2 DESC),
KEY idx10 (col9(10) DESC,col1 DESC),
KEY idx11 (col6x DESC),
KEY idx6 (col9(10) DESC,col7 DESC),
KEY idx14 (col6 DESC)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
# Cannot add virtual column along with create FULLTEXT index with
# adding a hidden FTS_DOC_ID column (which require a table rebuild)
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE t1 ADD COLUMN col7a INT GENERATED ALWAYS AS (col5x % col6x)
VIRTUAL, ADD FULLTEXT KEY ftidx ( col9 ), algorithm=inplace;
# This will add a hidden FTS_DOC_ID column
CREATE FULLTEXT INDEX idx ON t1(col9);
# Since there is no table rebuild needed, now the alter would be sucessful
ALTER TABLE t1 ADD COLUMN col7a INT GENERATED ALWAYS AS (col5x % col6x)
VIRTUAL, ADD FULLTEXT KEY ftidx ( col9 ), algorithm=inplace;
DROP TABLE t1;
CREATE TABLE t1 (
col1 int(11) NOT NULL,
col2 int(11) DEFAULT NULL,
col3 int(11) NOT NULL,
col4 int(11) DEFAULT NULL) engine=innodb;
# This secondary key idx will be coverted to a new Primary Key, thus a table
# rebuild. It is blocked since there is an adding of virtual columns
--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE t1 ADD COLUMN col7a INT GENERATED ALWAYS AS (col1 % col2)
VIRTUAL, ADD UNIQUE index idx (col1), algorithm=inplace;
DROP TABLE t1;

View File

@@ -0,0 +1,138 @@
--source include/have_innodb.inc
--source include/count_sessions.inc
--echo #
--echo # Bug#21869656 UNDO LOG DOES NOT CONTAIN ENOUGH INFORMATION
--echo # ON INDEXED VIRTUAL COLUMNS
--echo #
CREATE TABLE t1 (a INT, b INT,
a1 INT GENERATED ALWAYS AS (a) VIRTUAL, INDEX(a1)
) ENGINE=InnoDB;
INSERT INTO t1 (a,b) VALUES(1,1);
connect (con1,localhost,root,,);
# disable purge
CREATE TABLE t0 (a INT) ENGINE=InnoDB;
BEGIN; SELECT * FROM t0;
connection default;
# write the problematic update_undo log record
UPDATE t1 SET a=0;
ALTER TABLE t1 DROP COLUMN a1, ALGORITHM=INPLACE;
ALTER TABLE t1 ADD COLUMN b1 INT GENERATED ALWAYS AS (b) VIRTUAL, ADD
INDEX(b1),
ALGORITHM=INPLACE;
connection con1;
# enable purge
COMMIT;
UPDATE t1 SET a=1;
connection default;
# wait for purge to process the update_undo record.
--source include/wait_innodb_all_purged.inc
CHECK TABLE t1;
SELECT b1 FROM t1;
# Create multi-virtual column, more ADD/DROP to test it
ALTER TABLE t1
ADD COLUMN a1 INT GENERATED ALWAYS AS (a) VIRTUAL,
ADD COLUMN a2 INT GENERATED ALWAYS AS (a + b) VIRTUAL,
ADD COLUMN a3 INT GENERATED ALWAYS AS (a - b) VIRTUAL,
ADD COLUMN a4 INT GENERATED ALWAYS AS (a - b) VIRTUAL,
ADD INDEX(a1), ADD INDEX(a2), ADD INDEX(a3), ALGORITHM=INPLACE;
CREATE TABLE t2 (
a BLOB,
b BLOB,
c BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
h VARCHAR(10) DEFAULT NULL
) ENGINE=InnoDB;
INSERT INTO t2 VALUES (REPEAT('g', 16000), REPEAT('x', 16000), DEFAULT, 'kk');
INSERT INTO t2 VALUES (REPEAT('a', 16000), REPEAT('b', 16000), DEFAULT, 'mm');
CREATE INDEX idx ON t2(c(100));
INSERT INTO t1 (a, b) VALUES(1,1);
connection con1;
# disable purge
BEGIN; SELECT * FROM t0;
connection default;
--enable_info
# write the problematic update_undo log record
UPDATE t1 SET a=0;
UPDATE t1 SET b=0;
ALTER TABLE t1 DROP COLUMN a3, ALGORITHM=INPLACE;
UPDATE t1 SET a=2;
ALTER TABLE t1 DROP COLUMN a2, ALGORITHM=INPLACE;
UPDATE t1 SET b=3;
ALTER TABLE t1 ADD COLUMN b2 INT GENERATED ALWAYS AS (b) VIRTUAL,
ADD INDEX(b2), ALGORITHM=INPLACE;
UPDATE t1 SET b=9;
ALTER TABLE t1 ADD COLUMN b3 INT GENERATED ALWAYS AS (a) VIRTUAL,
ADD INDEX(b3), ALGORITHM=INPLACE;
UPDATE t1 SET b=10;
ALTER TABLE t2 DROP COLUMN c;
UPDATE t2 SET a = REPEAT('s', 6000) WHERE a like 'aaa%';
ALTER TABLE t2 ADD COLUMN x1 BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
ADD COLUMN x2 BLOB GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL,
ADD INDEX(x1(100), x2(120)), ADD INDEX (x1(20));
UPDATE t1 SET a=5;
UPDATE t2 SET a = REPEAT('m', 16000) WHERE a like 'sss%';
ALTER TABLE t1 DROP COLUMN b2, ALGORITHM=INPLACE;
UPDATE t1 SET a=6;
ALTER TABLE t2 DROP COLUMN x1, DROP COLUMN x2, ALGORITHM=INPLACE;
UPDATE t2 SET a = REPEAT('x', 1000) WHERE a like 'mmm%';
ALTER TABLE t1 DROP INDEX b3;
UPDATE t1 SET a=100;
--disable_info
connection con1;
# enable purge
COMMIT;
disconnect con1;
connection default;
# wait for purge to process the update_undo record.
--source include/wait_innodb_all_purged.inc
CHECK TABLE t1;
SELECT b1 FROM t1;
SELECT * FROM t1;
CHECK TABLE t2;
DROP TABLE t2, t1, t0;
CREATE TABLE t1 (a VARCHAR(30), b INT, a2 VARCHAR(30) GENERATED ALWAYS AS (a) VIRTUAL);
--error ER_DUP_FIELDNAME
CREATE INDEX idx ON t1(a2(10), b, a2(20));
DROP TABLE t1;
--source include/wait_until_count_sessions.inc

View File

@@ -0,0 +1,42 @@
--source include/have_innodb.inc
# Test alter table add column
CREATE TABLE t_8114 (a int) ENGINE = INNODB;
ALTER TABLE t_8114 ADD b INT GENERATED ALWAYS AS (a) VIRTUAL;
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114";
SELECT NAME, POS, MTYPE, PRTYPE, LEN FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS WHERE TABLE_ID IN (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114");
INSERT INTO t_8114 VALUES (9, default);
INSERT INTO t_8114 VALUES (3, default);
INSERT INTO t_8114 VALUES (1, default);
INSERT INTO t_8114 VALUES (5, default);
SELECT * FROM t_8114;
DROP TABLE t_8114;
CREATE TABLE t_8114 (Column_1 CHAR(5) GENERATED ALWAYS AS (PI()+5), Column_2 CHAR(5)) engine=innodb;
SELECT NAME, FLAG, N_COLS FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114";
SELECT NAME, POS, MTYPE, PRTYPE, LEN FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS WHERE TABLE_ID IN (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114");
INSERT INTO t_8114 VALUES (default, "aa");
INSERT INTO t_8114 VALUES (default, "bb");
INSERT INTO t_8114 VALUES (default, "ee");
INSERT INTO t_8114 VALUES (default, "pp");
SELECT * FROM t_8114;
ALTER TABLE t_8114 DROP Column_1;
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114";
SELECT NAME, POS, MTYPE, PRTYPE, LEN FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS WHERE TABLE_ID IN (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "%t_8114");
SELECT * FROM t_8114;
DROP TABLE t_8114;

View File

@@ -0,0 +1,50 @@
--source include/have_innodb.inc
--echo #
--echo # Bug#22017616: ASSERTION FAILED: TABLE_SHARE->IS_MISSING_PRIMARY_KEY()
--echo # == M_PREBUILT->CLUST_IND
--echo #
--echo # Ensure that adding indexes with virtual columns are not promoted to
--echo # primary keys
--echo #
--echo # Base line with normal column - should be promoted
CREATE TABLE t0(a INT NOT NULL) ENGINE=INNODB;
ALTER TABLE t0 ADD UNIQUE INDEX (a);
--echo # Case a: Create table with virtual unique not null column
CREATE TABLE t1(a POINT GENERATED ALWAYS AS (POINT(1,1)) VIRTUAL UNIQUE) ENGINE=INNODB;
SELECT * FROM t1;
--echo # Case b: Create table with index on virtual point column
CREATE TABLE t2(a POINT GENERATED ALWAYS AS (POINT(1,1)) VIRTUAL, UNIQUE INDEX no_pk(a(1))) ENGINE=INNODB;
SELECT * FROM t2;
--echo # Case c: Add unique index on virtual point column
CREATE TABLE t3(a POINT GENERATED ALWAYS AS (POINT(1,1)) VIRTUAL)
ENGINE=INNODB;
ALTER TABLE t3 ADD UNIQUE INDEX (a(1));
SELECT * FROM t3;
--echo # Case d: Add unique index on virtual blob column
CREATE TABLE t4 (a BLOB, b BLOB GENERATED ALWAYS AS (a) VIRTUAL) ENGINE=INNODB;
ALTER TABLE t4 ADD UNIQUE INDEX (b(1));
SELECT * FROM t4;
--echo # Query I_S to verify that 'a' is promoted to pk only when it
--echo # isn't virtual
SELECT T.NAME AS TABLE_NAME, I.NAME AS INDEX_NAME,
CASE (I.TYPE & 3)
WHEN 3 THEN "yes"
ELSE "no" END AS IS_PRIMARY_KEY,
F.NAME AS FIELD_NAME, F.POS AS FIELD_POS FROM
INFORMATION_SCHEMA.INNODB_SYS_TABLES AS T JOIN
INFORMATION_SCHEMA.INNODB_SYS_INDEXES AS I JOIN
INFORMATION_SCHEMA.INNODB_SYS_FIELDS AS F
ON I.INDEX_ID = F.INDEX_ID AND I.TABLE_ID = T.TABLE_ID
WHERE T.NAME LIKE 'test/%';
DROP TABLE t0;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE t4;

View File

@@ -0,0 +1,44 @@
--source include/have_innodb.inc
--source include/not_embedded.inc
CREATE DATABASE dump_generated;
USE dump_generated;
CREATE TABLE t1 (pk INTEGER, a INTEGER, b INTEGER, c VARCHAR(16),
sum INTEGER GENERATED ALWAYS AS (a+b),
sub VARCHAR(4) GENERATED ALWAYS AS (SUBSTRING(c, 1, 4)),
key k1(sum),
key k2(sub)
) engine=innodb;
INSERT INTO t1(pk, a, b, c) VALUES (1, 11, 12, 'oneone'), (2, 21, 22, 'twotwo');
SELECT * FROM t1;
--exec $MYSQL_DUMP dump_generated t1 > $MYSQLTEST_VARDIR/tmp/t1.sql
DELETE FROM t1;
--exec $MYSQL dump_generated < $MYSQLTEST_VARDIR/tmp/t1.sql
SELECT * FROM t1;
--exec $MYSQL_DUMP dump_generated t1 --tab=$MYSQLTEST_VARDIR/tmp/
DELETE FROM t1;
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.txt' INTO TABLE t1
SELECT * FROM t1;
DROP TABLE t1;
--echo # A table with regular columns after generated
CREATE TABLE t2 (pk INTEGER, a INTEGER, b INTEGER,
sum INTEGER GENERATED ALWAYS AS (a+b),
c VARCHAR(16),
key k1(sum)
) engine=innodb;
INSERT INTO t2(pk, a, b, c) VALUES (1, 11, 12, 'oneone'), (2, 21, 22, 'twotwo');
SELECT * FROM t2;
--exec $MYSQL_DUMP dump_generated t2 > $MYSQLTEST_VARDIR/tmp/t2.sql
DELETE FROM t2;
--exec $MYSQL dump_generated < $MYSQLTEST_VARDIR/tmp/t2.sql
SELECT * FROM t2;
--exec $MYSQL_DUMP dump_generated t2 --tab=$MYSQLTEST_VARDIR/tmp/
DELETE FROM t2;
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t2.txt' INTO TABLE t2
SELECT * FROM t2;
DROP TABLE t2;
DROP DATABASE dump_generated;

View File

@@ -14,17 +14,17 @@ innodb_file_per_table ON
drop database if exists mysqltest;
create database mysqltest;
CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB;
select count(*) from information_schema.processlist;
select count(*) from information_schema.processlist where command != 'Daemon';
count(*)
33
connection default;
CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB;
ERROR HY000: Can't create table `mysqltest`.`testtable` (errno: 177 "Too many active concurrent transactions")
select count(*) from information_schema.processlist;
select count(*) from information_schema.processlist where command != 'Daemon';
count(*)
33
connection default;
select count(*) from information_schema.processlist;
select count(*) from information_schema.processlist where command != 'Daemon';
count(*)
33
drop database mysqltest;

View File

@@ -59,7 +59,7 @@ while ($c)
}
--enable_query_log
select count(*) from information_schema.processlist;
select count(*) from information_schema.processlist where command != 'Daemon';
#
# fill the all undo slots
@@ -80,7 +80,7 @@ connection default;
--error ER_CANT_CREATE_TABLE
CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB;
select count(*) from information_schema.processlist;
select count(*) from information_schema.processlist where command != 'Daemon';
--disable_query_log
let $c = 32;
@@ -93,7 +93,7 @@ while ($c)
--enable_query_log
connection default;
select count(*) from information_schema.processlist;
select count(*) from information_schema.processlist where command != 'Daemon';
--disable_query_log
let $c = 32;

View File

@@ -15,3 +15,4 @@ thread/innodb/srv_lock_timeout_thread BACKGROUND NULL NULL NULL NULL NULL NULL N
thread/innodb/srv_master_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES
thread/innodb/srv_monitor_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES
thread/innodb/srv_purge_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES
thread/innodb/thd_destructor_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL 1 NULL YES

View File

@@ -7,7 +7,7 @@ SET @@session.storage_engine = 'InnoDB';
# - CHECK (allowed but not used)
# UNIQUE
create table t1 (a int, b int as (a*2) unique);
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
drop table t1;
create table t1 (a int, b int as (a*2) persistent unique);
show create table t1;
Table Create Table
@@ -22,7 +22,7 @@ a int(11) YES NULL
b int(11) YES UNI NULL PERSISTENT
drop table t1;
create table t1 (a int, b int as (a*2), unique key (b));
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
drop table t1;
create table t1 (a int, b int as (a*2) persistent, unique (b));
show create table t1;
Table Create Table
@@ -38,7 +38,6 @@ b int(11) YES UNI NULL PERSISTENT
drop table t1;
create table t1 (a int, b int as (a*2));
alter table t1 add unique key (b);
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
drop table t1;
create table t1 (a int, b int as (a*2) persistent);
alter table t1 add unique key (b);
@@ -50,9 +49,9 @@ drop table t1;
#
# INDEX
create table t1 (a int, b int as (a*2), index (b));
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
drop table t1;
create table t1 (a int, b int as (a*2), index (a,b));
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
drop table t1;
create table t1 (a int, b int as (a*2) persistent, index (b));
show create table t1;
Table Create Table
@@ -81,9 +80,7 @@ b int(11) YES NULL PERSISTENT
drop table t1;
create table t1 (a int, b int as (a*2));
alter table t1 add index (b);
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
alter table t1 add index (a,b);
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
drop table t1;
create table t1 (a int, b int as (a*2) persistent);
alter table t1 add index (b);
@@ -125,12 +122,11 @@ ERROR HY000: Cannot define foreign key with ON UPDATE CASCADE clause on a comput
alter table t1 add foreign key (b) references t2(a) on delete set null;
ERROR HY000: Cannot define foreign key with ON DELETE SET NULL clause on a computed column
drop table t1;
create table t1 (a int, b int as (a+1),
foreign key (b) references t2(a));
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
create table t1 (a int, b int as (a+1), foreign key (b) references t2(a));
ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
create table t1 (a int, b int as (a+1));
alter table t1 add foreign key (b) references t2(a);
ERROR HY000: Key/Index cannot be defined on a non-stored computed column
ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 150 "Foreign key constraint is incorrectly formed")
drop table t1;
# Allowed FK options.
create table t2 (a int primary key, b char(5));

View File

@@ -41,6 +41,7 @@ SET @@session.storage_engine = 'InnoDB';
#------------------------------------------------------------------------------#
# Execute the tests to be applied to all storage engines
let $with_foreign_keys = 1;
--source suite/vcol/inc/vcol_keys.inc
#------------------------------------------------------------------------------#

View File

@@ -4242,6 +4242,7 @@ handler::check_if_supported_inplace_alter(TABLE *altered_table,
Alter_inplace_info::ALTER_COLUMN_OPTION |
Alter_inplace_info::CHANGE_CREATE_OPTION |
Alter_inplace_info::ALTER_PARTITIONED |
Alter_inplace_info::ALTER_VIRTUAL_GCOL_EXPR |
Alter_inplace_info::ALTER_RENAME;
/* Is there at least one operation that requires copy algorithm? */

View File

@@ -1838,34 +1838,50 @@ public:
typedef ulonglong HA_ALTER_FLAGS;
// Add non-unique, non-primary index
static const HA_ALTER_FLAGS ADD_INDEX = 1L << 0;
static const HA_ALTER_FLAGS ADD_INDEX = 1ULL << 0;
//
// Adds a spatial index. At the moment all engines treat it
// identically to the ADD_INDEX, so it gets the same code
static const HA_ALTER_FLAGS ADD_SPATIAL_INDEX = ADD_INDEX;
// Drop non-unique, non-primary index
static const HA_ALTER_FLAGS DROP_INDEX = 1L << 1;
static const HA_ALTER_FLAGS DROP_INDEX = 1ULL << 1;
// Add unique, non-primary index
static const HA_ALTER_FLAGS ADD_UNIQUE_INDEX = 1L << 2;
static const HA_ALTER_FLAGS ADD_UNIQUE_INDEX = 1ULL << 2;
// Drop unique, non-primary index
static const HA_ALTER_FLAGS DROP_UNIQUE_INDEX = 1L << 3;
static const HA_ALTER_FLAGS DROP_UNIQUE_INDEX = 1ULL << 3;
// Add primary index
static const HA_ALTER_FLAGS ADD_PK_INDEX = 1L << 4;
static const HA_ALTER_FLAGS ADD_PK_INDEX = 1ULL << 4;
// Drop primary index
static const HA_ALTER_FLAGS DROP_PK_INDEX = 1L << 5;
static const HA_ALTER_FLAGS DROP_PK_INDEX = 1ULL << 5;
// Add column
static const HA_ALTER_FLAGS ADD_COLUMN = 1L << 6;
// Virtual generated column
static const HA_ALTER_FLAGS ADD_VIRTUAL_COLUMN = 1ULL << 6;
// Stored base (non-generated) column
static const HA_ALTER_FLAGS ADD_STORED_BASE_COLUMN = 1ULL << 7;
// Stored generated column
static const HA_ALTER_FLAGS ADD_STORED_GENERATED_COLUMN= 1ULL << 8;
// Add generic column (convience constant).
static const HA_ALTER_FLAGS ADD_COLUMN= ADD_VIRTUAL_COLUMN |
ADD_STORED_BASE_COLUMN |
ADD_STORED_GENERATED_COLUMN;
// Drop column
static const HA_ALTER_FLAGS DROP_COLUMN = 1L << 7;
static const HA_ALTER_FLAGS DROP_VIRTUAL_COLUMN = 1ULL << 9;
static const HA_ALTER_FLAGS DROP_STORED_COLUMN = 1ULL << 10;
static const HA_ALTER_FLAGS DROP_COLUMN= DROP_VIRTUAL_COLUMN |
DROP_STORED_COLUMN;
// Rename column
static const HA_ALTER_FLAGS ALTER_COLUMN_NAME = 1L << 8;
static const HA_ALTER_FLAGS ALTER_COLUMN_NAME = 1ULL << 11;
// Change column datatype
static const HA_ALTER_FLAGS ALTER_COLUMN_TYPE = 1L << 9;
static const HA_ALTER_FLAGS ALTER_VIRTUAL_COLUMN_TYPE = 1ULL << 12;
static const HA_ALTER_FLAGS ALTER_STORED_COLUMN_TYPE = 1ULL << 13;
/**
Change column datatype in such way that new type has compatible
@@ -1873,83 +1889,94 @@ public:
possible to perform change by only updating data dictionary
without changing table rows.
*/
static const HA_ALTER_FLAGS ALTER_COLUMN_EQUAL_PACK_LENGTH = 1L << 10;
static const HA_ALTER_FLAGS ALTER_COLUMN_EQUAL_PACK_LENGTH = 1ULL << 14;
// Reorder column
static const HA_ALTER_FLAGS ALTER_COLUMN_ORDER = 1L << 11;
static const HA_ALTER_FLAGS ALTER_STORED_COLUMN_ORDER = 1ULL << 15;
// Reorder column
static const HA_ALTER_FLAGS ALTER_VIRTUAL_COLUMN_ORDER = 1ULL << 16;
// Change column from NOT NULL to NULL
static const HA_ALTER_FLAGS ALTER_COLUMN_NULLABLE = 1L << 12;
static const HA_ALTER_FLAGS ALTER_COLUMN_NULLABLE = 1ULL << 17;
// Change column from NULL to NOT NULL
static const HA_ALTER_FLAGS ALTER_COLUMN_NOT_NULLABLE = 1L << 13;
static const HA_ALTER_FLAGS ALTER_COLUMN_NOT_NULLABLE = 1ULL << 18;
// Set or remove default column value
static const HA_ALTER_FLAGS ALTER_COLUMN_DEFAULT = 1L << 14;
static const HA_ALTER_FLAGS ALTER_COLUMN_DEFAULT = 1ULL << 19;
// Change column generation expression
static const HA_ALTER_FLAGS ALTER_VIRTUAL_GCOL_EXPR = 1ULL << 20;
static const HA_ALTER_FLAGS ALTER_STORED_GCOL_EXPR = 1ULL << 21;
//
// Add foreign key
static const HA_ALTER_FLAGS ADD_FOREIGN_KEY = 1L << 15;
static const HA_ALTER_FLAGS ADD_FOREIGN_KEY = 1ULL << 22;
// Drop foreign key
static const HA_ALTER_FLAGS DROP_FOREIGN_KEY = 1L << 16;
static const HA_ALTER_FLAGS DROP_FOREIGN_KEY = 1ULL << 23;
// table_options changed, see HA_CREATE_INFO::used_fields for details.
static const HA_ALTER_FLAGS CHANGE_CREATE_OPTION = 1L << 17;
static const HA_ALTER_FLAGS CHANGE_CREATE_OPTION = 1ULL << 24;
// Table is renamed
static const HA_ALTER_FLAGS ALTER_RENAME = 1L << 18;
static const HA_ALTER_FLAGS ALTER_RENAME = 1ULL << 25;
// column's engine options changed, something in field->option_struct
static const HA_ALTER_FLAGS ALTER_COLUMN_OPTION = 1L << 19;
static const HA_ALTER_FLAGS ALTER_COLUMN_OPTION = 1ULL << 26;
// MySQL alias for the same thing:
static const HA_ALTER_FLAGS ALTER_COLUMN_STORAGE_TYPE = 1L << 19;
static const HA_ALTER_FLAGS ALTER_COLUMN_STORAGE_TYPE = 1ULL << 26;
// Change the column format of column
static const HA_ALTER_FLAGS ALTER_COLUMN_COLUMN_FORMAT = 1L << 20;
static const HA_ALTER_FLAGS ALTER_COLUMN_COLUMN_FORMAT = 1ULL << 27;
// Add partition
static const HA_ALTER_FLAGS ADD_PARTITION = 1L << 21;
static const HA_ALTER_FLAGS ADD_PARTITION = 1ULL << 28;
// Drop partition
static const HA_ALTER_FLAGS DROP_PARTITION = 1L << 22;
static const HA_ALTER_FLAGS DROP_PARTITION = 1ULL << 29;
// Changing partition options
static const HA_ALTER_FLAGS ALTER_PARTITION = 1L << 23;
static const HA_ALTER_FLAGS ALTER_PARTITION = 1ULL << 30;
// Coalesce partition
static const HA_ALTER_FLAGS COALESCE_PARTITION = 1L << 24;
static const HA_ALTER_FLAGS COALESCE_PARTITION = 1ULL << 31;
// Reorganize partition ... into
static const HA_ALTER_FLAGS REORGANIZE_PARTITION = 1L << 25;
static const HA_ALTER_FLAGS REORGANIZE_PARTITION = 1ULL << 32;
// Reorganize partition
static const HA_ALTER_FLAGS ALTER_TABLE_REORG = 1L << 26;
static const HA_ALTER_FLAGS ALTER_TABLE_REORG = 1ULL << 33;
// Remove partitioning
static const HA_ALTER_FLAGS ALTER_REMOVE_PARTITIONING = 1L << 27;
static const HA_ALTER_FLAGS ALTER_REMOVE_PARTITIONING = 1ULL << 34;
// Partition operation with ALL keyword
static const HA_ALTER_FLAGS ALTER_ALL_PARTITION = 1L << 28;
static const HA_ALTER_FLAGS ALTER_ALL_PARTITION = 1ULL << 35;
/**
Recreate the table for ALTER TABLE FORCE, ALTER TABLE ENGINE
and OPTIMIZE TABLE operations.
*/
static const HA_ALTER_FLAGS RECREATE_TABLE = 1L << 29;
static const HA_ALTER_FLAGS RECREATE_TABLE = 1ULL << 36;
// Virtual columns changed
static const HA_ALTER_FLAGS ALTER_COLUMN_VCOL = 1L << 30;
/**
Changes in generated columns that affect storage,
for example, when a vcol type or expression changes
and this vcol is indexed or used in a partitioning expression
*/
static const HA_ALTER_FLAGS ALTER_COLUMN_VCOL = 1ULL << 37;
/**
ALTER TABLE for a partitioned table. The engine needs to commit
online alter of all partitions atomically (using group_commit_ctx)
*/
static const HA_ALTER_FLAGS ALTER_PARTITIONED = 1L << 31;
static const HA_ALTER_FLAGS ALTER_PARTITIONED = 1ULL << 38;
static const HA_ALTER_FLAGS ALTER_ADD_CHECK_CONSTRAINT = 1LL << 32;
static const HA_ALTER_FLAGS ALTER_ADD_CHECK_CONSTRAINT = 1ULL << 39;
static const HA_ALTER_FLAGS ALTER_DROP_CHECK_CONSTRAINT= 1LL << 33;
static const HA_ALTER_FLAGS ALTER_DROP_CHECK_CONSTRAINT= 1ULL << 40;
/**
Create options (like MAX_ROWS) for the new version of table.

View File

@@ -4383,6 +4383,93 @@ extern "C" int thd_is_connected(MYSQL_THD thd)
#ifdef INNODB_COMPATIBILITY_HOOKS
/** open a table and add it to thd->open_tables
@note At the moment this is used in innodb background purge threads
*only*.There should be no table locks, because the background purge does not
change the table as far as LOCK TABLES is concerned. MDL locks are
still needed, though.
To make sure no table stays open for long, this helper allows the thread to
have only one table open at any given time.
*/
TABLE *open_purge_table(THD *thd, const char *db, size_t dblen,
const char *tb, size_t tblen)
{
DBUG_ENTER("open_purge_table");
DBUG_ASSERT(thd->open_tables == NULL);
DBUG_ASSERT(thd->locked_tables_mode < LTM_PRELOCKED);
Open_table_context ot_ctx(thd, 0);
TABLE_LIST *tl= (TABLE_LIST*)thd->alloc(sizeof(TABLE_LIST));
tl->init_one_table(db, dblen, tb, tblen, tb, TL_READ);
tl->i_s_requested_object= OPEN_TABLE_ONLY;
bool error= open_table(thd, tl, &ot_ctx);
/* we don't recover here */
DBUG_ASSERT(!error || !ot_ctx.can_recover_from_failed_open());
if (error)
close_thread_tables(thd);
DBUG_RETURN(error ? NULL : tl->table);
}
/** Find an open table in the list of prelocked tabled
Used for foreign key actions, for example, in UPDATE t1 SET a=1;
where a child table t2 has a KB on t1.a.
But only when virtual columns are involved, otherwise InnoDB
does not need an open TABLE.
*/
TABLE *find_fk_open_table(THD *thd, const char *db, size_t db_len,
const char *table, size_t table_len)
{
for (TABLE *t= thd->open_tables; t; t= t->next)
{
if (t->s->db.length == db_len && t->s->table_name.length == table_len &&
!strcmp(t->s->db.str, db) && !strcmp(t->s->table_name.str, table) &&
t->pos_in_table_list->prelocking_placeholder == TABLE_LIST::FK)
return t;
}
return NULL;
}
/* the following three functions are used in background purge threads */
MYSQL_THD create_thd()
{
THD *thd= new THD(next_thread_id());
thd->thread_stack= (char*) &thd;
thd->store_globals();
thd->set_command(COM_DAEMON);
thd->system_thread= SYSTEM_THREAD_GENERIC;
add_to_active_threads(thd);
return thd;
}
void destroy_thd(MYSQL_THD thd)
{
delete_running_thd(thd);
}
void reset_thd(MYSQL_THD thd)
{
close_thread_tables(thd);
thd->mdl_context.release_transactional_locks();
thd->free_items();
free_root(thd->mem_root, MYF(MY_KEEP_PREALLOC));
}
unsigned long long thd_get_query_id(const MYSQL_THD thd)
{
return((unsigned long long)thd->query_id);
}
extern "C" const struct charset_info_st *thd_charset(MYSQL_THD thd)
{
return(thd->charset());

View File

@@ -1622,7 +1622,8 @@ enum enum_thread_type
SYSTEM_THREAD_EVENT_SCHEDULER= 8,
SYSTEM_THREAD_EVENT_WORKER= 16,
SYSTEM_THREAD_BINLOG_BACKGROUND= 32,
SYSTEM_THREAD_SLAVE_BACKGROUND= 64
SYSTEM_THREAD_SLAVE_BACKGROUND= 64,
SYSTEM_THREAD_GENERIC= 128
};
inline char const *

View File

@@ -1085,20 +1085,11 @@ void do_handle_bootstrap(THD *thd)
end:
in_bootstrap= FALSE;
delete thd;
if (!opt_bootstrap)
{
/*
We need to wake up main thread in case of read_init_file().
This is not done by THD::~THD() when there are other threads running
(binlog background thread, for example). So do it here again.
*/
mysql_mutex_lock(&LOCK_thread_count);
mysql_cond_broadcast(&COND_thread_count);
mysql_mutex_unlock(&LOCK_thread_count);
}
mysql_mutex_lock(&LOCK_thread_count);
mysql_cond_broadcast(&COND_thread_count);
mysql_mutex_unlock(&LOCK_thread_count);
#ifndef EMBEDDED_LIBRARY
DBUG_ASSERT(!opt_bootstrap || thread_count == 0);
my_thread_end();
pthread_exit(0);
#endif

View File

@@ -6216,17 +6216,6 @@ static int compare_uint(const uint *s, const uint *t)
}
/*
Check if the column is computed and either
is stored or is used in the partitioning expression.
*/
static bool vcol_affecting_storage(const Virtual_column_info* vcol,
bool indexed)
{
return vcol &&
(vcol->is_stored() || vcol->is_in_partitioning_expr() || indexed);
}
/**
Compare original and new versions of a table and fill Alter_inplace_info
describing differences between those versions.
@@ -6291,11 +6280,6 @@ static bool fill_alter_inplace_info(THD *thd,
alter_info->key_list.elements)))
DBUG_RETURN(true);
/* First we setup ha_alter_flags based on what was detected by parser. */
if (alter_info->flags & Alter_info::ALTER_ADD_COLUMN)
ha_alter_info->handler_flags|= Alter_inplace_info::ADD_COLUMN;
if (alter_info->flags & Alter_info::ALTER_DROP_COLUMN)
ha_alter_info->handler_flags|= Alter_inplace_info::DROP_COLUMN;
/*
Comparing new and old default values of column is cumbersome.
So instead of using such a comparison for detecting if default
@@ -6343,7 +6327,7 @@ static bool fill_alter_inplace_info(THD *thd,
upgrading VARCHAR column types.
*/
if (table->s->frm_version < FRM_VER_TRUE_VARCHAR && varchar)
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_TYPE;
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_STORED_COLUMN_TYPE;
/*
Go through fields in old version of table and detect changes to them.
@@ -6357,20 +6341,23 @@ static bool fill_alter_inplace_info(THD *thd,
about nature of changes than those provided from parser.
*/
bool maybe_alter_vcol= false;
for (f_ptr= table->field; (field= *f_ptr); f_ptr++)
uint field_stored_index= 0;
for (f_ptr= table->field; (field= *f_ptr); f_ptr++,
field_stored_index+= field->stored_in_db())
{
/* Clear marker for renamed or dropped field
which we are going to set later. */
field->flags&= ~(FIELD_IS_RENAMED | FIELD_IS_DROPPED);
/* Use transformed info to evaluate flags for storage engine. */
uint new_field_index= 0;
uint new_field_index= 0, new_field_stored_index= 0;
new_field_it.init(alter_info->create_list);
while ((new_field= new_field_it++))
{
if (new_field->field == field)
break;
new_field_index++;
new_field_stored_index+= new_field->stored_in_db();
}
if (new_field)
@@ -6385,7 +6372,12 @@ static bool fill_alter_inplace_info(THD *thd,
{
case IS_EQUAL_NO:
/* New column type is incompatible with old one. */
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_TYPE;
if (field->stored_in_db())
ha_alter_info->handler_flags|=
Alter_inplace_info::ALTER_STORED_COLUMN_TYPE;
else
ha_alter_info->handler_flags|=
Alter_inplace_info::ALTER_VIRTUAL_COLUMN_TYPE;
if (table->s->tmp_table == NO_TMP_TABLE)
{
delete_statistics_for_column(thd, table, field);
@@ -6430,31 +6422,57 @@ static bool fill_alter_inplace_info(THD *thd,
default:
DBUG_ASSERT(0);
/* Safety. */
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_TYPE;
ha_alter_info->handler_flags|=
Alter_inplace_info::ALTER_STORED_COLUMN_TYPE;
}
if (vcol_affecting_storage(field->vcol_info,
field->flags & PART_KEY_FLAG) ||
vcol_affecting_storage(new_field->vcol_info, false))
if (field->vcol_info || new_field->vcol_info)
{
if (is_equal == IS_EQUAL_NO ||
!field->vcol_info || !new_field->vcol_info ||
!field->vcol_info->is_equal(new_field->vcol_info))
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_VCOL;
else
/* base <-> virtual or stored <-> virtual */
if (field->stored_in_db() != new_field->stored_in_db())
ha_alter_info->handler_flags|=
Alter_inplace_info::ALTER_STORED_COLUMN_TYPE |
Alter_inplace_info::ALTER_VIRTUAL_COLUMN_TYPE;
if (field->vcol_info && new_field->vcol_info)
{
if (!(ha_alter_info->handler_flags & Alter_inplace_info::ALTER_COLUMN_VCOL) &&
(ha_alter_info->handler_flags & Alter_inplace_info::ALTER_COLUMN_DEFAULT))
bool value_changes= is_equal == IS_EQUAL_NO;
Alter_inplace_info::HA_ALTER_FLAGS alter_expr= field->stored_in_db()
? Alter_inplace_info::ALTER_STORED_GCOL_EXPR
: Alter_inplace_info::ALTER_VIRTUAL_GCOL_EXPR;
if (!field->vcol_info->is_equal(new_field->vcol_info))
{
ha_alter_info->handler_flags|= alter_expr;
value_changes= true;
}
if ((ha_alter_info->handler_flags & Alter_inplace_info::ALTER_COLUMN_DEFAULT)
&& !(ha_alter_info->handler_flags & alter_expr))
{ /*
a DEFAULT value of a some column was changed.
see if this vcol uses DEFAULT() function
a DEFAULT value of a some column was changed. see if this vcol
uses DEFAULT() function. The check is kind of expensive, so don't
do it if ALTER_COLUMN_VCOL is already set.
*/
if (field->vcol_info->expr_item->walk(
&Item::check_func_default_processor, 0, 0))
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_VCOL;
{
ha_alter_info->handler_flags|= alter_expr;
value_changes= true;
}
}
if (field->vcol_info->is_in_partitioning_expr() ||
field->flags & PART_KEY_FLAG)
{
if (value_changes)
ha_alter_info->handler_flags|=
Alter_inplace_info::ALTER_COLUMN_VCOL;
else
maybe_alter_vcol= true;
}
}
maybe_alter_vcol= true;
else /* base <-> stored */
ha_alter_info->handler_flags|=
Alter_inplace_info::ALTER_STORED_COLUMN_TYPE;
}
/* Check if field was renamed */
@@ -6487,8 +6505,18 @@ static bool fill_alter_inplace_info(THD *thd,
/*
Detect changes in column order.
*/
if (field->field_index != new_field_index)
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_ORDER;
if (field->stored_in_db())
{
if (field_stored_index != new_field_stored_index)
ha_alter_info->handler_flags|=
Alter_inplace_info::ALTER_STORED_COLUMN_ORDER;
}
else
{
if (field->field_index != new_field_index)
ha_alter_info->handler_flags|=
Alter_inplace_info::ALTER_VIRTUAL_COLUMN_ORDER;
}
/* Detect changes in storage type of column */
if (new_field->field_storage_type() != field->field_storage_type())
@@ -6511,12 +6539,12 @@ static bool fill_alter_inplace_info(THD *thd,
}
else
{
/*
Field is not present in new version of table and therefore was dropped.
Corresponding storage engine flag should be already set.
*/
DBUG_ASSERT(ha_alter_info->handler_flags & Alter_inplace_info::DROP_COLUMN);
// Field is not present in new version of table and therefore was dropped.
field->flags|= FIELD_IS_DROPPED;
if (field->stored_in_db())
ha_alter_info->handler_flags|= Alter_inplace_info::DROP_STORED_COLUMN;
else
ha_alter_info->handler_flags|= Alter_inplace_info::DROP_VIRTUAL_COLUMN;
}
}
@@ -6529,9 +6557,10 @@ static bool fill_alter_inplace_info(THD *thd,
column was altered.
*/
if (ha_alter_info->handler_flags &
( Alter_inplace_info::ALTER_COLUMN_TYPE
| Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE
| Alter_inplace_info::ALTER_COLUMN_OPTION ))
( Alter_inplace_info::ALTER_STORED_COLUMN_TYPE
| Alter_inplace_info::ALTER_VIRTUAL_COLUMN_TYPE
| Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE
| Alter_inplace_info::ALTER_COLUMN_OPTION ))
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_VCOL;
}
@@ -6540,17 +6569,17 @@ static bool fill_alter_inplace_info(THD *thd,
{
if (! new_field->field)
{
/*
Field is not present in old version of table and therefore was added.
Again corresponding storage engine flag should be already set.
*/
DBUG_ASSERT(ha_alter_info->handler_flags & Alter_inplace_info::ADD_COLUMN);
if (new_field->vcol_info &&
(new_field->stored_in_db() || new_field->vcol_info->is_in_partitioning_expr()))
{
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_VCOL;
}
// Field is not present in old version of table and therefore was added.
if (new_field->vcol_info)
if (new_field->stored_in_db())
ha_alter_info->handler_flags|=
Alter_inplace_info::ADD_STORED_GENERATED_COLUMN;
else
ha_alter_info->handler_flags|=
Alter_inplace_info::ADD_VIRTUAL_COLUMN;
else
ha_alter_info->handler_flags|=
Alter_inplace_info::ADD_STORED_BASE_COLUMN;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -119,6 +119,8 @@ public:
const key_map* keys_to_use_for_scanning();
void column_bitmaps_signal();
/** Opens dictionary table object using table name. For partition, we need to
try alternative lower/upper case names to support moving data files across
platforms.
@@ -781,6 +783,8 @@ public:
@return NULL if valid, string name of bad option if not. */
const char* create_options_are_invalid();
bool gcols_in_fulltext_or_spatial();
/** Validates engine specific table options not handled by
SQL-parser.
@return NULL if valid, string name of bad option if not. */
@@ -1037,13 +1041,9 @@ innodb_base_col_setup_for_stored(
dict_s_col_t* s_col);
/** whether this is a stored column */
// JAN: TODO: MySQL 5.7 virtual fields
//#define innobase_is_s_fld(field) ((field)->gcol_info && (field)->stored_in_db)
#define innobase_is_s_fld(field) (field == NULL)
// JAN: TODO: MySQL 5.7 virtual fields
#define innobase_is_s_fld(field) ((field)->vcol_info && (field)->stored_in_db())
/** whether this is a computed virtual column */
//#define innobase_is_v_fld(field) ((field)->gcol_info && !(field)->stored_in_db)
#define innobase_is_v_fld(field) (field == NULL)
#define innobase_is_v_fld(field) ((field)->vcol_info && !(field)->stored_in_db())
/** Release temporary latches.
Call this function when mysqld passes control to the client. That is to
@@ -1120,16 +1120,14 @@ innodb_rec_per_key(
@param[in,out] s_templ InnoDB template structure
@param[in] add_v new virtual columns added along with
add index call
@param[in] locked true if innobase_share_mutex is held
@param[in] share_tbl_name original MySQL table name */
@param[in] locked true if innobase_share_mutex is held */
void
innobase_build_v_templ(
const TABLE* table,
const dict_table_t* ib_table,
dict_vcol_templ_t* s_templ,
const dict_add_v_col_t* add_v,
bool locked,
const char* share_tbl_name);
bool locked);
/** callback used by MySQL server layer to initialized
the table virtual columns' template

File diff suppressed because it is too large Load Diff

View File

@@ -1984,7 +1984,6 @@ dict_free_vc_templ(
ut_free(vc_templ->vtempl[i]);
}
}
ut_free(vc_templ->default_rec);
ut_free(vc_templ->vtempl);
vc_templ->vtempl = NULL;
}

View File

@@ -1328,14 +1328,19 @@ struct dict_vcol_templ_t {
/** table name */
std::string tb_name;
/** share->table_name */
std::string share_name;
/** MySQL record length */
ulint rec_len;
/** default column value if any */
byte* default_rec;
/** cached MySQL TABLE object */
TABLE* mysql_table;
/** when mysql_table was cached */
uint64_t mysql_table_query_id;
dict_vcol_templ_t() : vtempl(0), mysql_table_query_id(-1) {}
};
/* This flag is for sync SQL DDL and memcached DML.

View File

@@ -52,7 +52,6 @@ struct fts_string_t;
#undef MYSQL_SPATIAL_INDEX
#undef MYSQL_STORE_FTS_DOC_ID
#undef MYSQL_TABLESPACES
#undef MYSQL_VIRTUAL_COLUMNS
/*********************************************************************//**
Wrapper around MySQL's copy_and_convert function.
@@ -654,5 +653,20 @@ buffer pool size.
void
innodb_set_buf_pool_size(ulonglong buf_pool_size);
/** Create a MYSQL_THD for background purge threads and mark it as such.
@returns new MYSQL_THD */
MYSQL_THD
innobase_create_background_thd();
/** Destroy a background purge thread THD.
@param[in] thd MYSQL_THD to destroy */
void
innobase_destroy_background_thd(MYSQL_THD);
/** Close opened tables, free memory, delete items for a MYSQL_THD.
@param[in] thd MYSQL_THD to reset */
void
innobase_reset_background_thd(MYSQL_THD);
#endif /* !UNIV_HOTBACKUP && !UNIV_INNOCHECKSUM */
#endif /* HA_INNODB_PROTOTYPES_H */

View File

@@ -2195,6 +2195,13 @@ loop:
count = 0;
}
/* Wake up purge threads to die - they have MYSQL_THD's and
thus might keep open transactions. In particular, this is
needed in embedded server and when one uses UNINSTALL PLUGIN.
In the normal server shutdown purge threads should've been
already notified by the thd_destructor_proxy thread. */
srv_purge_wakeup();
goto loop;
}

View File

@@ -931,7 +931,6 @@ row_ins_invalidate_query_cache(
innobase_invalidate_query_cache(thr_get_trx(thr), name, len);
}
#ifdef MYSQL_VIRTUAL_COLUMNS
/** Fill virtual column information in cascade node for the child table.
@param[out] cascade child update node
@@ -1042,7 +1041,6 @@ func_exit:
mem_heap_free(v_heap);
}
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
#ifdef WITH_WSREP
dberr_t wsrep_append_foreign_key(trx_t *trx,
@@ -1338,7 +1336,6 @@ row_ins_foreign_check_on_constraint(
cascade->fts_doc_id = doc_id;
}
#ifdef MYSQL_VIRTUAL_COLUMNS
if (foreign->v_cols != NULL
&& foreign->v_cols->size() > 0) {
row_ins_foreign_fill_virtual(
@@ -1349,7 +1346,6 @@ row_ins_foreign_check_on_constraint(
goto nonstandard_exit_func;
}
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
} else if (table->fts && cascade->is_delete) {
/* DICT_FOREIGN_ON_DELETE_CASCADE case */
for (i = 0; i < foreign->n_fields; i++) {
@@ -1379,7 +1375,6 @@ row_ins_foreign_check_on_constraint(
trx, &fts_col_affacted, cascade);
#ifdef MYSQL_VIRTUAL_COLUMNS
if (foreign->v_cols != NULL
&& foreign->v_cols->size() > 0) {
row_ins_foreign_fill_virtual(
@@ -1390,7 +1385,6 @@ row_ins_foreign_check_on_constraint(
goto nonstandard_exit_func;
}
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
if (n_to_update == ULINT_UNDEFINED) {
err = DB_ROW_IS_REFERENCED;

View File

@@ -655,13 +655,10 @@ row_merge_buf_add(
const dfield_t* row_field;
col = ifield->col;
#ifdef MYSQL_VIRTUAL_COLUMNS
const dict_v_col_t* v_col = NULL;
if (dict_col_is_virtual(col)) {
v_col = reinterpret_cast<const dict_v_col_t*>(col);
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
col_no = dict_col_get_no(col);
@@ -687,7 +684,6 @@ row_merge_buf_add(
} else {
/* Use callback to get the virtual column value */
if (dict_col_is_virtual(col)) {
#ifdef MYSQL_VIRTUAL_COLUMN
dict_index_t* clust_index
= dict_table_get_first_index(new_table);
@@ -701,7 +697,6 @@ row_merge_buf_add(
DBUG_RETURN(0);
}
dfield_copy(field, row_field);
#endif /* MYSQL_VIRTUAL_COLUMN */
} else {
row_field = dtuple_get_nth_field(row, col_no);
dfield_copy(field, row_field);

View File

@@ -5034,14 +5034,12 @@ end:
goto funct_exit;
}
#ifdef MYSQL_VIRTUAL_COLUMNS
/* In case of copy alter, template db_name and
table_name should be renamed only for newly
created table. */
if (table->vc_templ != NULL && !new_is_tmp) {
innobase_rename_vc_templ(table);
}
#endif
/* We only want to switch off some of the type checking in
an ALTER TABLE...ALGORITHM=COPY, not in a RENAME. */

View File

@@ -868,7 +868,6 @@ try_again:
goto err_exit;
}
#ifdef MYSQL_VIRTUAL_COLUMNS
if (node->table->n_v_cols && !node->table->vc_templ
&& dict_table_has_indexed_v_cols(node->table)) {
/* Need server fully up for virtual column computation */
@@ -886,7 +885,6 @@ try_again:
/* Initialize the template for the table */
innobase_init_vc_templ(node->table);
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
/* Disable purging for temp-tables as they are short-lived
and no point in re-organzing such short lived tables */
@@ -1120,6 +1118,8 @@ row_purge_step(
row_purge_end(thr);
}
innobase_reset_background_thd(thr_get_trx(thr)->mysql_thd);
return(thr);
}

View File

@@ -221,7 +221,6 @@ row_sel_sec_rec_is_for_clust_rec(
/* For virtual column, its value will need to be
reconstructed from base column in cluster index */
if (is_virtual) {
#ifdef MYSQL_VIRTUAL_COLUMNS
const dict_v_col_t* v_col;
const dtuple_t* row;
dfield_t* vfield;
@@ -243,7 +242,6 @@ row_sel_sec_rec_is_for_clust_rec(
clust_len = vfield->len;
clust_field = static_cast<byte*>(vfield->data);
#endif /* MYSQL_VIRTUAL_COLUMNS */
} else {
clust_pos = dict_col_get_clust_pos(col, clust_index);

View File

@@ -1076,7 +1076,6 @@ row_upd_build_difference_binary(
}
}
#ifdef MYSQL_VIRTUAL_COLUMNS
/* Check the virtual columns updates. Even if there is no non-virtual
column (base columns) change, we will still need to build the
indexed virtual column value so that undo log would log them (
@@ -1141,7 +1140,6 @@ row_upd_build_difference_binary(
mem_heap_free(v_heap);
}
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
update->n_fields = n_diff;
ut_ad(update->validate());
@@ -2061,7 +2059,6 @@ row_upd_eval_new_vals(
}
}
#ifdef MYSQL_VIRTUAL_COLUMNS
/** Stores to the heap the virtual columns that need for any indexes
@param[in,out] node row update node
@param[in] update an update vector if it is update
@@ -2140,7 +2137,6 @@ row_upd_store_v_row(
mem_heap_free(heap);
}
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
/** Stores to the heap the row on which the node->pcur is positioned.
@param[in] node row update node
@@ -2190,12 +2186,10 @@ row_upd_store_row(
node->row = row_build(ROW_COPY_DATA, clust_index, rec, offsets,
NULL, NULL, NULL, ext, node->heap);
#ifdef MYSQL_VIRTUAL_COLUMNS
if (node->table->n_v_cols) {
row_upd_store_v_row(node, node->is_delete ? NULL : node->update,
thd, mysql_table);
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
if (node->is_delete) {
node->upd_row = NULL;

View File

@@ -467,7 +467,6 @@ row_vers_non_vc_match(
return(ret);
}
#ifdef MYSQL_VIRTUAL_COLUMNS
/** build virtual column value from current cluster index record data
@param[in,out] row the cluster index row in dtuple form
@param[in] clust_index clustered index
@@ -841,7 +840,6 @@ row_vers_build_cur_vrow(
ULINT_UNDEFINED, &heap);
return(cur_vrow);
}
#endif /* MYSQL_VIRTUAL_COLUMNS */
/*****************************************************************//**
Finds out if a version of the record, where the version >= the current
@@ -913,7 +911,6 @@ row_vers_old_has_index_entry(
if (dict_index_has_virtual(index)) {
#ifdef MYSQL_VIRTUAL_COLUMNS
#ifdef DBUG_OFF
# define dbug_v_purge false
@@ -963,7 +960,6 @@ row_vers_old_has_index_entry(
}
clust_offsets = rec_get_offsets(rec, clust_index, NULL,
ULINT_UNDEFINED, &heap);
#endif /* MYSQL_VIRTUAL_COLUMNS */
} else {
entry = row_build_index_entry(
@@ -1001,7 +997,6 @@ row_vers_old_has_index_entry(
}
}
} else if (dict_index_has_virtual(index)) {
#ifdef MYSQL_VIRTUAL_COLUMNS
/* The current cluster index record could be
deleted, but the previous version of it might not. We will
need to get the virtual column data from undo record
@@ -1009,7 +1004,6 @@ row_vers_old_has_index_entry(
cur_vrow = row_vers_build_cur_vrow(
also_curr, rec, clust_index, &clust_offsets,
index, ientry, roll_ptr, trx_id, heap, v_heap, mtr);
#endif /* MYSQL_VIRTUAL_COLUMNS */
}
version = rec;

View File

@@ -2664,8 +2664,13 @@ Check if purge should stop.
static
bool
srv_purge_should_exit(
MYSQL_THD thd,
ulint n_purged) /*!< in: pages purged in last batch */
{
if (thd_kill_level(thd)) {
return(true);
}
switch (srv_shutdown_state) {
case SRV_SHUTDOWN_NONE:
/* Normal operation. */
@@ -2736,8 +2741,7 @@ DECLARE_THREAD(srv_worker_thread)(
ut_ad(!srv_read_only_mode);
ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND);
my_thread_init();
// JAN: TODO: MySQL 5.7
// THD *thd= create_thd(false, true, true);
THD* thd = innobase_create_background_thd();
#ifdef UNIV_DEBUG_THREAD_CREATION
ib::info() << "Worker thread starting, id "
@@ -2781,7 +2785,7 @@ DECLARE_THREAD(srv_worker_thread)(
ut_a(!purge_sys->running);
ut_a(purge_sys->state == PURGE_STATE_EXIT);
ut_a(srv_shutdown_state > SRV_SHUTDOWN_NONE);
ut_a(srv_shutdown_state > SRV_SHUTDOWN_NONE || thd_kill_level(thd));
rw_lock_x_unlock(&purge_sys->latch);
@@ -2790,9 +2794,8 @@ DECLARE_THREAD(srv_worker_thread)(
<< os_thread_pf(os_thread_get_curr_id());
#endif /* UNIV_DEBUG_THREAD_CREATION */
// JAN: TODO: MySQL 5.7
// destroy_thd(thd);
my_thread_end();
innobase_destroy_background_thd(thd);
my_thread_end();
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */
os_thread_exit();
@@ -2807,6 +2810,7 @@ static
ulint
srv_do_purge(
/*=========*/
MYSQL_THD thd,
ulint n_threads, /*!< in: number of threads to use */
ulint* n_total_purged) /*!< in/out: total pages purged */
{
@@ -2877,7 +2881,7 @@ srv_do_purge(
*n_total_purged += n_pages_purged;
} while (!srv_purge_should_exit(n_pages_purged)
} while (!srv_purge_should_exit(thd, n_pages_purged)
&& n_pages_purged > 0
&& purge_sys->state == PURGE_STATE_RUN);
@@ -2890,6 +2894,7 @@ static
void
srv_purge_coordinator_suspend(
/*==========================*/
MYSQL_THD thd,
srv_slot_t* slot, /*!< in/out: Purge coordinator
thread slot */
ulint rseg_history_len) /*!< in: history list length
@@ -2977,7 +2982,7 @@ srv_purge_coordinator_suspend(
}
}
} while (stop);
} while (stop && !thd_kill_level(thd));
srv_sys_mutex_enter();
@@ -3001,8 +3006,7 @@ DECLARE_THREAD(srv_purge_coordinator_thread)(
required by os_thread_create */
{
my_thread_init();
// JAN: TODO: MySQL 5.7
// THD *thd= create_thd(false, true, true);
THD* thd = innobase_create_background_thd();
srv_slot_t* slot;
ulint n_total_purged = ULINT_UNDEFINED;
@@ -3036,13 +3040,14 @@ DECLARE_THREAD(srv_purge_coordinator_thread)(
purge didn't purge any records then wait for activity. */
if (srv_shutdown_state == SRV_SHUTDOWN_NONE
&& !thd_kill_level(thd)
&& (purge_sys->state == PURGE_STATE_STOP
|| n_total_purged == 0)) {
srv_purge_coordinator_suspend(slot, rseg_history_len);
srv_purge_coordinator_suspend(thd, slot, rseg_history_len);
}
if (srv_purge_should_exit(n_total_purged)) {
if (srv_purge_should_exit(thd, n_total_purged)) {
ut_a(!slot->suspended);
break;
}
@@ -3050,14 +3055,14 @@ DECLARE_THREAD(srv_purge_coordinator_thread)(
n_total_purged = 0;
rseg_history_len = srv_do_purge(
srv_n_purge_threads, &n_total_purged);
thd, srv_n_purge_threads, &n_total_purged);
} while (!srv_purge_should_exit(n_total_purged));
} while (!srv_purge_should_exit(thd, n_total_purged));
/* Ensure that we don't jump out of the loop unless the
exit condition is satisfied. */
ut_a(srv_purge_should_exit(n_total_purged));
ut_a(srv_purge_should_exit(thd, n_total_purged));
ulint n_pages_purged = ULINT_MAX;
@@ -3068,12 +3073,6 @@ DECLARE_THREAD(srv_purge_coordinator_thread)(
n_pages_purged = trx_purge(1, srv_purge_batch_size, false);
}
#ifdef UNIV_DEBUG
if (srv_fast_shutdown == 0) {
trx_commit_disallowed = true;
}
#endif /* UNIV_DEBUG */
/* This trx_purge is called to remove any undo records (added by
background threads) after completion of the above loop. When
srv_fast_shutdown != 0, a large batch size can cause significant
@@ -3116,8 +3115,7 @@ DECLARE_THREAD(srv_purge_coordinator_thread)(
srv_release_threads(SRV_WORKER, srv_n_purge_threads - 1);
}
// JAN: TODO: MYSQL 5.7
// destroy_thd(thd);
innobase_destroy_background_thd(thd);
my_thread_end();
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */

View File

@@ -13969,8 +13969,8 @@ enum_alter_inplace_result ha_mroonga::wrapper_check_if_supported_inplace_alter(
(
Alter_inplace_info::ADD_COLUMN |
Alter_inplace_info::DROP_COLUMN |
Alter_inplace_info::ALTER_COLUMN_TYPE |
Alter_inplace_info::ALTER_COLUMN_ORDER |
Alter_inplace_info::ALTER_STORED_COLUMN_TYPE |
Alter_inplace_info::ALTER_STORED_COLUMN_ORDER |
Alter_inplace_info::ALTER_COLUMN_NULLABLE |
Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE |
Alter_inplace_info::ALTER_COLUMN_STORAGE_TYPE |

View File

@@ -216,11 +216,11 @@ static ulong fix_handler_flags(
handler_flags &= ~Alter_inplace_info::TOKU_ALTER_RENAME;
}
// ALTER_COLUMN_TYPE may be set when no columns have been changed,
// ALTER_STORED_COLUMN_TYPE may be set when no columns have been changed,
// so turn off the flag
if (handler_flags & Alter_inplace_info::ALTER_COLUMN_TYPE) {
if (handler_flags & Alter_inplace_info::ALTER_STORED_COLUMN_TYPE) {
if (all_fields_are_same_type(table, altered_table)) {
handler_flags &= ~Alter_inplace_info::ALTER_COLUMN_TYPE;
handler_flags &= ~Alter_inplace_info::ALTER_STORED_COLUMN_TYPE;
}
}
@@ -358,7 +358,7 @@ enum_alter_inplace_result ha_tokudb::check_if_supported_inplace_alter(
// but let's do some more checks
// we will only allow an hcr if there are no changes
// in column positions (ALTER_COLUMN_ORDER is not set)
// in column positions (ALTER_STORED_COLUMN_ORDER is not set)
// now need to verify that one and only one column
// has changed only its name. If we find anything to
@@ -369,7 +369,7 @@ enum_alter_inplace_result ha_tokudb::check_if_supported_inplace_alter(
table,
altered_table,
(ctx->handler_flags &
Alter_inplace_info::ALTER_COLUMN_ORDER) != 0);
Alter_inplace_info::ALTER_STORED_COLUMN_ORDER) != 0);
if (cr_supported)
result = HA_ALTER_INPLACE_EXCLUSIVE_LOCK;
}
@@ -377,7 +377,7 @@ enum_alter_inplace_result ha_tokudb::check_if_supported_inplace_alter(
only_flags(
ctx->handler_flags,
Alter_inplace_info::ADD_COLUMN +
Alter_inplace_info::ALTER_COLUMN_ORDER) &&
Alter_inplace_info::ALTER_STORED_COLUMN_ORDER) &&
setup_kc_info(altered_table, ctx->altered_table_kc_info) == 0) {
// add column
@@ -407,7 +407,7 @@ enum_alter_inplace_result ha_tokudb::check_if_supported_inplace_alter(
only_flags(
ctx->handler_flags,
Alter_inplace_info::DROP_COLUMN +
Alter_inplace_info::ALTER_COLUMN_ORDER) &&
Alter_inplace_info::ALTER_STORED_COLUMN_ORDER) &&
setup_kc_info(altered_table, ctx->altered_table_kc_info) == 0) {
// drop column
@@ -452,10 +452,10 @@ enum_alter_inplace_result ha_tokudb::check_if_supported_inplace_alter(
ha_alter_info, ctx)) {
result = HA_ALTER_INPLACE_EXCLUSIVE_LOCK;
}
} else if ((ctx->handler_flags & Alter_inplace_info::ALTER_COLUMN_TYPE) &&
} else if ((ctx->handler_flags & Alter_inplace_info::ALTER_STORED_COLUMN_TYPE) &&
only_flags(
ctx->handler_flags,
Alter_inplace_info::ALTER_COLUMN_TYPE +
Alter_inplace_info::ALTER_STORED_COLUMN_TYPE +
Alter_inplace_info::ALTER_COLUMN_DEFAULT) &&
table->s->fields == altered_table->s->fields &&
find_changed_fields(
@@ -1578,7 +1578,7 @@ static bool change_field_type_is_supported(
return false;
} else if (old_type == MYSQL_TYPE_VARCHAR) {
// varchar(X) -> varchar(Y) and varbinary(X) -> varbinary(Y) expansion
// where X < 256 <= Y the ALTER_COLUMN_TYPE handler flag is set for
// where X < 256 <= Y the ALTER_STORED_COLUMN_TYPE handler flag is set for
// these cases
return change_varchar_length_is_supported(
old_field,