diff --git a/mysql-test/main/mdev-31255.result b/mysql-test/main/mdev-31255.result new file mode 100644 index 0000000000000..51e8750098119 --- /dev/null +++ b/mysql-test/main/mdev-31255.result @@ -0,0 +1,13 @@ +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b CHAR(255), FULLTEXT(b)); +INSERT INTO t2 VALUES ('foo'),('bar'); +EXPLAIN +DELETE +FROM t1 +WHERE EXISTS ( +SELECT * FROM t2 WHERE MATCH (b) AGAINST ('qux' IN NATURAL LANGUAGE MODE) +); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE +DROP TABLE t1, t2; diff --git a/mysql-test/main/mdev-31255.test b/mysql-test/main/mdev-31255.test new file mode 100644 index 0000000000000..f3683e01a07aa --- /dev/null +++ b/mysql-test/main/mdev-31255.test @@ -0,0 +1,19 @@ +# +# MDEV-31255 Crash with Explain DELETE on fulltext search query +# + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (b CHAR(255), FULLTEXT(b)); +INSERT INTO t2 VALUES ('foo'),('bar'); + +EXPLAIN +DELETE +FROM t1 +WHERE EXISTS ( + SELECT * FROM t2 WHERE MATCH (b) AGAINST ('qux' IN NATURAL LANGUAGE MODE) +); + +# Cleanup +DROP TABLE t1, t2; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 42cc5d28c1ba0..a4d8544f8b018 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3238,11 +3238,6 @@ int JOIN::optimize_stage2() if (make_join_readinfo(this, select_opts_for_readinfo, no_jbuf_after)) DBUG_RETURN(1); - /* Perform FULLTEXT search before all regular searches */ - if (!(select_options & SELECT_DESCRIBE)) - if (init_ftfuncs(thd, select_lex, MY_TEST(order))) - DBUG_RETURN(1); - /* It's necessary to check const part of HAVING cond as there is a chance that some cond parts may become @@ -15653,6 +15648,11 @@ bool JOIN_TAB::preread_init() if (!derived || !derived->is_materialized_derived()) { preread_init_done= TRUE; + + if (table->fulltext_searched && + init_ftfuncs(join->thd, join->select_lex, MY_TEST(join->order))) + DBUG_RETURN(TRUE); + DBUG_RETURN(FALSE); } @@ -15679,9 +15679,9 @@ bool JOIN_TAB::preread_init() ); /* init ftfuns for just initialized derived table */ - if (table->fulltext_searched) - if (init_ftfuncs(join->thd, join->select_lex, MY_TEST(join->order))) - DBUG_RETURN(TRUE); + if (table->fulltext_searched && + init_ftfuncs(join->thd, join->select_lex, MY_TEST(join->order))) + DBUG_RETURN(TRUE); DBUG_RETURN(FALSE); }