| Bug #74845 | InnoDB fulltext boolean search incorrectly handles parentheses | ||
|---|---|---|---|
| Submitted: | 13 Nov 2014 23:18 | Modified: | 4 Dec 2014 15:10 |
| Reporter: | Matt Swanson | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: FULLTEXT search | Severity: | S2 (Serious) |
| Version: | 5.6.19 | OS: | Linux |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | boolean, fulltext, innodb | ||
[13 Nov 2014 23:18]
Matt Swanson
[13 Nov 2014 23:30]
MySQL Verification Team
Thank you for the bug report.
C:\dbs>c:\dbs\5.6\bin\mysql -uroot --port=3560 --debug-info --prompt="mysql 5.6 > "
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.22 Source distribution
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql 5.6 > USE test
Database changed
mysql 5.6 > -- These queries behave as expected and correctly match the first row
mysql 5.6 > SELECT * FROM `bool_test` WHERE MATCH(`content`) AGAINST('+pumpkin' IN BOOLEAN MODE);
+----+--------------------------------+
| id | content |
+----+--------------------------------+
| 1 | Pumpkin soup with cheese bread |
+----+--------------------------------+
1 row in set (0.00 sec)
mysql 5.6 > -- These queries incorrect match the first row
mysql 5.6 > SELECT * FROM `bool_test` WHERE MATCH(`content`) AGAINST('+pumpkin +(souffle)' IN BOOLEAN MODE);
+----+--------------------------------+
| id | content |
+----+--------------------------------+
| 1 | Pumpkin soup with cheese bread |
+----+--------------------------------+
1 row in set (0.00 sec)
mysql 5.6 > ALTER TABLE bool_test ENGINE = MyISAM;
Query OK, 3 rows affected (0.30 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql 5.6 > -- These queries incorrect match the first row
mysql 5.6 > SELECT * FROM `bool_test` WHERE MATCH(`content`) AGAINST('+pumpkin +(souffle)' IN BOOLEAN MODE);
Empty set (0.00 sec)
mysql 5.6 >
[4 Dec 2014 15:10]
Paul DuBois
Noted in 5.6.23, 5.7.6 changelogs. InnoDB boolean full-text searches incorrectly handled + combined with parentheses; for example, +word1 +(>word2 <word3).
[12 Feb 2015 13:23]
Laurynas Biveinis
$ git show -s 867a3c2b
commit 867a3c2b2f20884702c78432f42013a4717d028b
Author: Annamalai Gurusami <annamalai.gurusami@oracle.com>
Date: Thu Dec 4 14:23:52 2014 +0530
Bug #20028323 INNODB FULLTEXT BOOLEAN SEARCH INCORRECTLY HANDLES PARENTHESES
Problem:
InnoDB fulltext boolean queries incorrectly handle plus combined with
parentheses. For example,
+word1 +(>word2 <word3)
The query is matching any rows containing "word1" and ignoring the values in
parentheses.
The documentation mentions about the following behaviour:
'+apple +(>turnover <strudel)'
Find rows that contain the words “apple” and “turnover”, or “apple” and
“strudel” (in any order), but rank “apple turnover” higher than “apple
strudel”.
Solution:
Analysis showed that the result of the subexpression was being ignored if
it was empty. This behaviour is incorrect. Allow the subexpression to be
empty, which is necessary to handle the above case.
rb#7435 approved by Jimmy.
