summaryrefslogtreecommitdiff
path: root/sql/item_func.cc
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2018-02-06 12:12:19 -0800
committerIgor Babaev <igor@askmonty.org>2018-02-06 12:12:19 -0800
commit2ef41622e23cb9c42a03d1db8be1cf02d5e3e37f (patch)
tree542cf50996c1fb6e75c5d2b503536b0fea75e3b2 /sql/item_func.cc
parentbdb87c496530f9cb5b213db044320f6e898a1e12 (diff)
downloadmariadb-git-2ef41622e23cb9c42a03d1db8be1cf02d5e3e37f.tar.gz
Fixed mdev-15162 Query with CTE hangs if assignment operator (:=) is used
If setting user variable was used in the specification of a recursive CTE then Item_func_set_user_var::fix_fields() went into an infinite loop.
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r--sql/item_func.cc6
1 files changed, 5 insertions, 1 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc
index a4952742d94..f54e79a9f2d 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -53,6 +53,7 @@
#include "sp.h"
#include "set_var.h"
#include "debug_sync.h"
+#include "sql_cte.h"
#ifdef NO_EMBEDDED_ACCESS_CHECKS
#define sp_restore_security_context(A,B) while (0) {}
@@ -4703,10 +4704,13 @@ bool Item_func_set_user_var::fix_fields(THD *thd, Item **ref)
TABLE_LIST *derived;
for (derived= unit->derived;
derived;
- derived= derived->select_lex->master_unit()->derived)
+ derived= unit->derived)
{
derived->set_materialized_derived();
derived->prohibit_cond_pushdown= true;
+ if (unit->with_element && unit->with_element->is_recursive)
+ break;
+ unit= derived->select_lex->master_unit();
}
}