Skip to content

Commit 72177d5

Browse files
author
Sergey Glukhov
committed
Bug#21140088 MATCH AGAINST: ASSERTION FAILED: !TABLE || (!TABLE->READ_SET || BITMAP_IS_SET
Outer reference can not be used as argument of the MATCH function. Added check for outer reference. Fix for bug#19828320 is removed since not needed anymore.
1 parent 52c2b27 commit 72177d5

File tree

9 files changed

+51
-15
lines changed

9 files changed

+51
-15
lines changed

mysql-test/r/fulltext.result

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ MATCH(a) AGAINST('aaa1* aaa14 aaa15 aaa16' IN BOOLEAN MODE)
579579
DROP TABLE t1;
580580
CREATE TABLE t1(a TEXT);
581581
SELECT GROUP_CONCAT(a) AS st FROM t1 HAVING MATCH(st) AGAINST('test' IN BOOLEAN MODE);
582-
ERROR HY000: Incorrect arguments to AGAINST
582+
ERROR HY000: Incorrect arguments to MATCH
583583
DROP TABLE t1;
584584
CREATE TABLE t1(a VARCHAR(64), FULLTEXT(a));
585585
INSERT INTO t1 VALUES('awrd bwrd cwrd'),('awrd bwrd cwrd'),('awrd bwrd cwrd');
@@ -735,5 +735,5 @@ CREATE TABLE z(a INTEGER) engine=innodb;
735735
CREATE TABLE q(b TEXT CHARSET latin1, fulltext(b)) engine=innodb;
736736
explain format=json SELECT 1 FROM q
737737
WHERE (SELECT MATCH(b) AGAINST ('*') FROM z);
738-
ERROR 42000: syntax error, unexpected $end, expecting FTS_TERM or FTS_NUMB or '*'
738+
ERROR HY000: Incorrect arguments to MATCH
739739
DROP TABLE z, q;

mysql-test/r/fulltext3.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ DROP TABLE t1;
2020
#
2121
CREATE TABLE t1 (a TEXT CHARSET LATIN1, FULLTEXT(a)) ENGINE=INNODB;
2222
SELECT (SELECT 1 FROM (SELECT 1) foo WHERE MATCH(`a`) AGAINST ('')) FROM t1;
23-
(SELECT 1 FROM (SELECT 1) foo WHERE MATCH(`a`) AGAINST (''))
23+
ERROR HY000: Incorrect arguments to MATCH
2424
DROP TABLE t1;

mysql-test/suite/innodb_fts/r/fulltext.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ MATCH(a) AGAINST('aaa1* aaa14 aaa15 aaa16' IN BOOLEAN MODE)
526526
DROP TABLE t1;
527527
CREATE TABLE t1(a TEXT) ENGINE = InnoDB;
528528
SELECT GROUP_CONCAT(a) AS st FROM t1 HAVING MATCH(st) AGAINST('test' IN BOOLEAN MODE);
529-
ERROR HY000: Incorrect arguments to AGAINST
529+
ERROR HY000: Incorrect arguments to MATCH
530530
DROP TABLE t1;
531531
CREATE TABLE t1(a VARCHAR(64), FULLTEXT(a)) ENGINE = InnoDB;
532532
INSERT INTO t1 VALUES('awrd bwrd cwrd'),('awrd bwrd cwrd'),('awrd bwrd cwrd');

mysql-test/suite/innodb_fts/r/opt.result

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,3 +1593,22 @@ EXPLAIN
15931593
Warnings:
15941594
Note 1003 /* select#1 */ select 1 AS `1` from `test`.`t1` where (1.238585e+308 <= (match `test`.`t1`.`f1` against ('1' in boolean mode)))
15951595
DROP TABLE t1;
1596+
#
1597+
# Bug#21140088 MATCH AGAINST: ASSERTION FAILED: !TABLE || (!TABLE->READ_SET || BITMAP_IS_SET
1598+
#
1599+
SET sql_mode='';
1600+
Warnings:
1601+
Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
1602+
CREATE TABLE t1(a INT) ENGINE=INNODB;
1603+
CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=INNODB;
1604+
INSERT INTO t2 VALUES ('a'),('b');
1605+
SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1') FROM t1) FROM t2 GROUP BY "a";
1606+
ERROR HY000: Incorrect arguments to MATCH
1607+
DROP TABLE t1, t2;
1608+
CREATE TABLE t1(a INT) ENGINE=MyISAM;
1609+
CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=MyISAM;
1610+
INSERT INTO t2 VALUES ('a'),('b');
1611+
SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1' in BOOLEAN MODE) FROM t1) FROM t2 GROUP BY "a";
1612+
ERROR HY000: Incorrect arguments to MATCH
1613+
DROP TABLE t1, t2;
1614+
SET sql_mode=default;

mysql-test/suite/innodb_fts/t/opt.test

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,3 +971,24 @@ EXPLAIN SELECT 1 FROM t1 WHERE 1.238585e+308 <= MATCH(f1) AGAINST ('1' IN BOOLEA
971971
EXPLAIN FORMAT = JSON SELECT 1 FROM t1 WHERE 1.238585e+308 <= MATCH(f1) AGAINST ('1' IN BOOLEAN MODE);
972972

973973
DROP TABLE t1;
974+
975+
--echo #
976+
--echo # Bug#21140088 MATCH AGAINST: ASSERTION FAILED: !TABLE || (!TABLE->READ_SET || BITMAP_IS_SET
977+
--echo #
978+
979+
SET sql_mode='';
980+
CREATE TABLE t1(a INT) ENGINE=INNODB;
981+
CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=INNODB;
982+
INSERT INTO t2 VALUES ('a'),('b');
983+
--error ER_WRONG_ARGUMENTS
984+
SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1') FROM t1) FROM t2 GROUP BY "a";
985+
DROP TABLE t1, t2;
986+
987+
CREATE TABLE t1(a INT) ENGINE=MyISAM;
988+
CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=MyISAM;
989+
INSERT INTO t2 VALUES ('a'),('b');
990+
--error ER_WRONG_ARGUMENTS
991+
SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1' in BOOLEAN MODE) FROM t1) FROM t2 GROUP BY "a";
992+
DROP TABLE t1, t2;
993+
994+
SET sql_mode=default;

mysql-test/t/fulltext.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ let $query=
652652
SELECT 1 FROM q
653653
WHERE (SELECT MATCH(b) AGAINST ('*') FROM z);
654654

655-
--error ER_PARSE_ERROR
655+
--error ER_WRONG_ARGUMENTS
656656
eval explain format=json $query;
657657

658658
DROP TABLE z, q;

mysql-test/t/fulltext3.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,6 @@ DROP TABLE t1;
4545
--echo #
4646

4747
CREATE TABLE t1 (a TEXT CHARSET LATIN1, FULLTEXT(a)) ENGINE=INNODB;
48+
--error ER_WRONG_ARGUMENTS
4849
SELECT (SELECT 1 FROM (SELECT 1) foo WHERE MATCH(`a`) AGAINST ('')) FROM t1;
4950
DROP TABLE t1;

sql/item_func.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7467,12 +7467,12 @@ bool Item_func_match::fix_fields(THD *thd, Item **ref)
74677467
const_item_cache=0;
74687468
for (uint i= 0 ; i < arg_count ; i++)
74697469
{
7470-
item=args[i];
7471-
if (item->type() == Item::REF_ITEM)
7472-
args[i]= item= *((Item_ref *)item)->ref;
7473-
if (item->type() != Item::FIELD_ITEM)
7470+
item= args[i]= args[i]->real_item();
7471+
if (item->type() != Item::FIELD_ITEM ||
7472+
/* Cannot use FTS index with outer table field */
7473+
(item->used_tables() & OUTER_REF_TABLE_BIT))
74747474
{
7475-
my_error(ER_WRONG_ARGUMENTS, MYF(0), "AGAINST");
7475+
my_error(ER_WRONG_ARGUMENTS, MYF(0), "MATCH");
74767476
return TRUE;
74777477
}
74787478
allows_multi_table_search &=

sql/sql_optimizer.cc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7305,11 +7305,6 @@ add_ft_keys(Key_use_array *keyuse_array,
73057305
!(usable_tables & cond_func->table_ref->map()))
73067306
return FALSE;
73077307

7308-
// Cannot do index lookup into outer table:
7309-
for (uint i= 0; i < cond_func->arg_count ; ++i)
7310-
if (!is_local_field(cond_func->arguments()[i]))
7311-
return false;
7312-
73137308
cond_func->set_simple_expression(simple_match_expr);
73147309

73157310
const Key_use keyuse(cond_func->table_ref,

0 commit comments

Comments
 (0)