mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-19445 heap-use-after-free related to innodb_ft_aux_table
Try to fix the race conditions between SET GLOBAL innodb_ft_aux_table = ...; and access to the INFORMATION_SCHEMA tables that depend on this variable. innodb_ft_aux_table: Replaces fts_internal_tbl_name,fts_internal_tbl_name2. Just store the user-specified parameter as is. innodb_ft_aux_table_id: The table_id corresponding to SET GLOBAL innodb_ft_aux_table, or 0 if the table does not exist or does not contain FULLTEXT INDEX. If the table is renamed later, the INFORMATION_SCHEMA tables will continue to refer to the table. If the table is dropped or rebuilt, the INFORMATION_SCHEMA tables will not find the table.
This commit is contained in:
43
mysql-test/suite/innodb_fts/t/innodb_ft_aux_table.test
Normal file
43
mysql-test/suite/innodb_fts/t/innodb_ft_aux_table.test
Normal file
@ -0,0 +1,43 @@
|
||||
--source include/have_innodb.inc
|
||||
|
||||
CREATE TABLE t1 (v VARCHAR(100), FULLTEXT INDEX (v)) ENGINE=InnoDB;
|
||||
|
||||
insert into t1 VALUES('First record'),('Second record'),('Third record');
|
||||
|
||||
SET @save_ft_aux_table = @@GLOBAL.innodb_ft_aux_table;
|
||||
|
||||
connect (con1,localhost,root,,);
|
||||
--error ER_WRONG_VALUE_FOR_VAR
|
||||
SET GLOBAL innodb_ft_aux_table = 'test/t0';
|
||||
connection default;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_BEING_DELETED;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;
|
||||
connection con1;
|
||||
SET GLOBAL innodb_ft_aux_table = 'test/t1';
|
||||
disconnect con1;
|
||||
connection default;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_BEING_DELETED;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;
|
||||
SELECT @@GLOBAL.innodb_ft_aux_table;
|
||||
RENAME TABLE t1 TO t2;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_BEING_DELETED;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;
|
||||
SELECT @@GLOBAL.innodb_ft_aux_table;
|
||||
DROP TABLE t2;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_BEING_DELETED;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;
|
||||
SELECT @@GLOBAL.innodb_ft_aux_table;
|
||||
SET GLOBAL innodb_ft_aux_table = @save_ft_aux_table;
|
Reference in New Issue
Block a user