Skip to content

Commit

Permalink
Bug#21140088 MATCH AGAINST: ASSERTION FAILED: !TABLE || (!TABLE->READ…
Browse files Browse the repository at this point in the history
…_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.
  • Loading branch information
Sergey Glukhov committed Jun 15, 2015
1 parent 52c2b27 commit 72177d5
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 15 deletions.
4 changes: 2 additions & 2 deletions mysql-test/r/fulltext.result
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ MATCH(a) AGAINST('aaa1* aaa14 aaa15 aaa16' IN BOOLEAN MODE)
DROP TABLE t1;
CREATE TABLE t1(a TEXT);
SELECT GROUP_CONCAT(a) AS st FROM t1 HAVING MATCH(st) AGAINST('test' IN BOOLEAN MODE);
ERROR HY000: Incorrect arguments to AGAINST
ERROR HY000: Incorrect arguments to MATCH
DROP TABLE t1;
CREATE TABLE t1(a VARCHAR(64), FULLTEXT(a));
INSERT INTO t1 VALUES('awrd bwrd cwrd'),('awrd bwrd cwrd'),('awrd bwrd cwrd');
Expand Down Expand Up @@ -735,5 +735,5 @@ CREATE TABLE z(a INTEGER) engine=innodb;
CREATE TABLE q(b TEXT CHARSET latin1, fulltext(b)) engine=innodb;
explain format=json SELECT 1 FROM q
WHERE (SELECT MATCH(b) AGAINST ('*') FROM z);
ERROR 42000: syntax error, unexpected $end, expecting FTS_TERM or FTS_NUMB or '*'
ERROR HY000: Incorrect arguments to MATCH
DROP TABLE z, q;
2 changes: 1 addition & 1 deletion mysql-test/r/fulltext3.result
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@ DROP TABLE t1;
#
CREATE TABLE t1 (a TEXT CHARSET LATIN1, FULLTEXT(a)) ENGINE=INNODB;
SELECT (SELECT 1 FROM (SELECT 1) foo WHERE MATCH(`a`) AGAINST ('')) FROM t1;
(SELECT 1 FROM (SELECT 1) foo WHERE MATCH(`a`) AGAINST (''))
ERROR HY000: Incorrect arguments to MATCH
DROP TABLE t1;
2 changes: 1 addition & 1 deletion mysql-test/suite/innodb_fts/r/fulltext.result
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@ MATCH(a) AGAINST('aaa1* aaa14 aaa15 aaa16' IN BOOLEAN MODE)
DROP TABLE t1;
CREATE TABLE t1(a TEXT) ENGINE = InnoDB;
SELECT GROUP_CONCAT(a) AS st FROM t1 HAVING MATCH(st) AGAINST('test' IN BOOLEAN MODE);
ERROR HY000: Incorrect arguments to AGAINST
ERROR HY000: Incorrect arguments to MATCH
DROP TABLE t1;
CREATE TABLE t1(a VARCHAR(64), FULLTEXT(a)) ENGINE = InnoDB;
INSERT INTO t1 VALUES('awrd bwrd cwrd'),('awrd bwrd cwrd'),('awrd bwrd cwrd');
Expand Down
19 changes: 19 additions & 0 deletions mysql-test/suite/innodb_fts/r/opt.result
Original file line number Diff line number Diff line change
Expand Up @@ -1593,3 +1593,22 @@ EXPLAIN
Warnings:
Note 1003 /* select#1 */ select 1 AS `1` from `test`.`t1` where (1.238585e+308 <= (match `test`.`t1`.`f1` against ('1' in boolean mode)))
DROP TABLE t1;
#
# Bug#21140088 MATCH AGAINST: ASSERTION FAILED: !TABLE || (!TABLE->READ_SET || BITMAP_IS_SET
#
SET sql_mode='';
Warnings:
Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
CREATE TABLE t1(a INT) ENGINE=INNODB;
CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=INNODB;
INSERT INTO t2 VALUES ('a'),('b');
SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1') FROM t1) FROM t2 GROUP BY "a";
ERROR HY000: Incorrect arguments to MATCH
DROP TABLE t1, t2;
CREATE TABLE t1(a INT) ENGINE=MyISAM;
CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=MyISAM;
INSERT INTO t2 VALUES ('a'),('b');
SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1' in BOOLEAN MODE) FROM t1) FROM t2 GROUP BY "a";
ERROR HY000: Incorrect arguments to MATCH
DROP TABLE t1, t2;
SET sql_mode=default;
21 changes: 21 additions & 0 deletions mysql-test/suite/innodb_fts/t/opt.test
Original file line number Diff line number Diff line change
Expand Up @@ -971,3 +971,24 @@ EXPLAIN SELECT 1 FROM t1 WHERE 1.238585e+308 <= MATCH(f1) AGAINST ('1' IN BOOLEA
EXPLAIN FORMAT = JSON SELECT 1 FROM t1 WHERE 1.238585e+308 <= MATCH(f1) AGAINST ('1' IN BOOLEAN MODE);

DROP TABLE t1;

--echo #
--echo # Bug#21140088 MATCH AGAINST: ASSERTION FAILED: !TABLE || (!TABLE->READ_SET || BITMAP_IS_SET
--echo #

SET sql_mode='';
CREATE TABLE t1(a INT) ENGINE=INNODB;
CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=INNODB;
INSERT INTO t2 VALUES ('a'),('b');
--error ER_WRONG_ARGUMENTS
SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1') FROM t1) FROM t2 GROUP BY "a";
DROP TABLE t1, t2;

CREATE TABLE t1(a INT) ENGINE=MyISAM;
CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=MyISAM;
INSERT INTO t2 VALUES ('a'),('b');
--error ER_WRONG_ARGUMENTS
SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1' in BOOLEAN MODE) FROM t1) FROM t2 GROUP BY "a";
DROP TABLE t1, t2;

SET sql_mode=default;
2 changes: 1 addition & 1 deletion mysql-test/t/fulltext.test
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ let $query=
SELECT 1 FROM q
WHERE (SELECT MATCH(b) AGAINST ('*') FROM z);

--error ER_PARSE_ERROR
--error ER_WRONG_ARGUMENTS
eval explain format=json $query;

DROP TABLE z, q;
1 change: 1 addition & 0 deletions mysql-test/t/fulltext3.test
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,6 @@ DROP TABLE t1;
--echo #

CREATE TABLE t1 (a TEXT CHARSET LATIN1, FULLTEXT(a)) ENGINE=INNODB;
--error ER_WRONG_ARGUMENTS
SELECT (SELECT 1 FROM (SELECT 1) foo WHERE MATCH(`a`) AGAINST ('')) FROM t1;
DROP TABLE t1;
10 changes: 5 additions & 5 deletions sql/item_func.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7467,12 +7467,12 @@ bool Item_func_match::fix_fields(THD *thd, Item **ref)
const_item_cache=0;
for (uint i= 0 ; i < arg_count ; i++)
{
item=args[i];
if (item->type() == Item::REF_ITEM)
args[i]= item= *((Item_ref *)item)->ref;
if (item->type() != Item::FIELD_ITEM)
item= args[i]= args[i]->real_item();
if (item->type() != Item::FIELD_ITEM ||
/* Cannot use FTS index with outer table field */
(item->used_tables() & OUTER_REF_TABLE_BIT))
{
my_error(ER_WRONG_ARGUMENTS, MYF(0), "AGAINST");
my_error(ER_WRONG_ARGUMENTS, MYF(0), "MATCH");
return TRUE;
}
allows_multi_table_search &=
Expand Down
5 changes: 0 additions & 5 deletions sql/sql_optimizer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7305,11 +7305,6 @@ add_ft_keys(Key_use_array *keyuse_array,
!(usable_tables & cond_func->table_ref->map()))
return FALSE;

// Cannot do index lookup into outer table:
for (uint i= 0; i < cond_func->arg_count ; ++i)
if (!is_local_field(cond_func->arguments()[i]))
return false;

cond_func->set_simple_expression(simple_match_expr);

const Key_use keyuse(cond_func->table_ref,
Expand Down

0 comments on commit 72177d5

Please sign in to comment.