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
|
||||
information_schema
|
||||
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;
|
||||
|
@ -2796,6 +2796,22 @@ db
|
||||
information_schema
|
||||
mysql
|
||||
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;
|
||||
#
|
||||
# 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);
|
||||
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
|
||||
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)
|
||||
(*join_where)->fix_fields(join->thd, join_where);
|
||||
}
|
||||
table->table->maybe_null= test(join->mixed_implicit_grouping);
|
||||
}
|
||||
|
||||
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
|
||||
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) &&
|
||||
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
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1111,6 +1111,7 @@ public:
|
||||
JOIN *tmp_join;
|
||||
ROLLUP rollup; ///< Used with rollup
|
||||
|
||||
bool mixed_implicit_grouping;
|
||||
bool select_distinct; ///< Set if SELECT DISTINCT
|
||||
/**
|
||||
If we have the GROUP BY statement in the query,
|
||||
|
Reference in New Issue
Block a user