mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
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().
This commit is contained in:
@ -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
|
|||||||
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');
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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:
|
|||||||
*/
|
*/
|
||||||
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,
|
||||||
|
Reference in New Issue
Block a user