1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-26135 Assertion failure when executing PS with a hanging recursive CTE

The bug affected execution of queries with With clauses containing so-called
hanging recursive CTEs in PREPARE mode. A CTE is hanging if it's not used
in the query. Preparation of a prepared statement from a query with a
hanging CTE caused a leak in the server and execution of this prepared
statement led to an assert failure of the server built in the debug mode.
This happened because the units specifying recursive CTEs erroneously were
not cleaned up if those CTEs were hanging.
The patch enforces cleanup of hanging recursive CTEs in the same way as
other hanging CTEs.

Approved by dmitry.shulga@mariadb.com
This commit is contained in:
Igor Babaev
2021-07-16 22:46:50 -07:00
parent b7886f55eb
commit f053349797
3 changed files with 52 additions and 2 deletions

View File

@ -1382,7 +1382,8 @@ bool st_select_lex_unit::cleanup()
{
DBUG_RETURN(FALSE);
}
if (with_element && with_element->is_recursive && union_result)
if (with_element && with_element->is_recursive && union_result &&
with_element->rec_outer_references)
{
select_union_recursive *result= with_element->rec_result;
if (++result->cleanup_count == with_element->rec_outer_references)
@ -1584,7 +1585,8 @@ bool st_select_lex::cleanup()
for (SELECT_LEX_UNIT *lex_unit= first_inner_unit(); lex_unit ;
lex_unit= lex_unit->next_unit())
{
if (lex_unit->with_element && lex_unit->with_element->is_recursive)
if (lex_unit->with_element && lex_unit->with_element->is_recursive &&
lex_unit->with_element->rec_outer_references)
continue;
error= (bool) ((uint) error | (uint) lex_unit->cleanup());
}