Commit 6cf49743 authored by Alexey Kopytov's avatar Alexey Kopytov

Bug #53544: Server hangs during JOIN query in stored procedure

            called twice in a row

Queries with nested joins could cause an infinite loop in the
server when used from SP/PS.

When flattening nested joins, simplify_joins() tracks if the
name resolution list needs to be updated by setting
fix_name_res to TRUE if the current loop iteration has done any
transformations to the join table list. The problem was that
the flag was not reset before the next loop iteration leading
to unnecessary "fixing" of the name resolution list which in
turn could lead to a loop (i.e. circularly-linked part) in that
list. This was causing problems on subsequent execution when
used together with stored procedures or prepared statements.

Fixed by making sure fix_name_res is reset on every loop
iteration.

mysql-test/r/join.result:
  Added a test case for bug #53544.
mysql-test/t/join.test:
  Added a test case for bug #53544.
sql/sql_select.cc:
  Make sure fix_name_res is reset on every loop iteration.
parent 0012d0d8
...@@ -1235,4 +1235,24 @@ ORDER BY t1.a, t1.a LIMIT 1) AS d) ...@@ -1235,4 +1235,24 @@ ORDER BY t1.a, t1.a LIMIT 1) AS d)
1 1
1 1
DROP TABLE t1; DROP TABLE t1;
#
# Bug #53544: Server hangs during JOIN query in stored procedure called
# twice in a row
#
CREATE TABLE t1(c INT);
INSERT INTO t1 VALUES (1), (2);
PREPARE stmt FROM "SELECT t2.c AS f1 FROM t1 LEFT JOIN
t1 t2 ON t1.c=t2.c RIGHT JOIN
t1 t3 ON t1.c=t3.c
GROUP BY f1;";
EXECUTE stmt;
f1
1
2
EXECUTE stmt;
f1
1
2
DEALLOCATE PREPARE stmt;
DROP TABLE t1;
End of 5.1 tests End of 5.1 tests
...@@ -897,4 +897,24 @@ GREATEST(t1.a, ...@@ -897,4 +897,24 @@ GREATEST(t1.a,
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # Bug #53544: Server hangs during JOIN query in stored procedure called
--echo # twice in a row
--echo #
CREATE TABLE t1(c INT);
INSERT INTO t1 VALUES (1), (2);
PREPARE stmt FROM "SELECT t2.c AS f1 FROM t1 LEFT JOIN
t1 t2 ON t1.c=t2.c RIGHT JOIN
t1 t3 ON t1.c=t3.c
GROUP BY f1;";
EXECUTE stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -8885,10 +8885,10 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top) ...@@ -8885,10 +8885,10 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top)
/* Flatten nested joins that can be flattened. */ /* Flatten nested joins that can be flattened. */
TABLE_LIST *right_neighbor= NULL; TABLE_LIST *right_neighbor= NULL;
bool fix_name_res= FALSE;
li.rewind(); li.rewind();
while ((table= li++)) while ((table= li++))
{ {
bool fix_name_res= FALSE;
nested_join= table->nested_join; nested_join= table->nested_join;
if (nested_join && !table->on_expr) if (nested_join && !table->on_expr)
{ {
......
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