Skip to content

Commit 81ba971

Browse files
author
Alexander Barkov
committed
MDEV-10411 Providing compatibility for basic PL/SQL constructs
- Part 9: EXCEPTION handlers The top-most stored routine blocks now support EXCEPTION clause in its correct place: AS [ declarations ] BEGIN statements [ EXCEPTION exceptions ] END Inner block will be done in a separate commit. - Part 14: IN OUT instead of INOUT (in SP parameter declarations)
1 parent 0040b0f commit 81ba971

File tree

9 files changed

+492
-10
lines changed

9 files changed

+492
-10
lines changed
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
SET sql_mode=ORACLE;
2+
# No HANDLER declarations, no exceptions
3+
CREATE FUNCTION f1 RETURN INT
4+
AS
5+
BEGIN
6+
RETURN 10;
7+
END;
8+
/
9+
SHOW FUNCTION CODE f1;
10+
Pos Instruction
11+
0 freturn 3 10
12+
SELECT f1();
13+
f1()
14+
10
15+
DROP FUNCTION f1;
16+
# No HANDLER declarations, no code, no exceptions
17+
CREATE PROCEDURE p1 ()
18+
IS
19+
BEGIN
20+
END;
21+
/
22+
SHOW PROCEDURE CODE p1;
23+
Pos Instruction
24+
0 jump 3
25+
CALL p1;
26+
DROP PROCEDURE p1;
27+
# No HANDLER declarations, no code, some exceptions
28+
CREATE PROCEDURE p1 (v IN OUT INT)
29+
IS
30+
BEGIN
31+
EXCEPTION
32+
WHEN 1002 THEN v:=225;
33+
END;
34+
/
35+
SHOW PROCEDURE CODE p1;
36+
Pos Instruction
37+
0 jump 1
38+
1 hpush_jump 4 1 EXIT
39+
2 set v@0 225
40+
3 hreturn 0 4
41+
4 hpop 1
42+
set @v= 10;
43+
CALL p1(@v);
44+
SELECT @v;
45+
@v
46+
10
47+
DROP PROCEDURE p1;
48+
# No HANDLER declarations, some code, some exceptions
49+
CREATE PROCEDURE p1 (v IN OUT INT)
50+
IS
51+
BEGIN
52+
v:=224;
53+
EXCEPTION
54+
WHEN 1002 THEN v:=225;
55+
END;
56+
/
57+
SHOW PROCEDURE CODE p1;
58+
Pos Instruction
59+
0 jump 3
60+
1 set v@0 224
61+
2 jump 6
62+
3 hpush_jump 1 1 EXIT
63+
4 set v@0 225
64+
5 hreturn 0 6
65+
6 hpop 1
66+
set @v= 10;
67+
CALL p1(@v);
68+
SELECT @v;
69+
@v
70+
224
71+
DROP PROCEDURE p1;
72+
# Some HANDLER declarations, no code, no exceptions
73+
CREATE PROCEDURE p1 (v IN OUT INT)
74+
IS
75+
EXIT HANDLER FOR 1000
76+
BEGIN
77+
v:=123;
78+
END;
79+
BEGIN
80+
EXCEPTION
81+
WHEN 1002 THEN v:=225;
82+
END;
83+
/
84+
SHOW PROCEDURE CODE p1;
85+
Pos Instruction
86+
0 hpush_jump 3 1 EXIT
87+
1 set v@0 123
88+
2 hreturn 0 6
89+
3 hpush_jump 6 1 EXIT
90+
4 set v@0 225
91+
5 hreturn 0 6
92+
6 hpop 2
93+
set @v= 10;
94+
CALL p1(@v);
95+
SELECT @v;
96+
@v
97+
10
98+
DROP PROCEDURE p1;
99+
# Some HANDLER declarations, no code, some exceptions
100+
CREATE PROCEDURE p1 (v IN OUT INT)
101+
IS
102+
EXIT HANDLER FOR 1000
103+
BEGIN
104+
v:=123;
105+
END;
106+
BEGIN
107+
END;
108+
/
109+
SHOW PROCEDURE CODE p1;
110+
Pos Instruction
111+
0 hpush_jump 3 1 EXIT
112+
1 set v@0 123
113+
2 hreturn 0 3
114+
3 hpop 1
115+
set @v= 10;
116+
CALL p1(@v);
117+
SELECT @v;
118+
@v
119+
10
120+
DROP PROCEDURE p1;
121+
# Some HANDLER declarations, some code, no exceptions
122+
CREATE PROCEDURE p1 (v IN OUT INT)
123+
IS
124+
EXIT HANDLER FOR 1000
125+
BEGIN
126+
v:=123;
127+
END;
128+
BEGIN
129+
v:=223;
130+
END;
131+
/
132+
SHOW PROCEDURE CODE p1;
133+
Pos Instruction
134+
0 hpush_jump 3 1 EXIT
135+
1 set v@0 123
136+
2 hreturn 0 5
137+
3 set v@0 223
138+
4 jump 5
139+
5 hpop 1
140+
set @v= 10;
141+
CALL p1(@v);
142+
SELECT @v;
143+
@v
144+
223
145+
DROP PROCEDURE p1;
146+
# Some HANDLER declarations, some code, some exceptions
147+
CREATE PROCEDURE p1 (v IN OUT VARCHAR2(20))
148+
IS
149+
EXIT HANDLER FOR 1000
150+
BEGIN
151+
v:=123;
152+
END;
153+
CONTINUE HANDLER FOR 1001
154+
BEGIN
155+
SET v=223;
156+
END;
157+
BEGIN
158+
v:= 1;
159+
EXCEPTION
160+
WHEN 1002 THEN SET v=225;
161+
END;
162+
/
163+
SHOW PROCEDURE CODE p1;
164+
Pos Instruction
165+
0 hpush_jump 3 1 EXIT
166+
1 set v@0 123
167+
2 hreturn 0 12
168+
3 hpush_jump 8 1 CONTINUE
169+
4 set v@0 223
170+
5 hreturn 1
171+
6 set v@0 1
172+
7 jump 12
173+
8 hpush_jump 6 1 EXIT
174+
9 set v@0 225
175+
10 hreturn 0 12
176+
11 jump 6
177+
12 hpop 3
178+
DROP PROCEDURE p1;

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -430,12 +430,13 @@ CREATE PROCEDURE sp1 (p1 IN VARCHAR2(20), p2 OUT VARCHAR2(30))
430430
IS
431431
v1 INT;
432432
BEGIN
433-
EXCEPTION WHEN NOT FOUND THEN
433+
SELECT c1 INTO v1 FROM t1;
434+
p2 := p1;
435+
EXCEPTION
436+
WHEN NOT FOUND THEN
434437
BEGIN
435438
p2 := 'def';
436439
END;
437-
SELECT c1 INTO v1 FROM t1;
438-
p2 := p1;
439440
END;
440441
/
441442
CALL sp1('abc', @a);
@@ -444,3 +445,23 @@ SELECT @a;
444445
def
445446
DROP PROCEDURE sp1;
446447
DROP TABLE t1;
448+
CREATE PROCEDURE sp1 (v IN OUT INT, error IN INT)
449+
IS
450+
BEGIN
451+
SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=error, MESSAGE_TEXT='User defined error!';
452+
v:= 223;
453+
EXCEPTION
454+
WHEN 30001 THEN
455+
BEGIN
456+
v:= 113;
457+
END;
458+
END;
459+
/
460+
SET @v=10;
461+
CALL sp1(@v, 30001);
462+
CALL sp1(@v, 30002);
463+
ERROR 45000: User defined error!
464+
SELECT @v;
465+
@v
466+
113
467+
DROP PROCEDURE sp1;
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
-- source include/have_debug.inc
2+
3+
SET sql_mode=ORACLE;
4+
5+
--echo # No HANDLER declarations, no exceptions
6+
DELIMITER /;
7+
CREATE FUNCTION f1 RETURN INT
8+
AS
9+
BEGIN
10+
RETURN 10;
11+
END;
12+
/
13+
DELIMITER ;/
14+
SHOW FUNCTION CODE f1;
15+
SELECT f1();
16+
DROP FUNCTION f1;
17+
18+
--echo # No HANDLER declarations, no code, no exceptions
19+
DELIMITER /;
20+
CREATE PROCEDURE p1 ()
21+
IS
22+
BEGIN
23+
END;
24+
/
25+
DELIMITER ;/
26+
SHOW PROCEDURE CODE p1;
27+
CALL p1;
28+
DROP PROCEDURE p1;
29+
30+
31+
--echo # No HANDLER declarations, no code, some exceptions
32+
DELIMITER /;
33+
CREATE PROCEDURE p1 (v IN OUT INT)
34+
IS
35+
BEGIN
36+
EXCEPTION
37+
WHEN 1002 THEN v:=225;
38+
END;
39+
/
40+
DELIMITER ;/
41+
SHOW PROCEDURE CODE p1;
42+
set @v= 10;
43+
CALL p1(@v);
44+
SELECT @v;
45+
DROP PROCEDURE p1;
46+
47+
48+
--echo # No HANDLER declarations, some code, some exceptions
49+
DELIMITER /;
50+
CREATE PROCEDURE p1 (v IN OUT INT)
51+
IS
52+
BEGIN
53+
v:=224;
54+
EXCEPTION
55+
WHEN 1002 THEN v:=225;
56+
END;
57+
/
58+
DELIMITER ;/
59+
SHOW PROCEDURE CODE p1;
60+
set @v= 10;
61+
CALL p1(@v);
62+
SELECT @v;
63+
DROP PROCEDURE p1;
64+
65+
66+
--echo # Some HANDLER declarations, no code, no exceptions
67+
DELIMITER /;
68+
CREATE PROCEDURE p1 (v IN OUT INT)
69+
IS
70+
EXIT HANDLER FOR 1000
71+
BEGIN
72+
v:=123;
73+
END;
74+
BEGIN
75+
EXCEPTION
76+
WHEN 1002 THEN v:=225;
77+
END;
78+
/
79+
DELIMITER ;/
80+
SHOW PROCEDURE CODE p1;
81+
set @v= 10;
82+
CALL p1(@v);
83+
SELECT @v;
84+
DROP PROCEDURE p1;
85+
86+
87+
--echo # Some HANDLER declarations, no code, some exceptions
88+
DELIMITER /;
89+
CREATE PROCEDURE p1 (v IN OUT INT)
90+
IS
91+
EXIT HANDLER FOR 1000
92+
BEGIN
93+
v:=123;
94+
END;
95+
BEGIN
96+
END;
97+
/
98+
DELIMITER ;/
99+
SHOW PROCEDURE CODE p1;
100+
set @v= 10;
101+
CALL p1(@v);
102+
SELECT @v;
103+
DROP PROCEDURE p1;
104+
105+
106+
--echo # Some HANDLER declarations, some code, no exceptions
107+
DELIMITER /;
108+
CREATE PROCEDURE p1 (v IN OUT INT)
109+
IS
110+
EXIT HANDLER FOR 1000
111+
BEGIN
112+
v:=123;
113+
END;
114+
BEGIN
115+
v:=223;
116+
END;
117+
/
118+
DELIMITER ;/
119+
SHOW PROCEDURE CODE p1;
120+
set @v= 10;
121+
CALL p1(@v);
122+
SELECT @v;
123+
DROP PROCEDURE p1;
124+
125+
--echo # Some HANDLER declarations, some code, some exceptions
126+
DELIMITER /;
127+
CREATE PROCEDURE p1 (v IN OUT VARCHAR2(20))
128+
IS
129+
EXIT HANDLER FOR 1000
130+
BEGIN
131+
v:=123;
132+
END;
133+
CONTINUE HANDLER FOR 1001
134+
BEGIN
135+
SET v=223;
136+
END;
137+
BEGIN
138+
v:= 1;
139+
EXCEPTION
140+
WHEN 1002 THEN SET v=225;
141+
END;
142+
/
143+
DELIMITER ;/
144+
SHOW PROCEDURE CODE p1;
145+
DROP PROCEDURE p1;

0 commit comments

Comments
 (0)