mirror of
https://github.com/MariaDB/server.git
synced 2025-11-02 02:53:04 +03:00
1. In case of system-versioned table add row_end into FTS_DOC_ID index
in fts_create_common_tables() and innobase_create_key_defs().
fts_n_uniq() returns 1 or 2 depending on whether the table is
system-versioned.
After this patch recreate of FTS_DOC_ID index is required for
existing system-versioned tables. If you see this message in error
log or server warnings: "InnoDB: Table db/t1 contains 2 indexes
inside InnoDB, which is different from the number of indexes 1
defined in the MariaDB" use this command to fix the table:
ALTER TABLE db.t1 FORCE;
2. Fix duplicate history for secondary unique index like it was done
in MDEV-23644 for clustered index (932ec586aa). In case of
existing history row which conflicts with currently inseted row we
check in row_ins_scan_sec_index_for_duplicate() whether that row
was inserted as part of current transaction. In that case we
indicate with DB_FOREIGN_DUPLICATE_KEY that new history row is not
needed and should be silently skipped.
3. Some parts of MDEV-21138 (7410ff436e) reverted. Skipping of
FTS_DOC_ID index for history rows made problems with purge
system. Now this is fixed differently by p.2.
4. wait_all_purged.inc checks that we didn't affect non-history rows
so they are deleted and purged correctly.
Additional FTS fixes
fts_init_get_doc_id(): exclude history rows from max_doc_id
calculation. fts_init_get_doc_id() callback is used only for crash
recovery.
fts_add_doc_by_id(): set max value for row_end field.
fts_read_stopword(): stopwords table can be system-versioned too. We
now read stopwords only for current data.
row_insert_for_mysql(): exclude history rows from doc_id validation.
row_merge_read_clustered_index(): exclude history_rows from doc_id
processing.
fts_load_user_stopword(): for versioned table retrieve row_end field
and skip history rows. For non-versioned table we retrieve 'value'
field twice (just for uniformity).
FTS tests for System Versioning now include maybe_versioning.inc which
adds 3 combinations:
'vers' for debug build sets sysvers_force and
sysvers_hide. sysvers_force makes every created table
system-versioned, sysvers_hide hides WITH SYSTEM VERSIONING
for SHOW CREATE.
Note: basic.test, stopword.test and versioning.test do not
require debug for 'vers' combination. This is controlled by
$modify_create_table in maybe_versioning.inc and these
tests run WITH SYSTEM VERSIONING explicitly which allows to
test 'vers' combination on non-debug builds.
'vers_trx' like 'vers' sets sysvers_force_trx and sysvers_hide. That
tests FTS with trx_id-based System Versioning.
'orig' works like before: no System Versioning is added, no debug is
required.
Upgrade/downgrade test for System Versioning is done by
innodb_fts.versioning. It has 2 combinations:
'prepare' makes binaries in std_data (requires old server and OLD_BINDIR).
It tests upgrade/downgrade against old server as well.
'upgrade' tests upgrade against binaries in std_data.
Cleanups:
Removed innodb-fts-stopword.test as it duplicates stopword.test
97 lines
3.2 KiB
Plaintext
97 lines
3.2 KiB
Plaintext
# Miscellanous FULLTEXT INDEX tests for debug-instrumented servers.
|
|
# Note: These tests used to be part of a larger test, innodb_fts_misc_debug
|
|
# or innodb_fts.misc_debug. A large part of that test can be run on a
|
|
# non-debug server and has been renamed to innodb_fts.crash_recovery.
|
|
|
|
--source include/have_innodb.inc
|
|
--source include/have_debug.inc
|
|
--source include/have_debug_sync.inc
|
|
--source include/count_sessions.inc
|
|
--source include/maybe_versioning.inc
|
|
|
|
# Following test is for Bug 14668777 - ASSERT ON IB_VECTOR_SIZE(
|
|
# TABLE->FTS->INDEXES, ALTER TABLE
|
|
CREATE TABLE articles (
|
|
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
|
title VARCHAR(200),
|
|
body TEXT,
|
|
FULLTEXT (title,body)
|
|
) ENGINE=InnoDB;
|
|
|
|
# Abort the operation in dict_create_index_step by setting
|
|
# return status of dict_create_index_tree_step() to DB_OUT_OF_MEMORY
|
|
# The newly create dict_index_t should be removed from fts cache
|
|
SET @saved_debug_dbug = @@SESSION.debug_dbug;
|
|
SET SESSION debug_dbug="+d,ib_dict_create_index_tree_fail";
|
|
--error ER_OUT_OF_RESOURCES
|
|
CREATE FULLTEXT INDEX idx ON articles(body);
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
|
|
# This simply go through ha_innobase::commit_inplace_alter_table
|
|
# and do a fts_check_cached_index()
|
|
ALTER TABLE articles STATS_PERSISTENT=DEFAULT;
|
|
|
|
DROP TABLE articles;
|
|
|
|
# This test used to be called innodb_fts.innobase_drop_fts_index_table:
|
|
|
|
CREATE TABLE t (a INT, b TEXT) engine=innodb;
|
|
SET debug_dbug='+d,alter_table_rollback_new_index';
|
|
-- error ER_UNKNOWN_ERROR
|
|
ALTER TABLE t ADD FULLTEXT INDEX (b(64));
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
|
|
DROP TABLE t;
|
|
|
|
# MDEV-21550 Assertion `!table->fts->in_queue' failed in
|
|
# fts_optimize_remove_table
|
|
CREATE TABLE t1 (pk INT, a VARCHAR(8), PRIMARY KEY(pk),
|
|
FULLTEXT KEY(a)) ENGINE=InnoDB;
|
|
CREATE TABLE t2 (b INT, FOREIGN KEY(b) REFERENCES t1(pk)) ENGINE=InnoDB;
|
|
--error ER_ROW_IS_REFERENCED_2
|
|
DROP TABLE t1;
|
|
SET DEBUG_DBUG="+d,fts_instrument_sync";
|
|
INSERT INTO t1 VALUES(1, "mariadb");
|
|
ALTER TABLE t1 FORCE;
|
|
# Cleanup
|
|
DROP TABLE t2, t1;
|
|
|
|
--echo #
|
|
--echo # MDEV-25200 Index count mismatch due to aborted FULLTEXT INDEX
|
|
--echo #
|
|
CREATE TABLE t1(a INT, b TEXT, c TEXT, FULLTEXT INDEX(b)) ENGINE=InnoDB;
|
|
connect(con1,localhost,root,,test);
|
|
SET DEBUG_DBUG="+d,innodb_OOM_inplace_alter";
|
|
SET DEBUG_SYNC='innodb_commit_inplace_alter_table_enter SIGNAL s2 WAIT_FOR g2';
|
|
send ALTER TABLE t1 ADD FULLTEXT(c);
|
|
connection default;
|
|
SET DEBUG_SYNC='now WAIT_FOR s2';
|
|
START TRANSACTION;
|
|
SELECT * FROM t1;
|
|
SET DEBUG_SYNC='now SIGNAL g2';
|
|
connection con1;
|
|
--error ER_OUT_OF_RESOURCES
|
|
reap;
|
|
disconnect con1;
|
|
connection default;
|
|
SET DEBUG_SYNC=RESET;
|
|
# Exploit MDEV-17468 to force the table definition to be reloaded
|
|
ALTER TABLE t1 ADD bl INT AS (LENGTH(b)) VIRTUAL;
|
|
CHECK TABLE t1;
|
|
DROP TABLE t1;
|
|
--source include/wait_until_count_sessions.inc
|
|
|
|
--echo #
|
|
--echo # MDEV-25663 Double free of transaction during TRUNCATE
|
|
--echo #
|
|
call mtr.add_suppression("InnoDB: \\(Too many concurrent transactions\\)");
|
|
SET @save_dbug= @@debug_dbug;
|
|
|
|
CREATE TABLE t1 (b CHAR(12), FULLTEXT KEY(b)) engine=InnoDB;
|
|
SET debug_dbug='+d,ib_create_table_fail_too_many_trx';
|
|
--error ER_GET_ERRNO
|
|
TRUNCATE t1;
|
|
SET debug_dbug=@save_dbug;
|
|
DROP TABLE t1;
|
|
--echo # End of 10.3 tests
|