Commit 9a791c9c authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-12676 MySQL#78423 InnoDB FTS duplicate key error

fts_get_next_doc_id(): Assign the first and subsequent FTS_DOC_ID
in the same way: by post-incrementing the cached value.
If there is a user-specified FTS_DOC_ID, do not touch the internal
sequence.
parent 1eee3a3f
CREATE TABLE t1(a VARCHAR(5),FULLTEXT KEY(a)) ENGINE=InnoDB;
SET DEBUG_SYNC = 'get_next_FTS_DOC_ID SIGNAL prepared WAIT_FOR race';
REPLACE INTO t1(a) values('aaa');
SET DEBUG_SYNC = 'now WAIT_FOR prepared';
REPLACE INTO t1(a) VALUES('aaa');
SET DEBUG_SYNC = 'now SIGNAL race';
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1;
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
CREATE TABLE t1(a VARCHAR(5),FULLTEXT KEY(a)) ENGINE=InnoDB;
SET DEBUG_SYNC = 'get_next_FTS_DOC_ID SIGNAL prepared WAIT_FOR race';
--send
REPLACE INTO t1(a) values('aaa');
connect(dml, localhost, root, ,);
SET DEBUG_SYNC = 'now WAIT_FOR prepared';
REPLACE INTO t1(a) VALUES('aaa');
SET DEBUG_SYNC = 'now SIGNAL race';
disconnect dml;
connection default;
reap;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1;
......@@ -2644,22 +2644,23 @@ fts_get_next_doc_id(
will consult the CONFIG table and user table to re-establish
the initial value of the Doc ID */
if (cache->first_doc_id != 0 || !fts_init_doc_id(table)) {
if (!DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS_HAS_DOC_ID)) {
*doc_id = FTS_NULL_DOC_ID;
return(DB_SUCCESS);
if (!DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS_HAS_DOC_ID)) {
if (cache->first_doc_id == FTS_NULL_DOC_ID) {
fts_init_doc_id(table);
}
*doc_id = FTS_NULL_DOC_ID;
return(DB_SUCCESS);
}
/* Otherwise, simply increment the value in cache */
mutex_enter(&cache->doc_id_lock);
*doc_id = ++cache->next_doc_id;
mutex_exit(&cache->doc_id_lock);
} else {
mutex_enter(&cache->doc_id_lock);
*doc_id = cache->next_doc_id;
mutex_exit(&cache->doc_id_lock);
if (cache->first_doc_id == FTS_NULL_DOC_ID) {
fts_init_doc_id(table);
}
DEBUG_SYNC_C("get_next_FTS_DOC_ID");
mutex_enter(&cache->doc_id_lock);
*doc_id = cache->next_doc_id++;
mutex_exit(&cache->doc_id_lock);
return(DB_SUCCESS);
}
......
......@@ -2644,22 +2644,23 @@ fts_get_next_doc_id(
will consult the CONFIG table and user table to re-establish
the initial value of the Doc ID */
if (cache->first_doc_id != 0 || !fts_init_doc_id(table)) {
if (!DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS_HAS_DOC_ID)) {
*doc_id = FTS_NULL_DOC_ID;
return(DB_SUCCESS);
if (!DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS_HAS_DOC_ID)) {
if (cache->first_doc_id == FTS_NULL_DOC_ID) {
fts_init_doc_id(table);
}
*doc_id = FTS_NULL_DOC_ID;
return(DB_SUCCESS);
}
/* Otherwise, simply increment the value in cache */
mutex_enter(&cache->doc_id_lock);
*doc_id = ++cache->next_doc_id;
mutex_exit(&cache->doc_id_lock);
} else {
mutex_enter(&cache->doc_id_lock);
*doc_id = cache->next_doc_id;
mutex_exit(&cache->doc_id_lock);
if (cache->first_doc_id == FTS_NULL_DOC_ID) {
fts_init_doc_id(table);
}
DEBUG_SYNC_C("get_next_FTS_DOC_ID");
mutex_enter(&cache->doc_id_lock);
*doc_id = cache->next_doc_id++;
mutex_exit(&cache->doc_id_lock);
return(DB_SUCCESS);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment