Commit 8c9b2f34 authored by Sergey Petrunya's avatar Sergey Petrunya

MDEV-5581: Server crashes in in JOIN::prepare on 2nd execution of PS with materialization+semijoin

- The problem was that JOIN::prepare() tried to set TABLE::maybe_null
  for a table in join. Non-merged semi-join tables 1) are present as 
  join's base tables on second EXECUTE, but 2) do not yet have a TABLE 
  object.
  Worked around the problem by putting mixed_implicit_grouping into JOIN
  object, and then passing it to JTBM tables in setup_jtbm_semi_joins().
parent 9d5731ef
...@@ -2782,4 +2782,20 @@ db ...@@ -2782,4 +2782,20 @@ db
mysql mysql
information_schema information_schema
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-5581: Server crashes in in JOIN::prepare on 2nd execution of PS with materialization+semijoin
#
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (2),(3);
CREATE TABLE t2 (b INT);
INSERT INTO t2 VALUES (8),(9);
CREATE TABLE t3 (c INT, INDEX(c));
INSERT INTO t2 VALUES (5),(6);
PREPARE stmt FROM
"SELECT * FROM t1 WHERE ( 9, 5 ) IN ( SELECT b, COUNT(*) FROM t2 WHERE 1 IN ( SELECT MIN(c) FROM t3 ) )";
EXECUTE stmt;
a
EXECUTE stmt;
a
DROP TABLE t1,t2,t3;
set optimizer_switch=@subselect_sj_tmp; set optimizer_switch=@subselect_sj_tmp;
...@@ -2796,6 +2796,22 @@ db ...@@ -2796,6 +2796,22 @@ db
information_schema information_schema
mysql mysql
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-5581: Server crashes in in JOIN::prepare on 2nd execution of PS with materialization+semijoin
#
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (2),(3);
CREATE TABLE t2 (b INT);
INSERT INTO t2 VALUES (8),(9);
CREATE TABLE t3 (c INT, INDEX(c));
INSERT INTO t2 VALUES (5),(6);
PREPARE stmt FROM
"SELECT * FROM t1 WHERE ( 9, 5 ) IN ( SELECT b, COUNT(*) FROM t2 WHERE 1 IN ( SELECT MIN(c) FROM t3 ) )";
EXECUTE stmt;
a
EXECUTE stmt;
a
DROP TABLE t1,t2,t3;
set optimizer_switch=@subselect_sj_tmp; set optimizer_switch=@subselect_sj_tmp;
# #
# BUG#49129: Wrong result with IN-subquery with join_cache_level=6 and firstmatch=off # BUG#49129: Wrong result with IN-subquery with join_cache_level=6 and firstmatch=off
......
...@@ -2489,5 +2489,24 @@ INSERT INTO t1 VALUES ('mysql'),('information_schema'); ...@@ -2489,5 +2489,24 @@ INSERT INTO t1 VALUES ('mysql'),('information_schema');
SELECT * FROM t1 WHERE db IN (SELECT `SCHEMA_NAME` FROM information_schema.SCHEMATA); SELECT * FROM t1 WHERE db IN (SELECT `SCHEMA_NAME` FROM information_schema.SCHEMATA);
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-5581: Server crashes in in JOIN::prepare on 2nd execution of PS with materialization+semijoin
--echo #
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (2),(3);
CREATE TABLE t2 (b INT);
INSERT INTO t2 VALUES (8),(9);
CREATE TABLE t3 (c INT, INDEX(c));
INSERT INTO t2 VALUES (5),(6);
PREPARE stmt FROM
"SELECT * FROM t1 WHERE ( 9, 5 ) IN ( SELECT b, COUNT(*) FROM t2 WHERE 1 IN ( SELECT MIN(c) FROM t3 ) )";
EXECUTE stmt;
EXECUTE stmt;
DROP TABLE t1,t2,t3;
# The following command must be the last one the file # The following command must be the last one the file
set optimizer_switch=@subselect_sj_tmp; set optimizer_switch=@subselect_sj_tmp;
...@@ -5204,6 +5204,7 @@ bool setup_jtbm_semi_joins(JOIN *join, List<TABLE_LIST> *join_list, ...@@ -5204,6 +5204,7 @@ bool setup_jtbm_semi_joins(JOIN *join, List<TABLE_LIST> *join_list,
if (!(*join_where)->fixed) if (!(*join_where)->fixed)
(*join_where)->fix_fields(join->thd, join_where); (*join_where)->fix_fields(join->thd, join_where);
} }
table->table->maybe_null= test(join->mixed_implicit_grouping);
} }
if ((nested_join= table->nested_join)) if ((nested_join= table->nested_join))
......
...@@ -616,7 +616,7 @@ JOIN::prepare(Item ***rref_pointer_array, ...@@ -616,7 +616,7 @@ JOIN::prepare(Item ***rref_pointer_array,
aggregate functions in the SELECT list is a MySQL exptenstion that aggregate functions in the SELECT list is a MySQL exptenstion that
is allowed only if the ONLY_FULL_GROUP_BY sql mode is not set. is allowed only if the ONLY_FULL_GROUP_BY sql mode is not set.
*/ */
bool mixed_implicit_grouping= false; mixed_implicit_grouping= false;
if ((~thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY) && if ((~thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY) &&
select_lex->with_sum_func && !group_list) select_lex->with_sum_func && !group_list)
{ {
...@@ -655,7 +655,7 @@ JOIN::prepare(Item ***rref_pointer_array, ...@@ -655,7 +655,7 @@ JOIN::prepare(Item ***rref_pointer_array,
Note: this loop doesn't touch tables inside merged semi-joins, because Note: this loop doesn't touch tables inside merged semi-joins, because
subquery-to-semijoin conversion has not been done yet. This is intended. subquery-to-semijoin conversion has not been done yet. This is intended.
*/ */
if (mixed_implicit_grouping) if (mixed_implicit_grouping && tbl->table)
tbl->table->maybe_null= 1; tbl->table->maybe_null= 1;
} }
......
...@@ -1110,7 +1110,8 @@ public: ...@@ -1110,7 +1110,8 @@ public:
*/ */
JOIN *tmp_join; JOIN *tmp_join;
ROLLUP rollup; ///< Used with rollup ROLLUP rollup; ///< Used with rollup
bool mixed_implicit_grouping;
bool select_distinct; ///< Set if SELECT DISTINCT bool select_distinct; ///< Set if SELECT DISTINCT
/** /**
If we have the GROUP BY statement in the query, If we have the GROUP BY statement in the query,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment