mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-20667 Server crash on pop_cursor
When backpatching a forward GOTO label, the old code erroneously used CURSOR/HANDLER difference between context frames "c" and "a" to tune a cpop/hpop command. So the cpop/hpop command later tried to pop all cursors/handlers declared between "a" and "c", but those between "b" and "c" were not cpushed/hpoped yet during the execution of "GOTO x". Fixing the code to use the difference between frames "b" and "a" only. BEGIN -- a ... GOTO x; -- b ... <<x>> -- c ... END -- d
This commit is contained in:
@ -832,3 +832,82 @@ a
|
||||
15
|
||||
DROP TRIGGER trg1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-20667 Server crash on pop_cursor
|
||||
#
|
||||
CREATE TABLE t1 (a VARCHAR(6));
|
||||
CREATE PROCEDURE p1() IS
|
||||
BEGIN
|
||||
IF 1=2 THEN
|
||||
BEGIN
|
||||
DECLARE
|
||||
CURSOR cur1 IS SELECT a FROM t1 ;
|
||||
BEGIN
|
||||
GOTO iac_err;
|
||||
END;
|
||||
END;
|
||||
END IF;
|
||||
IF 1=1 THEN
|
||||
GOTO iac_err;
|
||||
END IF;
|
||||
<< iac_err >>
|
||||
RETURN;
|
||||
END//
|
||||
CALL p1();
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
CREATE PROCEDURE p1() IS
|
||||
BEGIN
|
||||
IF 1=2 THEN
|
||||
BEGIN
|
||||
DECLARE
|
||||
CURSOR cur1 IS SELECT a FROM t1 ;
|
||||
BEGIN
|
||||
GOTO iac_err;
|
||||
END;
|
||||
END;
|
||||
END IF;
|
||||
IF 1=1 THEN
|
||||
GOTO iac_err;
|
||||
END IF;
|
||||
<< iac_err >>
|
||||
RETURN ;
|
||||
END//
|
||||
CALL p1;
|
||||
DROP PROCEDURE p1;
|
||||
CREATE PROCEDURE p1() IS
|
||||
BEGIN
|
||||
IF 1=2 THEN
|
||||
BEGIN
|
||||
DECLARE
|
||||
CURSOR cur1 IS SELECT a FROM t1 ;
|
||||
BEGIN
|
||||
GOTO iac_err;
|
||||
END;
|
||||
END;
|
||||
END IF;
|
||||
GOTO iac_err;
|
||||
<< iac_err >>
|
||||
RETURN ;
|
||||
END//
|
||||
CALL p1;
|
||||
DROP PROCEDURE p1;
|
||||
CREATE PROCEDURE p1() IS
|
||||
BEGIN
|
||||
IF 1=2 THEN
|
||||
BEGIN
|
||||
DECLARE
|
||||
CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
|
||||
BEGIN
|
||||
GOTO iac_err;
|
||||
END;
|
||||
END;
|
||||
END IF;
|
||||
IF 1=1 THEN
|
||||
GOTO iac_err;
|
||||
END IF;
|
||||
<<iac_err >>
|
||||
RETURN;
|
||||
END//
|
||||
CALL p1;
|
||||
DROP PROCEDURE p1;
|
||||
|
Reference in New Issue
Block a user