Skip to content
/ server Public

Commit e5aafac

Browse files
committed
MDEV-10152 Add support for TYPE .. IS REF CURSOR
Version#2 In progress
1 parent 21740cc commit e5aafac

31 files changed

+1370
-65
lines changed

plugin/type_assoc_array/sql_type_assoc_array.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2412,7 +2412,7 @@ bool Type_handler_assoc_array::
24122412
return true;
24132413
}
24142414

2415-
if (unlikely(tdef->def(1).type_handler() == this))
2415+
if (unlikely(tdef->def(1).type_handler()->is_complex()))
24162416
{
24172417
my_error(ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION, MYF(0),
24182418
tdef->def(1).type_handler()->name().ptr(),
Lines changed: 271 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
1+
SET sql_mode=ORACLE;
2+
CREATE PROCEDURE p1 AS
3+
TYPE assoc0_t IS TABLE OF SYS_REFCURSOR INDEX BY INT;
4+
BEGIN
5+
NULL;
6+
END;
7+
$$
8+
ERROR HY000: Illegal parameter data type sys_refcursor for operation '<array element data type>'
9+
CREATE PROCEDURE p1 AS
10+
TYPE cur0_t IS REF CURSOR;
11+
TYPE assoc0_t IS TABLE OF cur0_t INDEX BY INT;
12+
BEGIN
13+
NULL;
14+
END;
15+
$$
16+
ERROR HY000: Illegal parameter data type sys_refcursor for operation '<array element data type>'
17+
CREATE PROCEDURE p1 AS
18+
TYPE rec0_t IS RECORD(a INT, b VARCHAR(10));
19+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
20+
TYPE assoc0_t IS TABLE OF cur0_t INDEX BY INT;
21+
BEGIN
22+
NULL;
23+
END;
24+
$$
25+
ERROR HY000: Illegal parameter data type sys_refcursor for operation '<array element data type>'
26+
CREATE PROCEDURE p1 AS
27+
TYPE assoc0_t IS TABLE OF INT INDEX BY INT;
28+
TYPE rec0_t IS RECORD (a INT, b assoc0_t);
29+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
30+
BEGIN
31+
NULL;
32+
END;
33+
$$
34+
ERROR HY000: Unknown data type: 'assoc0_t'
35+
CREATE PROCEDURE p1 AS
36+
TYPE rec0_t IS RECORD (a INT, b VARCHAR(10));
37+
TYPE rec1_t IS RECORD (a INT, b rec0_t);
38+
TYPE cur1_t IS REF CURSOR RETURN rec1_t;
39+
BEGIN
40+
NULL;
41+
END;
42+
$$
43+
ERROR HY000: Unknown data type: 'rec0_t'
44+
CREATE PROCEDURE p1 AS
45+
TYPE rec0_t IS RECORD (a INT, b SYS_REFCURSOR);
46+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
47+
BEGIN
48+
NULL;
49+
END;
50+
$$
51+
ERROR HY000: Illegal parameter data type sys_refcursor for operation 'REF CURSOR RETURN'
52+
CREATE PROCEDURE p1 AS
53+
TYPE cur0_t IS REF CURSOR;
54+
TYPE rec0_t IS RECORD (a INT, b cur0_t); -- This fails: unknown type cur0_t
55+
TYPE cur1_t IS REF CURSOR RETURN rec0_t;
56+
BEGIN
57+
NULL;
58+
END;
59+
$$
60+
ERROR HY000: Unknown data type: 'cur0_t'
61+
CREATE PROCEDURE p1 AS
62+
TYPE rec0_t IS RECORD (a INT, b VARCHAR(10));
63+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
64+
TYPE rec1_t IS RECORD (a INT, b cur0_t); -- This fails: unknown type cur0_t
65+
TYPE cur1_t IS REF CURSOR RETURN rec1_t;
66+
BEGIN
67+
NULL;
68+
END;
69+
$$
70+
ERROR HY000: Unknown data type: 'cur0_t'
71+
CREATE PROCEDURE p1 AS
72+
TYPE cur0_t IS REF CURSOR RETURN cat1.db1.t1.v0%TYPE;
73+
BEGIN
74+
NULL;
75+
END;
76+
$$
77+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.v0%TYPE;
78+
BEGIN
79+
NULL;
80+
END' at line 2
81+
CREATE PROCEDURE p1 AS
82+
TYPE cur0_t IS REF CURSOR RETURN db1.t1.v0%TYPE;
83+
BEGIN
84+
NULL;
85+
END;
86+
$$
87+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'TYPE;
88+
BEGIN
89+
NULL;
90+
END' at line 2
91+
CREATE PROCEDURE p1 AS
92+
TYPE cur0_t IS REF CURSOR RETURN t1.v0%TYPE;
93+
BEGIN
94+
NULL;
95+
END;
96+
$$
97+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'TYPE;
98+
BEGIN
99+
NULL;
100+
END' at line 2
101+
CREATE PROCEDURE p1 AS
102+
TYPE cur0_t IS REF CURSOR RETURN v0%TYPE;
103+
BEGIN
104+
NULL;
105+
END;
106+
$$
107+
ERROR 42000: Undeclared variable: v0
108+
CREATE PROCEDURE p1 AS
109+
v0 INT;
110+
TYPE cur0_t IS REF CURSOR RETURN v0%TYPE;
111+
BEGIN
112+
NULL;
113+
END;
114+
$$
115+
ERROR HY000: Illegal parameter data type int for operation 'REF CURSOR RETURN'
116+
CREATE PROCEDURE p1 AS
117+
TYPE rec0_t IS RECORD (a INT, b SYS_REFCURSOR);
118+
v0 rec0_t;
119+
TYPE cur0_t IS REF CURSOR RETURN v0%TYPE;
120+
BEGIN
121+
NULL;
122+
END;
123+
$$
124+
ERROR HY000: Illegal parameter data type sys_refcursor for operation 'REF CURSOR RETURN'
125+
CREATE TABLE t1 (a INT, b VARCHAR(10));
126+
CREATE PROCEDURE p1 AS
127+
r0 t1%ROWTYPE;
128+
TYPE cur0_t IS REF CURSOR RETURN r0%TYPE;
129+
c0 cur0_t;
130+
v0, v1 TEXT;
131+
BEGIN
132+
OPEN c0 FOR SELECT 1,' ';
133+
FETCH c0 INTO v0, v1;
134+
SELECT v0, v1;
135+
END;
136+
$$
137+
CALL p1;
138+
v0 v1
139+
1
140+
Warnings:
141+
Note 1265 Data truncated for column 'b' at row 1
142+
DROP PROCEDURE p1;
143+
DROP TABLE t1;
144+
CREATE TABLE t1 (a INT, b VARCHAR(10));
145+
CREATE PROCEDURE p1 AS
146+
CURSOR cursor_example IS SELECT * FROM t1;
147+
r0 cursor_example%ROWTYPE;
148+
TYPE cur0_t IS REF CURSOR RETURN r0%TYPE;
149+
c0 cur0_t;
150+
v0, v1 TEXT;
151+
BEGIN
152+
OPEN c0 FOR SELECT 1,' ';
153+
FETCH c0 INTO v0, v1;
154+
SELECT v0, v1;
155+
END;
156+
$$
157+
CALL p1;
158+
v0 v1
159+
1
160+
Warnings:
161+
Note 1265 Data truncated for column 'b' at row 1
162+
DROP PROCEDURE p1;
163+
DROP TABLE t1;
164+
CREATE PROCEDURE p1 AS
165+
TYPE rec0_t IS RECORD (a INT, b VARCHAR(10));
166+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
167+
c0 cur0_t;
168+
v0, v1 TEXT;
169+
BEGIN
170+
OPEN c0 FOR SELECT 1,' ';
171+
FETCH c0 INTO v0, v1;
172+
SELECT v0, v1;
173+
END;
174+
$$
175+
CALL p1;
176+
v0 v1
177+
1
178+
Warnings:
179+
Note 1265 Data truncated for column 'b' at row 1
180+
DROP PROCEDURE p1;
181+
CREATE PROCEDURE p1 AS
182+
TYPE rec0_t IS RECORD (a INT, b VARCHAR(10));
183+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
184+
c0 cur0_t;
185+
r0 ROW(a INT, b VARCHAR(10));
186+
BEGIN
187+
OPEN c0 FOR SELECT 1,' ';
188+
FETCH c0 INTO r0;
189+
SELECT r0.a, r0.b;
190+
END;
191+
$$
192+
CALL p1;
193+
r0.a r0.b
194+
1
195+
Warnings:
196+
Note 1265 Data truncated for column 'b' at row 1
197+
DROP PROCEDURE p1;
198+
CREATE TABLE t1 (a INT, b VARCHAR(10));
199+
CREATE PROCEDURE p1 AS
200+
CURSOR cursor_example IS SELECT * FROM t1;
201+
TYPE cur0_t IS REF CURSOR RETURN cursor_example%ROWTYPE;
202+
c0 cur0_t;
203+
v0, v1 TEXT;
204+
BEGIN
205+
OPEN c0 FOR SELECT 1,' ';
206+
FETCH c0 INTO v0, v1;
207+
SELECT v0, v1;
208+
END;
209+
$$
210+
CALL p1;
211+
v0 v1
212+
1
213+
Warnings:
214+
Note 1265 Data truncated for column 'b' at row 1
215+
DROP PROCEDURE p1;
216+
DROP TABLE t1;
217+
CREATE TABLE t1 (a INT, b VARCHAR(10));
218+
CREATE PROCEDURE p1 AS
219+
TYPE cur0_t IS REF CURSOR RETURN t1%ROWTYPE;
220+
c0 cur0_t;
221+
v0, v1 TEXT;
222+
BEGIN
223+
OPEN c0 FOR SELECT 1,' ';
224+
FETCH c0 INTO v0, v1;
225+
SELECT v0, v1;
226+
END;
227+
$$
228+
CALL p1;
229+
v0 v1
230+
1
231+
Warnings:
232+
Note 1265 Data truncated for column 'b' at row 1
233+
DROP PROCEDURE p1;
234+
DROP TABLE t1;
235+
CREATE TABLE t1 (a INT, b VARCHAR(10));
236+
CREATE PROCEDURE p1 AS
237+
TYPE rec0_t IS RECORD (a INT, b t1.b%TYPE);
238+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
239+
c0 cur0_t;
240+
v0, v1 TEXT;
241+
BEGIN
242+
OPEN c0 FOR SELECT 1,' ';
243+
FETCH c0 INTO v0, v1;
244+
SELECT v0, v1;
245+
END;
246+
$$
247+
CALL p1;
248+
v0 v1
249+
1
250+
Warnings:
251+
Note 1265 Data truncated for column 'b' at row 1
252+
DROP PROCEDURE p1;
253+
DROP TABLE t1;
254+
CREATE PROCEDURE p1 AS
255+
TYPE rec0_t IS RECORD (a INT, b VARCHAR(10));
256+
r0 rec0_t;
257+
TYPE cur0_t IS REF CURSOR RETURN r0%TYPE;
258+
c0 cur0_t;
259+
v0, v1 TEXT;
260+
BEGIN
261+
OPEN c0 FOR SELECT 1,' ';
262+
FETCH c0 INTO v0, v1;
263+
SELECT v0, v1;
264+
END;
265+
$$
266+
CALL p1;
267+
v0 v1
268+
1
269+
Warnings:
270+
Note 1265 Data truncated for column 'b' at row 1
271+
DROP PROCEDURE p1;

0 commit comments

Comments
 (0)