| Bug #70333 | InnoDB Fulltext search doesn't find records when savepoints are involved | ||
|---|---|---|---|
| Submitted: | 13 Sep 2013 14:15 | Modified: | 11 Oct 2013 16:15 |
| Reporter: | Saverio Miroddi | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: FULLTEXT search | Severity: | S3 (Non-critical) |
| Version: | 5.6.13 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[14 Sep 2013 8:04]
MySQL Verification Team
Hello Saverio, Thank you for the bug report and test case. Verified as described. Thanks, Umesh
[11 Oct 2013 16:15]
Paul DuBois
Noted in 5.6.15, 5.7.3 changelogs. InnoDB full-text searches failed to find records within transactions that included savepoints.
[4 Dec 2013 11:53]
Laurynas Biveinis
5.6$ bzr log -r 5506 ------------------------------------------------------------ revno: 5506 committer: Shaohua Wang <shaohua.wang@oracle.com> branch nick: mysql-5.6-bugfix2 timestamp: Wed 2013-10-09 19:00:56 +0800 message: BUG#17458835 - INNODB FULLTEXT SEARCH DOESN'T FIND RECORDS WHEN SAVEPOINTS ARE INVOLVED Analysis & Solution: we simply free a savepoint when releasing a savepoint in which holds all rows including newly inserted rows, so we get rows lost. The solution is putting the last savepoint's rows to top savepoint. rb://3529 approved by Jimmy.Yang

Description: I've found a case where the InnoDB FULLLTEXT search doesn't found the records in an FT search. Test case provided. Notes about the test case: - Removing the SAVEPOINT statements solves the problem - Any record added after the RELEASE SAVEPOINT is not affected by the problem - Note that adding another filling records doesn't solve the problem. How to repeat: DROP TABLE IF EXISTS test_table; CREATE TABLE test_table ( id int(11) NOT NULL, keywords varchar(2048) NOT NULL, PRIMARY KEY (id), FULLTEXT KEY index_test_table_on_keywords (keywords) ) ENGINE=InnoDB; BEGIN; INSERT INTO test_table( id, keywords ) VALUES( 40, '' ); SAVEPOINT active_record_1; INSERT INTO test_table( id, keywords ) VALUES( 38, 'has_amount_due' ); RELEASE SAVEPOINT active_record_1; COMMIT; ################ TESTING CODE #################### SELECT '>>>>> Table contents:' ``; SELECT * FROM test_table; SELECT '>>>>> Not found!:' ``; SELECT * FROM test_table WHERE MATCH(keywords) AGAINST('has_amount_due'); SELECT '>>>>> Optimizing table - still not found!:' ``; OPTIMIZE TABLE test_table; SELECT * FROM test_table WHERE MATCH(keywords) AGAINST('has_amount_due'); SELECT '>>>>> Copied table - record found!:' ``; DROP TABLE IF EXISTS test_table_copy; CREATE TABLE test_table_copy LIKE test_table; INSERT INTO test_table_copy SELECT * FROM test_table; SELECT * FROM test_table_copy WHERE MATCH(keywords) AGAINST('has_amount_due');