Commit d309c2fc authored by Igor Babaev's avatar Igor Babaev

MDEV-16212 Memory leak with recursive CTE that uses global ORDER BY

           with recursive subquery

There were two problems:
1. The code did not report that usage of global ORDER BY / LIMIT clauses
was not supported yet.
2. The code just reset fake_select_lex of the the unit specifying
a recursive CTE to NULL and that caused memory leaks in some cases.
parent ab9d420d
...@@ -3233,3 +3233,13 @@ Parent Child Path ...@@ -3233,3 +3233,13 @@ Parent Child Path
654 987 987, 654 987 987,
321 654 987,654, 321 654 987,654,
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-16212: recursive CTE with global ORDER BY
#
set statement max_recursive_iterations = 2 for
WITH RECURSIVE qn AS (
SELECT 1 FROM dual UNION ALL
SELECT 1 FROM qn
ORDER BY (SELECT * FROM qn))
SELECT count(*) FROM qn;
ERROR 42000: This version of MariaDB doesn't yet support 'global ORDER_BY/LIMIT in recursive CTE spec'
...@@ -2246,3 +2246,15 @@ FROM cte ...@@ -2246,3 +2246,15 @@ FROM cte
ORDER BY Path; ORDER BY Path;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-16212: recursive CTE with global ORDER BY
--echo #
--error ER_NOT_SUPPORTED_YET
set statement max_recursive_iterations = 2 for
WITH RECURSIVE qn AS (
SELECT 1 FROM dual UNION ALL
SELECT 1 FROM qn
ORDER BY (SELECT * FROM qn))
SELECT count(*) FROM qn;
...@@ -521,7 +521,18 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, ...@@ -521,7 +521,18 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
with_element->rec_result= with_element->rec_result=
new (thd_arg->mem_root) select_union_recursive(thd_arg); new (thd_arg->mem_root) select_union_recursive(thd_arg);
union_result= with_element->rec_result; union_result= with_element->rec_result;
fake_select_lex= NULL; if (fake_select_lex)
{
if (fake_select_lex->order_list.first ||
fake_select_lex->explicit_limit)
{
my_error(ER_NOT_SUPPORTED_YET, MYF(0),
"global ORDER_BY/LIMIT in recursive CTE spec");
goto err;
}
fake_select_lex->cleanup();
fake_select_lex= NULL;
}
} }
if (!(tmp_result= union_result)) if (!(tmp_result= union_result))
goto err; /* purecov: inspected */ goto err; /* purecov: inspected */
......
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