summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThirunarayanan Balathandayuthapani <thiru@mariadb.com>2022-07-01 14:00:57 +0530
committerMarko Mäkelä <marko.makela@mariadb.com>2022-07-01 13:03:52 +0300
commit990cde800a4aafc5f5647eb06db3eec461fd172a (patch)
tree8b45c2f120da1446e324c7ae080e583a0148781e
parent7c35ad16e39591a044fe08cb692888a7f6502847 (diff)
downloadmariadb-git-990cde800a4aafc5f5647eb06db3eec461fd172a.tar.gz
MDEV-28912 NON-UNIQUE FTS_DOC_ID index mistaken as FTS_DOC_ID_INDEX
- InnoDB mistakenly identifies the non-unique FTS_DOC_ID index as FTS_DOC_ID_INDEX while loading the table. dict_load_indexes() should check whether the index is unique before assigning fts_doc_id_index
-rw-r--r--mysql-test/suite/innodb_fts/r/fulltext2.result7
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext2.test11
-rw-r--r--storage/innobase/dict/dict0load.cc5
3 files changed, 22 insertions, 1 deletions
diff --git a/mysql-test/suite/innodb_fts/r/fulltext2.result b/mysql-test/suite/innodb_fts/r/fulltext2.result
index 8f8135b35cd..e9a089ab80d 100644
--- a/mysql-test/suite/innodb_fts/r/fulltext2.result
+++ b/mysql-test/suite/innodb_fts/r/fulltext2.result
@@ -271,3 +271,10 @@ fts_doc_id first_name last_name score
6 Ned Flanders 0
7 Nelson Muntz 0
DROP TABLE t1;
+CREATE TABLE t1(a INT, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
+KEY FTS_DOC_ID_INDEX(FTS_DOC_ID))ENGINE=InnoDB;
+ALTER TABLE t1 ADD COLUMN c INT as (a) VIRTUAL;
+ALTER TABLE t1 ADD d INT NULL;
+ALTER TABLE t1 ADD FULLTEXT(b);
+ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext2.test b/mysql-test/suite/innodb_fts/t/fulltext2.test
index 4dd2c78827f..1e3894644a0 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext2.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext2.test
@@ -257,3 +257,14 @@ INSERT INTO t1 (id, first_name, last_name) VALUES
analyze table t1;
SELECT fts_doc_id, first_name, last_name, MATCH(first_name) AGAINST('Homer' IN BOOLEAN MODE) AS score FROM t1;
DROP TABLE t1;
+
+#
+# MDEV-28912 NON-UNIQUE FTS_DOC_ID mistaken as FTS_DOC_ID_INDEX
+#
+CREATE TABLE t1(a INT, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
+ KEY FTS_DOC_ID_INDEX(FTS_DOC_ID))ENGINE=InnoDB;
+ALTER TABLE t1 ADD COLUMN c INT as (a) VIRTUAL;
+ALTER TABLE t1 ADD d INT NULL;
+--error ER_INNODB_FT_WRONG_DOCID_INDEX
+ALTER TABLE t1 ADD FULLTEXT(b);
+DROP TABLE t1;
diff --git a/storage/innobase/dict/dict0load.cc b/storage/innobase/dict/dict0load.cc
index b02b480f407..6b34b89b4f4 100644
--- a/storage/innobase/dict/dict0load.cc
+++ b/storage/innobase/dict/dict0load.cc
@@ -2590,8 +2590,11 @@ next_rec:
ut_ad(table->fts_doc_id_index == NULL);
if (table->fts != NULL) {
- table->fts_doc_id_index = dict_table_get_index_on_name(
+ dict_index_t *idx = dict_table_get_index_on_name(
table, FTS_DOC_ID_INDEX_NAME);
+ if (idx && dict_index_is_unique(idx)) {
+ table->fts_doc_id_index = idx;
+ }
}
/* If the table contains FTS indexes, populate table->fts->indexes */