diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-01-26 11:01:39 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2022-01-26 18:43:05 +0100 |
commit | 358921ce32203a9a8dd277a5ba7ac177c9e79e53 (patch) | |
tree | 41831126d41212b52264d32c6fe9bff93380f063 /mysql-test | |
parent | 349a595bc448fe654087f1e6444b17e9ee1583fc (diff) | |
download | mariadb-git-358921ce32203a9a8dd277a5ba7ac177c9e79e53.tar.gz |
MDEV-26938 Support descending indexes internally in InnoDB
This is loosely based on the InnoDB changes in
mysql/mysql-server@97fd8b1b6993340b361fa7f85da86a308f0b5e0c
that I had developed in 2015 or 2016.
For each B-tree key field, we will allow a flag ASC/DESC to be associated.
When PRIMARY KEY fields are internally appended to secondary indexes,
the ASC/DESC attribute will be inherited, so that covering index scans
will work as expected.
Note: Until the subsequent commit, the DESC attribute will be ignored
(no HA_REVERSE_SORT flag will be written to .frm files).
dict_field_t::descending: A new flag to denote descending order.
cmp_data(), cmp_dfield_dfield(): Add a new parameter descending.
cmp_dtuple_rec(), cmp_dtuple_rec_with_match(): Add a parameter "index".
dtuple_coll_eq(): Replaces dtuple_coll_cmp().
cmp_dfield_dfield_eq_prefix(): Replaces cmp_dfield_dfield_like_prefix().
dict_index_t::is_btree(): Check whether the index is a regular
B-tree index (not SPATIAL, FULLTEXT, or the ibuf.index,
or a corrupted index.
btr_cur_search_to_nth_level_func(): Only attempt to use
the adaptive hash index if index->is_btree().
This function may also be invoked on ibuf.index, and
cmp_dtuple_rec_with_match_bytes() will no longer work on ibuf.index
because it assumes that the index and record fields exactly match.
The ibuf.index is a special variadic index tree.
Thanks to Thirunarayanan Balathandayuthapani for fixing some bugs:
MDEV-27439, MDEV-27374/MDEV-27445.
Diffstat (limited to 'mysql-test')
-rw-r--r-- | mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff | 162 | ||||
-rw-r--r-- | mysql-test/suite/innodb/r/autoinc_persist.result | 11 | ||||
-rw-r--r-- | mysql-test/suite/innodb/r/innodb-index.result | 48 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/autoinc_persist.combinations | 2 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/autoinc_persist.test | 56 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/innodb-index.test | 42 | ||||
-rw-r--r-- | mysql-test/suite/innodb_fts/r/create.result | 14 | ||||
-rw-r--r-- | mysql-test/suite/innodb_fts/t/create.test | 21 |
8 files changed, 324 insertions, 32 deletions
diff --git a/mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff b/mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff new file mode 100644 index 00000000000..eeef34e071d --- /dev/null +++ b/mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff @@ -0,0 +1,162 @@ +@@ -13,7 +13,7 @@ + # + # Pre-create several tables + SET SQL_MODE='STRICT_ALL_TABLES'; +-CREATE TABLE t1(a TINYINT AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t1(a TINYINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t1 VALUES(0), (0), (0), (0), (-1), (-10), (0), + (20), (30), (31); + SELECT * FROM t1; +@@ -28,7 +28,7 @@ + 20 + 30 + 31 +-CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t2 VALUES(-5); + ERROR 22003: Out of range value for column 'a' at row 1 + INSERT INTO t2 VALUES(0), (0), (0), (0), (8), (10), (0), +@@ -45,7 +45,7 @@ + 20 + 30 + 31 +-CREATE TABLE t3(a SMALLINT AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t3(a SMALLINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t3 VALUES(0), (0), (0), (0), (-1), (-10), (0), + (20), (30), (31), (1024), (4096); + SELECT * FROM t3; +@@ -62,7 +62,7 @@ + 31 + 1024 + 4096 +-CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t4 VALUES(-5); + ERROR 22003: Out of range value for column 'a' at row 1 + INSERT INTO t4 VALUES(0), (0), (0), (0), (8), (10), (0), +@@ -81,7 +81,7 @@ + 31 + 1024 + 4096 +-CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t5 VALUES(0), (0), (0), (0), (-1), (-10), (0), + (20), (30), (31), (1000000), (1000005); + SELECT * FROM t5; +@@ -98,7 +98,7 @@ + 31 + 1000000 + 1000005 +-CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t6 VALUES(-5); + ERROR 22003: Out of range value for column 'a' at row 1 + INSERT INTO t6 VALUES(0), (0), (0), (0), (8), (10), (0), +@@ -117,7 +117,7 @@ + 31 + 1000000 + 1000005 +-CREATE TABLE t7(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t7(a INT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t7 VALUES(0), (0), (0), (0), (-1), (-10), (0), + (20), (30), (31), (100000000), (100000008); + SELECT * FROM t7; +@@ -134,7 +134,7 @@ + 31 + 100000000 + 100000008 +-CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t8 VALUES(-5); + ERROR 22003: Out of range value for column 'a' at row 1 + INSERT INTO t8 VALUES(0), (0), (0), (0), (8), (10), (0), +@@ -153,7 +153,7 @@ + 31 + 100000000 + 100000008 +-CREATE TABLE t9(a BIGINT AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t9(a BIGINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t9 VALUES(0), (0), (0), (0), (-1), (-10), (0), + (20), (30), (31), (100000000000), (100000000006); + SELECT * FROM t9; +@@ -170,7 +170,7 @@ + 31 + 100000000000 + 100000000006 +-CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t10 VALUES(-5); + ERROR 22003: Out of range value for column 'a' at row 1 + INSERT INTO t10 VALUES(0), (0), (0), (0), (8), (10), (0), +@@ -189,7 +189,7 @@ + 31 + 100000000000 + 100000000006 +-CREATE TABLE t11(a FLOAT AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t11(a FLOAT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0), + (20), (30), (31); + SELECT * FROM t11; +@@ -204,7 +204,7 @@ + 20 + 30 + 31 +-CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB; ++CREATE TABLE t12(a DOUBLE AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB; + INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0), + (20), (30), (31); + SELECT * FROM t12; +@@ -242,7 +242,7 @@ + SELECT MAX(a) AS `Expect 100000000000` FROM t9; + Expect 100000000000 + 100000000000 +-CREATE TABLE t13(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB, ++CREATE TABLE t13(a INT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB, + AUTO_INCREMENT = 1234; + # restart + SHOW CREATE TABLE t13; +@@ -842,7 +842,7 @@ + 126 + DROP TABLE t_copy, it_copy; + # Scenario 9: Test the sql_mode = NO_AUTO_VALUE_ON_ZERO +-CREATE TABLE t30 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, key(b)) ENGINE = InnoDB; ++CREATE TABLE t30 (a INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(a DESC), b INT, key(b)) ENGINE = InnoDB; + set SQL_MODE = NO_AUTO_VALUE_ON_ZERO; + INSERT INTO t30 VALUES(NULL, 1), (200, 2), (0, 3); + INSERT INTO t30(b) VALUES(4), (5), (6), (7); +@@ -869,7 +869,7 @@ + set global innodb_flush_log_at_trx_commit=1; + CREATE TABLE t31 (a INT) ENGINE = InnoDB; + INSERT INTO t31 VALUES(1), (2); +-ALTER TABLE t31 ADD b INT AUTO_INCREMENT PRIMARY KEY; ++ALTER TABLE t31 ADD b INT AUTO_INCREMENT, ADD PRIMARY KEY(b DESC); + INSERT INTO t31 VALUES(3, 0), (4, NULL), (5, NULL); + INSERT INTO t31 VALUES(6, 0); + ERROR 23000: Duplicate entry '0' for key 'PRIMARY' +@@ -882,7 +882,7 @@ + 5 4 + SET SQL_MODE = 0; + # Scenario 10: Rollback would not rollback the counter +-CREATE TABLE t32 (a BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; ++CREATE TABLE t32 (a BIGINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE=InnoDB; + INSERT INTO t32 VALUES(0), (0); + # Ensure that all changes before the server is killed are persisted. + set global innodb_flush_log_at_trx_commit=1; +@@ -897,7 +897,7 @@ + # increasing the counter + CREATE TABLE t33 ( + a BIGINT NOT NULL PRIMARY KEY, +-b BIGINT NOT NULL AUTO_INCREMENT, KEY(b)) ENGINE = InnoDB; ++b BIGINT NOT NULL AUTO_INCREMENT, INDEX(b DESC)) ENGINE = InnoDB; + INSERT INTO t33 VALUES(1, NULL); + INSERT INTO t33 VALUES(2, NULL); + INSERT INTO t33 VALUES(2, NULL); +@@ -965,7 +965,7 @@ + DROP TABLE t33; + CREATE TABLE t33 ( + a BIGINT NOT NULL PRIMARY KEY, +-b BIGINT NOT NULL AUTO_INCREMENT, KEY(b)) ENGINE = InnoDB; ++b BIGINT NOT NULL AUTO_INCREMENT, INDEX(b DESC)) ENGINE = InnoDB; + ALTER TABLE t33 DISCARD TABLESPACE; + restore: t33 .ibd and .cfg files + ALTER TABLE t33 IMPORT TABLESPACE; diff --git a/mysql-test/suite/innodb/r/autoinc_persist.result b/mysql-test/suite/innodb/r/autoinc_persist.result index ee796160406..91d6d908a82 100644 --- a/mysql-test/suite/innodb/r/autoinc_persist.result +++ b/mysql-test/suite/innodb/r/autoinc_persist.result @@ -242,7 +242,7 @@ DELETE FROM t9 WHERE a > 100000000000; SELECT MAX(a) AS `Expect 100000000000` FROM t9; Expect 100000000000 100000000000 -CREATE TABLE t13(a INT AUTO_INCREMENT PRIMARY KEY) ENGINE = InnoDB, +CREATE TABLE t13(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB, AUTO_INCREMENT = 1234; # restart SHOW CREATE TABLE t13; @@ -882,8 +882,7 @@ a b 5 4 SET SQL_MODE = 0; # Scenario 10: Rollback would not rollback the counter -CREATE TABLE t32 ( -a BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +CREATE TABLE t32 (a BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t32 VALUES(0), (0); # Ensure that all changes before the server is killed are persisted. set global innodb_flush_log_at_trx_commit=1; @@ -898,8 +897,7 @@ ROLLBACK; # increasing the counter CREATE TABLE t33 ( a BIGINT NOT NULL PRIMARY KEY, -b BIGINT NOT NULL AUTO_INCREMENT, -KEY(b)) ENGINE = InnoDB; +b BIGINT NOT NULL AUTO_INCREMENT, KEY(b)) ENGINE = InnoDB; INSERT INTO t33 VALUES(1, NULL); INSERT INTO t33 VALUES(2, NULL); INSERT INTO t33 VALUES(2, NULL); @@ -967,8 +965,7 @@ UNLOCK TABLES; DROP TABLE t33; CREATE TABLE t33 ( a BIGINT NOT NULL PRIMARY KEY, -b BIGINT NOT NULL AUTO_INCREMENT, -KEY(b)) ENGINE = InnoDB; +b BIGINT NOT NULL AUTO_INCREMENT, KEY(b)) ENGINE = InnoDB; ALTER TABLE t33 DISCARD TABLESPACE; restore: t33 .ibd and .cfg files ALTER TABLE t33 IMPORT TABLESPACE; diff --git a/mysql-test/suite/innodb/r/innodb-index.result b/mysql-test/suite/innodb/r/innodb-index.result index 1bcb4e620bb..b0c0c26afd4 100644 --- a/mysql-test/suite/innodb/r/innodb-index.result +++ b/mysql-test/suite/innodb/r/innodb-index.result @@ -1947,3 +1947,51 @@ Warnings: Warning 1082 InnoDB: Table test/t contains 0 indexes inside InnoDB, which is different from the number of indexes 1 defined in the MariaDB Warning 1082 InnoDB: Table test/t contains 0 indexes inside InnoDB, which is different from the number of indexes 1 defined in the MariaDB DROP TABLE t; +# +# MDEV-27374 InnoDB table becomes corrupt after renaming DESC-indexed column +# +CREATE TABLE t1 (a VARCHAR(8), PRIMARY KEY(a DESC)) ENGINE=InnoDB; +ALTER TABLE t1 RENAME COLUMN a TO b, ALGORITHM=INPLACE; +SELECT TABLE_ID INTO @table_id FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME="test/t1"; +SELECT INDEX_ID INTO @index_id FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = @table_id; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS WHERE INDEX_ID=@index_id; +NAME +b +DROP TABLE t1; +# +# MDEV-27432 ASC/DESC primary and unique keys cause index +# inconsistency between InnoDB and server +# +CREATE TABLE t1 (id INT NOT NULL, UNIQUE(id DESC)) ENGINE=InnoDB; +ALTER TABLE t1 ADD PRIMARY KEY (id), ALGORITHM=INPLACE; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1; +# +# MDEV-27445 Index inconsistency and assertion failure after +# renaming virtual column with DESC key +# +CREATE TABLE t1(a INT, b INT AS (a), KEY(a, b DESC)) ENGINE=InnoDB; +ALTER TABLE t1 RENAME COLUMN IF EXISTS b TO v; +ALTER TABLE t1 FORCE; +DROP TABLE t1; +# +# MDEV-27592 DESC primary index fails to set wide format +# while renaming the column +# +CREATE TABLE t1 (id INT PRIMARY KEY, a CHAR(8), b INT, KEY(a DESC,b)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'foo',10); +ALTER TABLE t1 RENAME COLUMN b TO c, ALGORITHM=INPLACE; +SELECT TABLE_ID INTO @table_id FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME="test/t1"; +SELECT INDEX_ID INTO @index_id FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = @table_id ORDER BY INDEX_ID DESC LIMIT 1; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS WHERE INDEX_ID=@index_id; +NAME +a +c +DROP TABLE t1; +# End of 10.8 tests diff --git a/mysql-test/suite/innodb/t/autoinc_persist.combinations b/mysql-test/suite/innodb/t/autoinc_persist.combinations new file mode 100644 index 00000000000..4ae2948e523 --- /dev/null +++ b/mysql-test/suite/innodb/t/autoinc_persist.combinations @@ -0,0 +1,2 @@ +[asc] +[desc] diff --git a/mysql-test/suite/innodb/t/autoinc_persist.test b/mysql-test/suite/innodb/t/autoinc_persist.test index 6e094b40e02..c6135b5580c 100644 --- a/mysql-test/suite/innodb/t/autoinc_persist.test +++ b/mysql-test/suite/innodb/t/autoinc_persist.test @@ -2,6 +2,19 @@ # Restarting is not supported when testing the embedded server. --source include/not_embedded.inc +if ($MTR_COMBINATION_DESC) { + let $AUTO_INCREMENT_KEY_a= AUTO_INCREMENT, PRIMARY KEY(a DESC); + let $AUTO_INCREMENT_KEY_b= AUTO_INCREMENT, INDEX(b DESC); + let $AUTO_INCREMENT_PRIMARY_KEY_a= AUTO_INCREMENT, PRIMARY KEY(a DESC); + let $AUTO_INCREMENT_PRIMARY_KEY_b= AUTO_INCREMENT, ADD PRIMARY KEY(b DESC); +} +if (!$MTR_COMBINATION_DESC) { + let $AUTO_INCREMENT_KEY_a= AUTO_INCREMENT KEY; + let $AUTO_INCREMENT_KEY_b= AUTO_INCREMENT, KEY(b); + let $AUTO_INCREMENT_PRIMARY_KEY_a= AUTO_INCREMENT PRIMARY KEY; + let $AUTO_INCREMENT_PRIMARY_KEY_b= AUTO_INCREMENT PRIMARY KEY; +} + --echo # --echo # MDEV-6076 Persistent AUTO_INCREMENT for InnoDB --echo # @@ -20,72 +33,72 @@ SET SQL_MODE='STRICT_ALL_TABLES'; -CREATE TABLE t1(a TINYINT AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t1(a TINYINT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; INSERT INTO t1 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31); SELECT * FROM t1; -CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t2(a TINYINT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; --error ER_WARN_DATA_OUT_OF_RANGE INSERT INTO t2 VALUES(-5); INSERT INTO t2 VALUES(0), (0), (0), (0), (8), (10), (0), (20), (30), (31); SELECT * FROM t2; -CREATE TABLE t3(a SMALLINT AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t3(a SMALLINT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; INSERT INTO t3 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31), (1024), (4096); SELECT * FROM t3; -CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t4(a SMALLINT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; --error ER_WARN_DATA_OUT_OF_RANGE INSERT INTO t4 VALUES(-5); INSERT INTO t4 VALUES(0), (0), (0), (0), (8), (10), (0), (20), (30), (31), (1024), (4096); SELECT * FROM t4; -CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t5(a MEDIUMINT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; INSERT INTO t5 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31), (1000000), (1000005); SELECT * FROM t5; -CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t6(a MEDIUMINT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; --error ER_WARN_DATA_OUT_OF_RANGE INSERT INTO t6 VALUES(-5); INSERT INTO t6 VALUES(0), (0), (0), (0), (8), (10), (0), (20), (30), (31), (1000000), (1000005); SELECT * FROM t6; -CREATE TABLE t7(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t7(a INT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; INSERT INTO t7 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31), (100000000), (100000008); SELECT * FROM t7; -CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t8(a INT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; --error ER_WARN_DATA_OUT_OF_RANGE INSERT INTO t8 VALUES(-5); INSERT INTO t8 VALUES(0), (0), (0), (0), (8), (10), (0), (20), (30), (31), (100000000), (100000008); SELECT * FROM t8; -CREATE TABLE t9(a BIGINT AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t9(a BIGINT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; INSERT INTO t9 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31), (100000000000), (100000000006); SELECT * FROM t9; -CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t10(a BIGINT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; --error ER_WARN_DATA_OUT_OF_RANGE INSERT INTO t10 VALUES(-5); INSERT INTO t10 VALUES(0), (0), (0), (0), (8), (10), (0), (20), (30), (31), (100000000000), (100000000006); SELECT * FROM t10; -CREATE TABLE t11(a FLOAT AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t11(a FLOAT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31); SELECT * FROM t11; -CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB; +eval CREATE TABLE t12(a DOUBLE $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB; INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31); SELECT * FROM t12; @@ -105,7 +118,7 @@ SELECT MAX(a) AS `Expect 100000000` FROM t7; DELETE FROM t9 WHERE a > 100000000000; SELECT MAX(a) AS `Expect 100000000000` FROM t9; -CREATE TABLE t13(a INT AUTO_INCREMENT PRIMARY KEY) ENGINE = InnoDB, +eval CREATE TABLE t13(a INT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB, AUTO_INCREMENT = 1234; --source include/restart_mysqld.inc @@ -439,7 +452,7 @@ INSERT INTO t3 VALUES(0), (0), (200), (210); --echo # Scenario 9: Test the sql_mode = NO_AUTO_VALUE_ON_ZERO -CREATE TABLE t30 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, key(b)) ENGINE = InnoDB; +eval CREATE TABLE t30 (a INT NOT NULL $AUTO_INCREMENT_PRIMARY_KEY_a, b INT, key(b)) ENGINE = InnoDB; set SQL_MODE = NO_AUTO_VALUE_ON_ZERO; @@ -454,7 +467,7 @@ set global innodb_flush_log_at_trx_commit=1; CREATE TABLE t31 (a INT) ENGINE = InnoDB; INSERT INTO t31 VALUES(1), (2); -ALTER TABLE t31 ADD b INT AUTO_INCREMENT PRIMARY KEY; +eval ALTER TABLE t31 ADD b INT $AUTO_INCREMENT_PRIMARY_KEY_b; INSERT INTO t31 VALUES(3, 0), (4, NULL), (5, NULL); --error ER_DUP_ENTRY INSERT INTO t31 VALUES(6, 0); @@ -463,8 +476,7 @@ SELECT * FROM t31; SET SQL_MODE = 0; --echo # Scenario 10: Rollback would not rollback the counter -CREATE TABLE t32 ( -a BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +eval CREATE TABLE t32 (a BIGINT $AUTO_INCREMENT_PRIMARY_KEY_a) ENGINE=InnoDB; INSERT INTO t32 VALUES(0), (0); @@ -480,10 +492,9 @@ ROLLBACK; --echo # Scenario 11: Test duplicate primary key/secondary key will not stop --echo # increasing the counter -CREATE TABLE t33 ( +eval CREATE TABLE t33 ( a BIGINT NOT NULL PRIMARY KEY, -b BIGINT NOT NULL AUTO_INCREMENT, -KEY(b)) ENGINE = InnoDB; +b BIGINT NOT NULL $AUTO_INCREMENT_KEY_b) ENGINE = InnoDB; INSERT INTO t33 VALUES(1, NULL); INSERT INTO t33 VALUES(2, NULL); @@ -539,10 +550,9 @@ ib_backup_tablespaces("test", "t33"); EOF UNLOCK TABLES; DROP TABLE t33; -CREATE TABLE t33 ( +eval CREATE TABLE t33 ( a BIGINT NOT NULL PRIMARY KEY, -b BIGINT NOT NULL AUTO_INCREMENT, -KEY(b)) ENGINE = InnoDB; +b BIGINT NOT NULL $AUTO_INCREMENT_KEY_b) ENGINE = InnoDB; ALTER TABLE t33 DISCARD TABLESPACE; perl; do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; diff --git a/mysql-test/suite/innodb/t/innodb-index.test b/mysql-test/suite/innodb/t/innodb-index.test index c7aa6250da5..03cbb5aef9d 100644 --- a/mysql-test/suite/innodb/t/innodb-index.test +++ b/mysql-test/suite/innodb/t/innodb-index.test @@ -1193,6 +1193,48 @@ SHOW CREATE TABLE t; --disable_prepare_warnings DROP TABLE t; +--echo # +--echo # MDEV-27374 InnoDB table becomes corrupt after renaming DESC-indexed column +--echo # +CREATE TABLE t1 (a VARCHAR(8), PRIMARY KEY(a DESC)) ENGINE=InnoDB; +ALTER TABLE t1 RENAME COLUMN a TO b, ALGORITHM=INPLACE; +SELECT TABLE_ID INTO @table_id FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME="test/t1"; +SELECT INDEX_ID INTO @index_id FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = @table_id; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS WHERE INDEX_ID=@index_id; +DROP TABLE t1; + +--echo # +--echo # MDEV-27432 ASC/DESC primary and unique keys cause index +--echo # inconsistency between InnoDB and server +--echo # +CREATE TABLE t1 (id INT NOT NULL, UNIQUE(id DESC)) ENGINE=InnoDB; +ALTER TABLE t1 ADD PRIMARY KEY (id), ALGORITHM=INPLACE; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # +--echo # MDEV-27445 Index inconsistency and assertion failure after +--echo # renaming virtual column with DESC key +--echo # +CREATE TABLE t1(a INT, b INT AS (a), KEY(a, b DESC)) ENGINE=InnoDB; +ALTER TABLE t1 RENAME COLUMN IF EXISTS b TO v; +ALTER TABLE t1 FORCE; +DROP TABLE t1; + +--echo # +--echo # MDEV-27592 DESC primary index fails to set wide format +--echo # while renaming the column +--echo # +CREATE TABLE t1 (id INT PRIMARY KEY, a CHAR(8), b INT, KEY(a DESC,b)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'foo',10); +ALTER TABLE t1 RENAME COLUMN b TO c, ALGORITHM=INPLACE; +SELECT TABLE_ID INTO @table_id FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME="test/t1"; +SELECT INDEX_ID INTO @index_id FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = @table_id ORDER BY INDEX_ID DESC LIMIT 1; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS WHERE INDEX_ID=@index_id; +DROP TABLE t1; + +--echo # End of 10.8 tests + --disable_query_log call mtr.add_suppression("InnoDB: Tablespace .* was not found at .*t[12].ibd."); diff --git a/mysql-test/suite/innodb_fts/r/create.result b/mysql-test/suite/innodb_fts/r/create.result index 3ca24f5253d..7be9333e647 100644 --- a/mysql-test/suite/innodb_fts/r/create.result +++ b/mysql-test/suite/innodb_fts/r/create.result @@ -187,4 +187,16 @@ FTS_DOC_ID bigint unsigned not null, unique key FTS_DOC_ID_INDEX(FTS_DOC_ID, f1), fulltext (f2)) engine=innodb; -ERROR 42000: Incorrect index name 'FTS_DOC_ID_INDEX' +ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index +# +# MDEV-26938 Support descending indexes internally in InnoDB +# +CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC), FULLTEXT(b)) +ENGINE=InnoDB; +DROP TABLE t1; +CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC)) ENGINE=InnoDB; +ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE; +ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb_fts/t/create.test b/mysql-test/suite/innodb_fts/t/create.test index 38c93de4982..6f5da11a66c 100644 --- a/mysql-test/suite/innodb_fts/t/create.test +++ b/mysql-test/suite/innodb_fts/t/create.test @@ -110,10 +110,29 @@ SET GLOBAL innodb_optimize_fulltext_only= @optimize_fulltext.save; --echo # --echo # MDEV-24403 Segfault on CREATE TABLE with explicit FTS_DOC_ID_INDEX by multiple fields --echo # ---error ER_WRONG_NAME_FOR_INDEX +--error ER_INNODB_FT_WRONG_DOCID_INDEX create table t1 ( f1 int, f2 text, FTS_DOC_ID bigint unsigned not null, unique key FTS_DOC_ID_INDEX(FTS_DOC_ID, f1), fulltext (f2)) engine=innodb; + +--echo # +--echo # MDEV-26938 Support descending indexes internally in InnoDB +--echo # + +# Unfortunately, the HA_REVERSE_SORT flag is not being stored in the .frm file. +#FIXME: --error ER_INNODB_FT_WRONG_DOCID_INDEX +CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL, + UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC), FULLTEXT(b)) +ENGINE=InnoDB; +DROP TABLE t1; + +CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL, + UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC)) ENGINE=InnoDB; +#FIXME: --error ER_INNODB_FT_WRONG_DOCID_INDEX +ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE; +#FIXME: --error ER_INNODB_FT_WRONG_DOCID_INDEX +ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY; +DROP TABLE t1; |