Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
MDEV-25636: Bug report: abortion in sql/sql_parse.cc:6294
The asserion failure was caused by this query
select /*id=1*/ from t1
where
col= ( select /*id=2*/ from ... where corr_cond1
union
select /*id=4*/ from ... where corr_cond2)
Here,
- select with id=2 was correlated due to corr_cond1.
- select with id=4 was initially correlated due to corr_cond2, but then
the optimizer optimized away the correlation, making the select with id=4
uncorrelated.
However, since select with id=2 remained correlated, the execution had to
re-compute the whole UNION. When it tried to execute select with id=4, it
hit an assertion (join buffer already free'd).
This is because select with id=4 has freed its execution structures after
it has been executed once. The select is uncorrelated, so it did not expect
it would need to be executed for the second time.
Fixed this by adding this logic in
st_select_lex::optimize_unflattened_subqueries():
If a member of a UNION is correlated, mark all its members as
correlated, so that they are prepared to be executed multiple times.- Loading branch information
Showing
5 changed files
with
99 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| # | ||
| # MDEV-25636: Bug report: abortion in sql/sql_parse.cc:6294 | ||
| # | ||
| CREATE TABLE t1 (i1 int)engine=innodb; | ||
| INSERT INTO `t1` VALUES (62),(66); | ||
| CREATE TABLE t2 (i1 int) engine=innodb; | ||
| SELECT 1 FROM t1 | ||
| WHERE t1.i1 =( SELECT t1.i1 FROM t2 | ||
| UNION SELECT i1 FROM (t1 AS dt1 natural JOIN t2) | ||
| window w1 as (partition by t1.i1)); | ||
| 1 | ||
| drop table t1,t2; | ||
| # Another testcase | ||
| CREATE TABLE t1 (i3 int NOT NULL, i1 int , i2 int , i4 int , PRIMARY key(i2)); | ||
| INSERT INTO t1 VALUES (6,72,98,98),(46,1,6952,0); | ||
| SELECT i1 FROM t1 | ||
| WHERE t1.i3 = | ||
| (SELECT ref_4.i2 FROM t1 AS ref_4 | ||
| WHERE t1.i2 > (SELECT i3 FROM t1 ORDER BY i3 LIMIT 1 OFFSET 4) | ||
| UNION | ||
| SELECT ref_6.i2 | ||
| FROM (t1 AS ref_5 JOIN t1 AS ref_6 ON ((ref_6.i1 > ref_6.i2) OR (ref_5.i4 < ref_5.i4))) | ||
| WHERE (t1.i2 >= t1.i2)); | ||
| i1 | ||
| drop table t1; | ||
| # | ||
| # MDEV-25761: Assertion `aggr != __null' failed in sub_select_postjoin_aggr | ||
| # | ||
| CREATE TABLE t1 ( a int NOT NULL PRIMARY KEY) engine=innodb; | ||
| INSERT INTO t1 VALUES (0),(4),(31); | ||
| CREATE TABLE t2 (i int) engine=innodb; | ||
| DELETE FROM t1 WHERE t1.a = | ||
| (SELECT t1.a FROM t2 UNION SELECT DISTINCT 52 FROM t2 r WHERE t1.a = t1.a); | ||
| DROP TABLE t1,t2; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| --source include/have_innodb.inc | ||
|
|
||
| --echo # | ||
| --echo # MDEV-25636: Bug report: abortion in sql/sql_parse.cc:6294 | ||
| --echo # | ||
|
|
||
| CREATE TABLE t1 (i1 int)engine=innodb; | ||
| INSERT INTO `t1` VALUES (62),(66); | ||
| CREATE TABLE t2 (i1 int) engine=innodb; | ||
|
|
||
| SELECT 1 FROM t1 | ||
| WHERE t1.i1 =( SELECT t1.i1 FROM t2 | ||
| UNION SELECT i1 FROM (t1 AS dt1 natural JOIN t2) | ||
| window w1 as (partition by t1.i1)); | ||
|
|
||
| drop table t1,t2; | ||
|
|
||
| --echo # Another testcase | ||
| CREATE TABLE t1 (i3 int NOT NULL, i1 int , i2 int , i4 int , PRIMARY key(i2)); | ||
| INSERT INTO t1 VALUES (6,72,98,98),(46,1,6952,0); | ||
|
|
||
| SELECT i1 FROM t1 | ||
| WHERE t1.i3 = | ||
| (SELECT ref_4.i2 FROM t1 AS ref_4 | ||
| WHERE t1.i2 > (SELECT i3 FROM t1 ORDER BY i3 LIMIT 1 OFFSET 4) | ||
| UNION | ||
| SELECT ref_6.i2 | ||
| FROM (t1 AS ref_5 JOIN t1 AS ref_6 ON ((ref_6.i1 > ref_6.i2) OR (ref_5.i4 < ref_5.i4))) | ||
| WHERE (t1.i2 >= t1.i2)); | ||
|
|
||
| drop table t1; | ||
|
|
||
| --echo # | ||
| --echo # MDEV-25761: Assertion `aggr != __null' failed in sub_select_postjoin_aggr | ||
| --echo # | ||
|
|
||
| CREATE TABLE t1 ( a int NOT NULL PRIMARY KEY) engine=innodb; | ||
| INSERT INTO t1 VALUES (0),(4),(31); | ||
|
|
||
| CREATE TABLE t2 (i int) engine=innodb; | ||
|
|
||
| DELETE FROM t1 WHERE t1.a = | ||
| (SELECT t1.a FROM t2 UNION SELECT DISTINCT 52 FROM t2 r WHERE t1.a = t1.a); | ||
|
|
||
| DROP TABLE t1,t2; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters