Skip to content

Commit 9c53cbd

Browse files
committed
MDEV-15941 Explicit cursor FOR loop does not close the cursor
1 parent b534a7b commit 9c53cbd

File tree

11 files changed

+427
-64
lines changed

11 files changed

+427
-64
lines changed

mysql-test/main/sp-code.result

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,23 +1113,26 @@ Pos Instruction
11131113
10 stmt 0 "SELECT rec1.a, rec1.b"
11141114
11 cfetch cur1@1 rec1@0
11151115
12 jump 6
1116-
13 cursor_copy_struct cur0 rec0@1
1117-
14 copen cur0@0
1118-
15 cfetch cur0@0 rec0@1
1119-
16 jump_if_not 21(21) `cur0`%FOUND
1120-
17 set rec0.a@1["a"] 10
1121-
18 set rec0.b@1["b"] 'b0'
1122-
19 cfetch cur0@0 rec0@1
1123-
20 jump 16
1124-
21 cursor_copy_struct cur2 rec2@2
1125-
22 copen cur2@2
1126-
23 cfetch cur2@2 rec2@2
1127-
24 jump_if_not 29(29) `cur2`%FOUND
1128-
25 set rec2.a@2["a"] 10
1129-
26 set rec2.b@2["b"] 'b0'
1130-
27 cfetch cur2@2 rec2@2
1131-
28 jump 24
1132-
29 cpop 3
1116+
13 cclose cur1@1
1117+
14 cursor_copy_struct cur0 rec0@1
1118+
15 copen cur0@0
1119+
16 cfetch cur0@0 rec0@1
1120+
17 jump_if_not 22(22) `cur0`%FOUND
1121+
18 set rec0.a@1["a"] 10
1122+
19 set rec0.b@1["b"] 'b0'
1123+
20 cfetch cur0@0 rec0@1
1124+
21 jump 17
1125+
22 cclose cur0@0
1126+
23 cursor_copy_struct cur2 rec2@2
1127+
24 copen cur2@2
1128+
25 cfetch cur2@2 rec2@2
1129+
26 jump_if_not 31(31) `cur2`%FOUND
1130+
27 set rec2.a@2["a"] 10
1131+
28 set rec2.b@2["b"] 'b0'
1132+
29 cfetch cur2@2 rec2@2
1133+
30 jump 26
1134+
31 cclose cur2@2
1135+
32 cpop 3
11331136
DROP PROCEDURE p1;
11341137
# Nested explicit cursor FOR loops
11351138
CREATE PROCEDURE p1()
@@ -1164,14 +1167,14 @@ Pos Instruction
11641167
1 cursor_copy_struct cur0 rec0@0
11651168
2 copen cur0@0
11661169
3 cfetch cur0@0 rec0@0
1167-
4 jump_if_not 29(29) `cur0`%FOUND
1170+
4 jump_if_not 31(31) `cur0`%FOUND
11681171
5 cpush cur1@1
11691172
6 set rec0.a@0["a"] 11
11701173
7 set rec0.b@0["b"] 'b0'
11711174
8 cursor_copy_struct cur1 rec1@1
11721175
9 copen cur1@1
11731176
10 cfetch cur1@1 rec1@1
1174-
11 jump_if_not 26(26) `cur1`%FOUND
1177+
11 jump_if_not 27(27) `cur1`%FOUND
11751178
12 set rec1.a@1["a"] 11
11761179
13 set rec1.b@1["b"] 'b1'
11771180
14 cpush cur2@2
@@ -1183,13 +1186,16 @@ Pos Instruction
11831186
20 set rec2.b@2["b"] 'b2'
11841187
21 cfetch cur2@2 rec2@2
11851188
22 jump 18
1186-
23 cpop 1
1187-
24 cfetch cur1@1 rec1@1
1188-
25 jump 11
1189-
26 cpop 1
1190-
27 cfetch cur0@0 rec0@0
1191-
28 jump 4
1192-
29 cpop 1
1189+
23 cclose cur2@2
1190+
24 cpop 1
1191+
25 cfetch cur1@1 rec1@1
1192+
26 jump 11
1193+
27 cclose cur1@1
1194+
28 cpop 1
1195+
29 cfetch cur0@0 rec0@0
1196+
30 jump 4
1197+
31 cclose cur0@0
1198+
32 cpop 1
11931199
DROP PROCEDURE p1;
11941200
# Implicit cursor FOR loops
11951201
CREATE PROCEDURE p1()

mysql-test/main/sp-cursor.result

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,3 +611,76 @@ a b
611611
a b
612612
2 b2
613613
DROP TABLE t1;
614+
#
615+
# MDEV-15941 Explicit cursor FOR loop does not close the cursor
616+
#
617+
BEGIN NOT ATOMIC
618+
DECLARE v INT;
619+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
620+
FOR rec IN cur
621+
DO
622+
SELECT rec.a;
623+
END FOR;
624+
FETCH cur INTO v;
625+
END;
626+
$$
627+
rec.a
628+
1
629+
ERROR 24000: Cursor is not open
630+
BEGIN NOT ATOMIC
631+
DECLARE v INT;
632+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
633+
label:
634+
FOR rec IN cur
635+
DO
636+
SELECT rec.a;
637+
END FOR;
638+
FETCH cur INTO v;
639+
END;
640+
$$
641+
rec.a
642+
1
643+
ERROR 24000: Cursor is not open
644+
BEGIN NOT ATOMIC
645+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
646+
OPEN cur;
647+
FOR rec IN cur DO
648+
SELECT rec.a;
649+
END FOR;
650+
END;
651+
$$
652+
ERROR 24000: Cursor is already open
653+
BEGIN NOT ATOMIC
654+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
655+
FOR rec IN cur
656+
DO
657+
SELECT rec.a;
658+
END FOR;
659+
FOR rec IN cur
660+
DO
661+
SELECT rec.a;
662+
END FOR;
663+
END;
664+
$$
665+
rec.a
666+
1
667+
rec.a
668+
1
669+
BEGIN NOT ATOMIC
670+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
671+
label1:
672+
FOR rec IN cur
673+
DO
674+
SELECT rec.a;
675+
END FOR;
676+
label2:
677+
FOR rec IN cur
678+
DO
679+
SELECT rec.a;
680+
END FOR;
681+
END;
682+
$$
683+
rec.a
684+
1
685+
rec.a
686+
1

mysql-test/main/sp-cursor.test

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,3 +607,85 @@ END;
607607
$$
608608
DELIMITER ;$$
609609
DROP TABLE t1;
610+
611+
612+
--echo #
613+
--echo # MDEV-15941 Explicit cursor FOR loop does not close the cursor
614+
--echo #
615+
616+
DELIMITER $$;
617+
--error ER_SP_CURSOR_NOT_OPEN
618+
BEGIN NOT ATOMIC
619+
DECLARE v INT;
620+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
621+
FOR rec IN cur
622+
DO
623+
SELECT rec.a;
624+
END FOR;
625+
FETCH cur INTO v;
626+
END;
627+
$$
628+
DELIMITER ;$$
629+
630+
631+
DELIMITER $$;
632+
--error ER_SP_CURSOR_NOT_OPEN
633+
BEGIN NOT ATOMIC
634+
DECLARE v INT;
635+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
636+
label:
637+
FOR rec IN cur
638+
DO
639+
SELECT rec.a;
640+
END FOR;
641+
FETCH cur INTO v;
642+
END;
643+
$$
644+
DELIMITER ;$$
645+
646+
647+
DELIMITER $$;
648+
--error ER_SP_CURSOR_ALREADY_OPEN
649+
BEGIN NOT ATOMIC
650+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
651+
OPEN cur;
652+
FOR rec IN cur DO
653+
SELECT rec.a;
654+
END FOR;
655+
END;
656+
$$
657+
DELIMITER ;$$
658+
659+
660+
DELIMITER $$;
661+
BEGIN NOT ATOMIC
662+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
663+
FOR rec IN cur
664+
DO
665+
SELECT rec.a;
666+
END FOR;
667+
FOR rec IN cur
668+
DO
669+
SELECT rec.a;
670+
END FOR;
671+
END;
672+
$$
673+
DELIMITER ;$$
674+
675+
676+
DELIMITER $$;
677+
BEGIN NOT ATOMIC
678+
DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
679+
label1:
680+
FOR rec IN cur
681+
DO
682+
SELECT rec.a;
683+
END FOR;
684+
label2:
685+
FOR rec IN cur
686+
DO
687+
SELECT rec.a;
688+
END FOR;
689+
END;
690+
$$
691+
DELIMITER ;$$

mysql-test/suite/compat/oracle/r/sp-code.result

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,23 +1084,26 @@ Pos Instruction
10841084
10 stmt 0 "SELECT rec1.a, rec1.b"
10851085
11 cfetch cur1@1 rec1@0
10861086
12 jump 6
1087-
13 cursor_copy_struct cur0 rec0@1
1088-
14 copen cur0@0
1089-
15 cfetch cur0@0 rec0@1
1090-
16 jump_if_not 21(21) "cur0"%FOUND
1091-
17 set rec0.a@1["a"] 10
1092-
18 set rec0.b@1["b"] 'b0'
1093-
19 cfetch cur0@0 rec0@1
1094-
20 jump 16
1095-
21 cursor_copy_struct cur2 rec2@2
1096-
22 copen cur2@2
1097-
23 cfetch cur2@2 rec2@2
1098-
24 jump_if_not 29(29) "cur2"%FOUND
1099-
25 set rec2.a@2["a"] 10
1100-
26 set rec2.b@2["b"] 'b0'
1101-
27 cfetch cur2@2 rec2@2
1102-
28 jump 24
1103-
29 cpop 3
1087+
13 cclose cur1@1
1088+
14 cursor_copy_struct cur0 rec0@1
1089+
15 copen cur0@0
1090+
16 cfetch cur0@0 rec0@1
1091+
17 jump_if_not 22(22) "cur0"%FOUND
1092+
18 set rec0.a@1["a"] 10
1093+
19 set rec0.b@1["b"] 'b0'
1094+
20 cfetch cur0@0 rec0@1
1095+
21 jump 17
1096+
22 cclose cur0@0
1097+
23 cursor_copy_struct cur2 rec2@2
1098+
24 copen cur2@2
1099+
25 cfetch cur2@2 rec2@2
1100+
26 jump_if_not 31(31) "cur2"%FOUND
1101+
27 set rec2.a@2["a"] 10
1102+
28 set rec2.b@2["b"] 'b0'
1103+
29 cfetch cur2@2 rec2@2
1104+
30 jump 26
1105+
31 cclose cur2@2
1106+
32 cpop 3
11041107
DROP PROCEDURE p1;
11051108
CREATE PROCEDURE p1
11061109
AS
@@ -1137,14 +1140,14 @@ Pos Instruction
11371140
1 cursor_copy_struct cur0 rec0@0
11381141
2 copen cur0@0
11391142
3 cfetch cur0@0 rec0@0
1140-
4 jump_if_not 29(29) "cur0"%FOUND
1143+
4 jump_if_not 31(31) "cur0"%FOUND
11411144
5 cpush cur1@1
11421145
6 set rec0.a@0["a"] 11
11431146
7 set rec0.b@0["b"] 'b0'
11441147
8 cursor_copy_struct cur1 rec1@1
11451148
9 copen cur1@1
11461149
10 cfetch cur1@1 rec1@1
1147-
11 jump_if_not 26(26) "cur1"%FOUND
1150+
11 jump_if_not 27(27) "cur1"%FOUND
11481151
12 set rec1.a@1["a"] 11
11491152
13 set rec1.b@1["b"] 'b1'
11501153
14 cpush cur2@2
@@ -1156,13 +1159,16 @@ Pos Instruction
11561159
20 set rec2.b@2["b"] 'b2'
11571160
21 cfetch cur2@2 rec2@2
11581161
22 jump 18
1159-
23 cpop 1
1160-
24 cfetch cur1@1 rec1@1
1161-
25 jump 11
1162-
26 cpop 1
1163-
27 cfetch cur0@0 rec0@0
1164-
28 jump 4
1165-
29 cpop 1
1162+
23 cclose cur2@2
1163+
24 cpop 1
1164+
25 cfetch cur1@1 rec1@1
1165+
26 jump 11
1166+
27 cclose cur1@1
1167+
28 cpop 1
1168+
29 cfetch cur0@0 rec0@0
1169+
30 jump 4
1170+
31 cclose cur0@0
1171+
32 cpop 1
11661172
DROP PROCEDURE p1;
11671173
#
11681174
# MDEV-12098 sql_mode=ORACLE: Implicit cursor FOR loop

0 commit comments

Comments
 (0)