Bug#37949 Crash if argument to SP is a subquery that returns more than one row
JOIN for the subselect wasn't cleaned if we came upon an error during sub_select() execution. That leads to the assertion failure in close_thread_tables() part of the 6.0 code backported per-file comments: mysql-test/r/sp-error.result Bug#37949 Crash if argument to SP is a subquery that returns more than one row test result mysql-test/t/sp-error.test Bug#37949 Crash if argument to SP is a subquery that returns more than one row test case sql/sp_head.cc Bug#37949 Crash if argument to SP is a subquery that returns more than one row lex->unit.cleanup() call added if not substatement
This commit is contained in:
parent
119c5aaeba
commit
ce64a16b75
@ -1513,3 +1513,10 @@ end loop label1;
|
|||||||
end loop;
|
end loop;
|
||||||
end|
|
end|
|
||||||
ERROR 42000: End-label label1 without match
|
ERROR 42000: End-label label1 without match
|
||||||
|
CREATE TABLE t1 (a INT)|
|
||||||
|
INSERT INTO t1 VALUES (1),(2)|
|
||||||
|
CREATE PROCEDURE p1(a INT) BEGIN END|
|
||||||
|
CALL p1((SELECT * FROM t1))|
|
||||||
|
ERROR 21000: Subquery returns more than 1 row
|
||||||
|
DROP PROCEDURE IF EXISTS p1|
|
||||||
|
DROP TABLE t1|
|
||||||
|
@ -2173,6 +2173,14 @@ begin
|
|||||||
end loop;
|
end loop;
|
||||||
end|
|
end|
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT)|
|
||||||
|
INSERT INTO t1 VALUES (1),(2)|
|
||||||
|
CREATE PROCEDURE p1(a INT) BEGIN END|
|
||||||
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
|
CALL p1((SELECT * FROM t1))|
|
||||||
|
DROP PROCEDURE IF EXISTS p1|
|
||||||
|
DROP TABLE t1|
|
||||||
|
|
||||||
delimiter ;|
|
delimiter ;|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1762,7 +1762,11 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
|
|||||||
we'll leave it here.
|
we'll leave it here.
|
||||||
*/
|
*/
|
||||||
if (!thd->in_sub_stmt)
|
if (!thd->in_sub_stmt)
|
||||||
close_thread_tables(thd, 0, 0);
|
{
|
||||||
|
thd->lex->unit.cleanup();
|
||||||
|
close_thread_tables(thd);
|
||||||
|
thd->rollback_item_tree_changes();
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_PRINT("info",(" %.*s: eval args done", m_name.length, m_name.str));
|
DBUG_PRINT("info",(" %.*s: eval args done", m_name.length, m_name.str));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user