summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_cte.cc3
-rw-r--r--sql/sql_cte.h2
-rw-r--r--sql/sql_select.cc12
3 files changed, 12 insertions, 5 deletions
diff --git a/sql/sql_cte.cc b/sql/sql_cte.cc
index b720eac2317..22a99842f6a 100644
--- a/sql/sql_cte.cc
+++ b/sql/sql_cte.cc
@@ -911,7 +911,8 @@ bool With_clause::prepare_unreferenced_elements(THD *thd)
with_elem;
with_elem= with_elem->next)
{
- if (!with_elem->is_referenced() && with_elem->prepare_unreferenced(thd))
+ if ((with_elem->is_hanging_recursive() || !with_elem->is_referenced()) &&
+ with_elem->prepare_unreferenced(thd))
return true;
}
diff --git a/sql/sql_cte.h b/sql/sql_cte.h
index 5f30894afb1..d484dcf123e 100644
--- a/sql/sql_cte.h
+++ b/sql/sql_cte.h
@@ -242,6 +242,8 @@ public:
bool is_referenced() { return referenced; }
+ bool is_hanging_recursive() { return is_recursive && !rec_outer_references; }
+
void inc_references() { references++; }
bool rename_columns_of_derived_unit(THD *thd, st_select_lex_unit *unit);
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 2bb01ee0d0a..ff584e936b7 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -25276,8 +25276,10 @@ int JOIN::save_explain_data_intern(Explain_query *output,
if (!(tmp_unit->item && tmp_unit->item->eliminated) && // (1)
(!tmp_unit->derived ||
tmp_unit->derived->is_materialized_derived()) && // (2)
- !(tmp_unit->with_element &&
- (!tmp_unit->derived || !tmp_unit->derived->derived_result))) // (3)
+ (!tmp_unit->with_element ||
+ (tmp_unit->derived &&
+ tmp_unit->derived->derived_result &&
+ !tmp_unit->with_element->is_hanging_recursive()))) // (3)
{
explain->add_child(tmp_unit->first_select()->select_number);
}
@@ -25342,8 +25344,10 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
*/
if (!(unit->item && unit->item->eliminated) && // (1)
!(unit->derived && unit->derived->merged_for_insert) && // (2)
- !(unit->with_element &&
- (!unit->derived || !unit->derived->derived_result))) // (3)
+ (!unit->with_element ||
+ (unit->derived &&
+ unit->derived->derived_result &&
+ !unit->with_element->is_hanging_recursive()))) // (3)
{
if (mysql_explain_union(thd, unit, result))
DBUG_VOID_RETURN;