mirror of
https://github.com/MariaDB/server.git
synced 2025-02-04 21:02:17 +01:00
e0f9540bcc
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
178 lines
2.9 KiB
Text
178 lines
2.9 KiB
Text
-- source include/have_debug.inc
|
|
|
|
SET sql_mode=ORACLE;
|
|
|
|
--echo #
|
|
--echo # MDEV-20667 Server crash on pop_cursor
|
|
--echo #
|
|
|
|
DELIMITER //;
|
|
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//
|
|
DELIMITER ;//
|
|
SHOW PROCEDURE CODE p1;
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
DELIMITER //;
|
|
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//
|
|
DELIMITER ;//
|
|
SHOW PROCEDURE CODE p1;
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
DELIMITER //;
|
|
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//
|
|
DELIMITER ;//
|
|
SHOW PROCEDURE CODE p1;
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
DELIMITER //;
|
|
CREATE PROCEDURE p1() IS
|
|
BEGIN
|
|
IF 1=1 THEN
|
|
DECLARE
|
|
CURSOR cur2 IS SELECT 'cur2' FROM DUAL;
|
|
BEGIN
|
|
SELECT 'cur2';
|
|
IF 1=1 THEN
|
|
DECLARE
|
|
CURSOR cur3 IS SELECT 'cur3' FROM DUAL;
|
|
BEGIN
|
|
SELECT 'cur3';
|
|
IF 1=1 THEN
|
|
DECLARE
|
|
CURSOR cur4 IS SELECT 'cur4' FROM DUAL;
|
|
BEGIN
|
|
SELECT 'cur4';
|
|
GOTO ret;
|
|
END;
|
|
END IF;
|
|
GOTO ret;
|
|
END;
|
|
END IF;
|
|
GOTO ret;
|
|
END;
|
|
END IF;
|
|
<<ret>>
|
|
RETURN;
|
|
END;
|
|
//
|
|
DELIMITER ;//
|
|
SHOW PROCEDURE CODE p1;
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
DELIMITER //;
|
|
CREATE PROCEDURE p1(lab VARCHAR(32)) IS
|
|
BEGIN
|
|
IF 1=1 THEN
|
|
DECLARE
|
|
CURSOR cur2 IS SELECT 'cur2' FROM DUAL;
|
|
BEGIN
|
|
IF 1=1 THEN
|
|
DECLARE
|
|
CURSOR cur3 IS SELECT 'cur3' FROM DUAL;
|
|
BEGIN
|
|
IF 1=1 THEN
|
|
DECLARE
|
|
CURSOR cur4 IS SELECT 'cur4' FROM DUAL;
|
|
BEGIN
|
|
IF lab = 'cur4' THEN
|
|
SELECT 'goto from cur4' AS comment;
|
|
GOTO ret;
|
|
END IF;
|
|
END;
|
|
END IF;
|
|
IF lab = 'cur3' THEN
|
|
SELECT 'goto from cur3' AS comment;
|
|
GOTO ret;
|
|
END IF;
|
|
END;
|
|
END IF;
|
|
IF lab = 'cur2' THEN
|
|
SELECT 'goto from cur2' AS comment;
|
|
GOTO ret;
|
|
END IF;
|
|
END;
|
|
END IF;
|
|
<<ret>>
|
|
RETURN;
|
|
END;
|
|
//
|
|
DELIMITER ;//
|
|
SHOW PROCEDURE CODE p1;
|
|
CALL p1('');
|
|
CALL p1('cur2');
|
|
CALL p1('cur3');
|
|
CALL p1('cur4');
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
DELIMITER //;
|
|
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//
|
|
DELIMITER ;//
|
|
SHOW PROCEDURE CODE p1;
|
|
DROP PROCEDURE p1;
|