1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

MDEV-10598 Variable declarations can go after cursor declarations

Based on a contributed patch from Jerome Brauge.
This commit is contained in:
Alexander Barkov
2017-03-16 16:28:52 +04:00
parent 84c55a5668
commit 9dfe7bf86d
11 changed files with 763 additions and 28 deletions

View File

@ -1277,3 +1277,74 @@ Pos Instruction
28 jump 4
29 cpop 1
DROP PROCEDURE p1;
#
# MDEV-10598 sql_mode=ORACLE: Variable declarations can go after cursor declarations
#
#
# Cursor declaration and cursor%ROWTYPE declaration in the same block
#
CREATE TABLE t1 (a INT, b VARCHAR(10));
INSERT INTO t1 VALUES (1,'a');
CREATE PROCEDURE p1()
AS
CURSOR cur1 IS SELECT a FROM t1;
rec1 cur1%ROWTYPE;
BEGIN
rec1.a:= 10;
END;
$$
SHOW PROCEDURE CODE p1;
Pos Instruction
0 cursor_copy_struct cur1 rec1@0
1 set rec1@0 NULL
2 cpush cur1@0
3 set rec1.a@0["a"] 10
4 cpop 1
CALL p1;
DROP PROCEDURE p1;
DROP TABLE t1;
#
# Recursive cursor and cursor%ROWTYPE declarations in the same block
#
CREATE PROCEDURE p1
AS
a INT:=10;
CURSOR cur1 IS SELECT a;
rec1 cur1%ROWTYPE;
CURSOR cur2 IS SELECT rec1.a + 1 "a";
rec2 cur2%ROWTYPE;
BEGIN
OPEN cur1;
FETCH cur1 INTO rec1;
CLOSE cur1;
SELECT rec1.a;
open cur2;
FETCH cur2 INTO rec2;
CLOSE cur2;
SELECT rec2.a;
END;
$$
SHOW PROCEDURE CODE p1;
Pos Instruction
0 set a@0 10
1 cursor_copy_struct cur1 rec1@1
2 set rec1@1 NULL
3 cursor_copy_struct cur2 rec2@2
4 set rec2@2 NULL
5 cpush cur1@0
6 cpush cur2@1
7 copen cur1@0
8 cfetch cur1@0 rec1@1
9 cclose cur1@0
10 stmt 0 "SELECT rec1.a"
11 copen cur2@1
12 cfetch cur2@1 rec2@2
13 cclose cur2@1
14 stmt 0 "SELECT rec2.a"
15 cpop 2
CALL p1();
rec1.a
10
rec2.a
11
DROP PROCEDURE p1;