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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
53
mysql-test/suite/gcol/inc/innodb_v_large_col.inc
Normal file
53
mysql-test/suite/gcol/inc/innodb_v_large_col.inc
Normal 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;
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
#
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
26
mysql-test/suite/gcol/r/innodb_partition.result
Normal file
26
mysql-test/suite/gcol/r/innodb_partition.result
Normal 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;
|
||||
15
mysql-test/suite/gcol/r/innodb_prefix_index_check.result
Normal file
15
mysql-test/suite/gcol/r/innodb_prefix_index_check.result
Normal 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;
|
||||
1562
mysql-test/suite/gcol/r/innodb_virtual_basic.result
Normal file
1562
mysql-test/suite/gcol/r/innodb_virtual_basic.result
Normal file
File diff suppressed because it is too large
Load Diff
12
mysql-test/suite/gcol/r/innodb_virtual_blob.result
Normal file
12
mysql-test/suite/gcol/r/innodb_virtual_blob.result
Normal 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;
|
||||
227
mysql-test/suite/gcol/r/innodb_virtual_debug.result
Normal file
227
mysql-test/suite/gcol/r/innodb_virtual_debug.result
Normal 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';
|
||||
141
mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result
Normal file
141
mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result
Normal 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;
|
||||
590
mysql-test/suite/gcol/r/innodb_virtual_fk.result
Normal file
590
mysql-test/suite/gcol/r/innodb_virtual_fk.result
Normal 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;
|
||||
44
mysql-test/suite/gcol/r/innodb_virtual_fk_restart.result
Normal file
44
mysql-test/suite/gcol/r/innodb_virtual_fk_restart.result
Normal 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;
|
||||
196
mysql-test/suite/gcol/r/innodb_virtual_index.result
Normal file
196
mysql-test/suite/gcol/r/innodb_virtual_index.result
Normal 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;
|
||||
140
mysql-test/suite/gcol/r/innodb_virtual_purge.result
Normal file
140
mysql-test/suite/gcol/r/innodb_virtual_purge.result
Normal 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;
|
||||
52
mysql-test/suite/gcol/r/innodb_wl8114.result
Normal file
52
mysql-test/suite/gcol/r/innodb_wl8114.result
Normal 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;
|
||||
52
mysql-test/suite/gcol/r/main_alter_table.result
Normal file
52
mysql-test/suite/gcol/r/main_alter_table.result
Normal 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;
|
||||
49
mysql-test/suite/gcol/r/main_mysqldump.result
Normal file
49
mysql-test/suite/gcol/r/main_mysqldump.result
Normal 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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
@@ -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
|
||||
|
||||
30
mysql-test/suite/gcol/t/innodb_partition.test
Normal file
30
mysql-test/suite/gcol/t/innodb_partition.test
Normal 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;
|
||||
|
||||
22
mysql-test/suite/gcol/t/innodb_prefix_index_check.test
Normal file
22
mysql-test/suite/gcol/t/innodb_prefix_index_check.test
Normal 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;
|
||||
|
||||
1474
mysql-test/suite/gcol/t/innodb_virtual_basic.test
Normal file
1474
mysql-test/suite/gcol/t/innodb_virtual_basic.test
Normal file
File diff suppressed because it is too large
Load Diff
16
mysql-test/suite/gcol/t/innodb_virtual_blob.test
Normal file
16
mysql-test/suite/gcol/t/innodb_virtual_blob.test
Normal 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;
|
||||
|
||||
240
mysql-test/suite/gcol/t/innodb_virtual_debug.test
Normal file
240
mysql-test/suite/gcol/t/innodb_virtual_debug.test
Normal 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
|
||||
174
mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test
Normal file
174
mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test
Normal 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;
|
||||
492
mysql-test/suite/gcol/t/innodb_virtual_fk.test
Normal file
492
mysql-test/suite/gcol/t/innodb_virtual_fk.test
Normal 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;
|
||||
42
mysql-test/suite/gcol/t/innodb_virtual_fk_restart.test
Normal file
42
mysql-test/suite/gcol/t/innodb_virtual_fk_restart.test
Normal 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;
|
||||
220
mysql-test/suite/gcol/t/innodb_virtual_index.test
Normal file
220
mysql-test/suite/gcol/t/innodb_virtual_index.test
Normal 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;
|
||||
138
mysql-test/suite/gcol/t/innodb_virtual_purge.test
Normal file
138
mysql-test/suite/gcol/t/innodb_virtual_purge.test
Normal 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
|
||||
42
mysql-test/suite/gcol/t/innodb_wl8114.test
Normal file
42
mysql-test/suite/gcol/t/innodb_wl8114.test
Normal 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;
|
||||
50
mysql-test/suite/gcol/t/main_alter_table.test
Normal file
50
mysql-test/suite/gcol/t/main_alter_table.test
Normal 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;
|
||||
44
mysql-test/suite/gcol/t/main_mysqldump.test
Normal file
44
mysql-test/suite/gcol/t/main_mysqldump.test
Normal 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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
@@ -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? */
|
||||
|
||||
101
sql/handler.h
101
sql/handler.h
@@ -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.
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -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
|
||||
|
||||
141
sql/sql_table.cc
141
sql/sql_table.cc
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user