Commit 2a1035b0 authored by Sergei Petrunia's avatar Sergei Petrunia

MDEV-13351: Server crashes in st_select_lex::set_explain_type upon UNION with window function

Make st_select_lex::set_explain_type() take into account that JOIN_TABs
it is traversing may be also post-join aggregation JOIN_TABs (which
have pos_in_table_list=NULL, etc).
parent e2afdb1e
...@@ -3160,3 +3160,16 @@ SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1); ...@@ -3160,3 +3160,16 @@ SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1);
('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1) ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1)
0 0
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-13351: Server crashes in st_select_lex::set_explain_type upon UNION with window function
#
CREATE TABLE t1 (i INT);
INSERT INTO t1 VALUES (1),(2);
SELECT Nth_value(i,1) OVER() FROM t1
UNION ALL
( SELECT Nth_value(i,2) OVER() FROM t1 LIMIT 0 )
;
Nth_value(i,1) OVER()
1
1
DROP TABLE t1;
...@@ -1943,3 +1943,14 @@ INSERT IGNORE INTO t1 VALUES ('foo'); ...@@ -1943,3 +1943,14 @@ INSERT IGNORE INTO t1 VALUES ('foo');
SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1); SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1);
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-13351: Server crashes in st_select_lex::set_explain_type upon UNION with window function
--echo #
CREATE TABLE t1 (i INT);
INSERT INTO t1 VALUES (1),(2);
SELECT Nth_value(i,1) OVER() FROM t1
UNION ALL
( SELECT Nth_value(i,2) OVER() FROM t1 LIMIT 0 )
;
DROP TABLE t1;
...@@ -4395,10 +4395,16 @@ void st_select_lex::set_explain_type(bool on_the_fly) ...@@ -4395,10 +4395,16 @@ void st_select_lex::set_explain_type(bool on_the_fly)
if (join) if (join)
{ {
bool uses_cte= false; bool uses_cte= false;
for (JOIN_TAB *tab= first_explain_order_tab(join); tab; for (JOIN_TAB *tab= first_linear_tab(join, WITHOUT_BUSH_ROOTS,
tab= next_explain_order_tab(join, tab)) WITH_CONST_TABLES);
tab;
tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS))
{ {
if (tab->table && tab->table->pos_in_table_list->with) /*
pos_in_table_list=NULL for e.g. post-join aggregation JOIN_TABs.
*/
if (tab->table && tab->table->pos_in_table_list &&
tab->table->pos_in_table_list->with)
{ {
uses_cte= true; uses_cte= true;
break; break;
......
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