Skip to content

Commit 6dec5ee

Browse files
committed
MDEV-10152 Add support for TYPE .. IS REF CURSOR
In progress
1 parent a0c7f82 commit 6dec5ee

File tree

140 files changed

+12798
-75
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

140 files changed

+12798
-75
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 (!tdef->def(1).type_handler()->can_be_assoc_array_element_component())
24162416
{
24172417
my_error(ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION, MYF(0),
24182418
tdef->def(1).type_handler()->name().ptr(),

plugin/type_assoc_array/sql_type_assoc_array.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ class Type_handler_assoc_array: public Type_handler_composite
4444
public:
4545
bool has_methods() const override { return true; }
4646
bool has_functors() const override { return true; }
47+
bool can_be_ref_cursor_return_component() const override { return false; }
48+
bool can_be_assoc_array_element_component() const override { return false; }
49+
4750
bool is_complex() const override
4851
{
4952
/*
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
SET sql_mode=ORACLE;
2+
#
3+
# MDEV-10152 Add support for TYPE .. IS REF CURSOR
4+
#
5+
CREATE PROCEDURE p1 AS
6+
TYPE rec0_t IS RECORD (a INT, b VARCHAR(32), c INT);
7+
TYPE rec1_t IS RECORD (a INT, b VARCHAR(32));
8+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
9+
TYPE cur1_t IS REF CURSOR RETURN rec1_t;
10+
c0 cur0_t;
11+
c1 cur1_t;
12+
BEGIN
13+
SELECT COALESCE(c0,c1);
14+
END;
15+
$$
16+
CALL p1;
17+
ERROR HY000: Illegal parameter data types row<2> and row<3> for operation 'coalesce'
18+
DROP PROCEDURE p1;
19+
CREATE PROCEDURE p1 AS
20+
TYPE rec0_t IS RECORD (a INT, b TIME);
21+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
22+
c0, c1, c2 cur0_t;
23+
r0 rec0_t;
24+
BEGIN
25+
OPEN c1 FOR SELECT 1 AS a,'10:20:30' AS b;
26+
c2:= COALESCE(c0,c1);
27+
FETCH c2 INTO r0;
28+
CLOSE c2;
29+
SELECT r0.a, r0.b;
30+
END;
31+
$$
32+
CALL p1;
33+
r0.a r0.b
34+
1 10:20:30
35+
DROP PROCEDURE p1;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
SET sql_mode=ORACLE;
2+
3+
--echo #
4+
--echo # MDEV-10152 Add support for TYPE .. IS REF CURSOR
5+
--echo #
6+
7+
8+
DELIMITER $$;
9+
CREATE PROCEDURE p1 AS
10+
TYPE rec0_t IS RECORD (a INT, b VARCHAR(32), c INT);
11+
TYPE rec1_t IS RECORD (a INT, b VARCHAR(32));
12+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
13+
TYPE cur1_t IS REF CURSOR RETURN rec1_t;
14+
c0 cur0_t;
15+
c1 cur1_t;
16+
BEGIN
17+
SELECT COALESCE(c0,c1);
18+
END;
19+
$$
20+
DELIMITER ;$$
21+
--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
22+
CALL p1;
23+
DROP PROCEDURE p1;
24+
25+
26+
DELIMITER $$;
27+
CREATE PROCEDURE p1 AS
28+
TYPE rec0_t IS RECORD (a INT, b TIME);
29+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
30+
c0, c1, c2 cur0_t;
31+
r0 rec0_t;
32+
BEGIN
33+
OPEN c1 FOR SELECT 1 AS a,'10:20:30' AS b;
34+
c2:= COALESCE(c0,c1);
35+
FETCH c2 INTO r0;
36+
CLOSE c2;
37+
SELECT r0.a, r0.b;
38+
END;
39+
$$
40+
DELIMITER ;$$
41+
CALL p1;
42+
DROP PROCEDURE p1;
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
SET sql_mode=ORACLE;
2+
#
3+
# MDEV-10152 Add support for TYPE .. IS REF CURSOR
4+
#
5+
CREATE PROCEDURE p1 IS
6+
TYPE rec0_t IS RECORD (a INT, b TIME);
7+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
8+
c0 cur0_t;
9+
BEGIN
10+
c0:= 10;
11+
END;
12+
$$
13+
CALL p1;
14+
ERROR HY000: Cannot cast 'int' as 'sys_refcursor' in assignment of `c0` for operation SET
15+
DROP PROCEDURE p1;
16+
CREATE PROCEDURE p1 IS
17+
TYPE rec0_t IS RECORD (a INT, b TIME);
18+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
19+
c0 cur0_t;
20+
BEGIN
21+
c0:= @a;
22+
END;
23+
$$
24+
SET @a=10;
25+
CALL p1;
26+
ERROR HY000: Cannot cast 'bigint' as 'sys_refcursor' in assignment of `c0` for operation SET
27+
SET @a='test';
28+
CALL p1;
29+
ERROR HY000: Cannot cast 'longblob' as 'sys_refcursor' in assignment of `c0` for operation SET
30+
DROP PROCEDURE p1;
31+
CREATE PROCEDURE p1 IS
32+
TYPE rec0_t IS RECORD (a INT, b TIME);
33+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
34+
c0 cur0_t;
35+
BEGIN
36+
c0:= ROW(1,TIME'10:20:30');
37+
END;
38+
$$
39+
CALL p1;
40+
ERROR HY000: Cannot cast 'row' as 'sys_refcursor' in assignment of `c0` for operation SET
41+
DROP PROCEDURE p1;
42+
CREATE PROCEDURE p1 IS
43+
TYPE rec0_t IS RECORD (a INT, b TIME);
44+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
45+
TYPE cur1_t IS REF CURSOR;
46+
c0 cur0_t;
47+
c1 cur1_t;
48+
BEGIN
49+
OPEN c1 FOR SELECT 1 AS a,TIME'10:20:30',10 AS b;
50+
c0:= c1;
51+
CLOSE c1;
52+
END;
53+
$$
54+
CALL p1;
55+
ERROR HY000: Cannot cast 'row<3>' as 'row<2>' in assignment of `c0` for operation SET
56+
DROP PROCEDURE p1;
57+
CREATE PROCEDURE p1 IS
58+
TYPE rec0_t IS RECORD (a INT, b INET6);
59+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
60+
TYPE cur1_t IS REF CURSOR;
61+
c0 cur0_t;
62+
c1 cur1_t;
63+
BEGIN
64+
OPEN c1 FOR SELECT 1 AS a,TIME'10:20:30' AS b;
65+
c0:= c1;
66+
CLOSE c1;
67+
END;
68+
$$
69+
CALL p1;
70+
ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `c0`.`b` for operation SET
71+
DROP PROCEDURE p1;
72+
CREATE PROCEDURE p1 IS
73+
TYPE rec0_t IS RECORD (a INT, b TIME);
74+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
75+
TYPE cur1_t IS REF CURSOR;
76+
c0 cur0_t;
77+
c1 cur1_t;
78+
v0a INT;
79+
v0b TIME;
80+
BEGIN
81+
OPEN c1 FOR SELECT 1 AS a,TIME'10:20:30' AS b;
82+
c0:= c1;
83+
FETCH c0 INTO v0a, v0b;
84+
CLOSE c1;
85+
SELECT v0a, v0b;
86+
END;
87+
$$
88+
CALL p1;
89+
v0a v0b
90+
1 10:20:30
91+
DROP PROCEDURE p1;
92+
CREATE PROCEDURE p1 AS
93+
TYPE rec0_t IS RECORD (a INT, b TIME, c VARCHAR(10));
94+
TYPE rec1_t IS RECORD (a INT, b TIME);
95+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
96+
TYPE cur1_t IS REF CURSOR RETURN rec1_t;
97+
c0 cur0_t;
98+
c1 cur1_t;
99+
a INT;
100+
BEGIN
101+
OPEN c0 FOR SELECT 1 AS a, TIME'10:20:30' AS b, 'c' AS c;
102+
c1:= c0;
103+
END;
104+
$$
105+
CALL p1;
106+
ERROR HY000: Cannot cast 'row<3>' as 'row<2>' in assignment of `c1` for operation SET
107+
DROP PROCEDURE p1;
108+
CREATE PROCEDURE p1 AS
109+
TYPE rec0_t IS RECORD (a INT,b INET6);
110+
TYPE rec1_t IS RECORD (a INT, b TIME);
111+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
112+
TYPE cur1_t IS REF CURSOR RETURN rec1_t;
113+
c0 cur0_t;
114+
c1 cur1_t;
115+
a INT;
116+
BEGIN
117+
OPEN c0 FOR SELECT 1 AS a,CAST('::' AS INET6) AS b;
118+
c1:= c0;
119+
END;
120+
$$
121+
CALL p1;
122+
ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `c1`.`b` for operation SET
123+
DROP PROCEDURE p1;
124+
CREATE TABLE t1 (a INT, b UUID);
125+
CREATE PROCEDURE p1 AS
126+
TYPE rec0_t IS RECORD (a INT,b INET6);
127+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
128+
TYPE cur1_t IS REF CURSOR RETURN t1%ROWTYPE;
129+
c0 cur0_t;
130+
c1 cur1_t;
131+
a INT;
132+
BEGIN
133+
OPEN c0 FOR SELECT 1 AS a, CAST('::' AS INET6) AS b;
134+
c1:= c0;
135+
END;
136+
$$
137+
CALL p1;
138+
ERROR HY000: Cannot cast 'inet6' as 'uuid' in assignment of `c1`.`b` for operation SET
139+
DROP PROCEDURE p1;
140+
DROP TABLE t1;
141+
CREATE PROCEDURE p1 IS
142+
TYPE rec0_t IS RECORD (a INT, b TIME);
143+
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
144+
c0, c1 cur0_t;
145+
v0a INT;
146+
v0b TIME;
147+
BEGIN
148+
OPEN c1 FOR SELECT 1 AS a,TIME'10:20:30' AS b;
149+
c0:= c1;
150+
FETCH c0 INTO v0a, v0b;
151+
CLOSE c1;
152+
SELECT v0a, v0b;
153+
END;
154+
$$
155+
CALL p1;
156+
v0a v0b
157+
1 10:20:30
158+
DROP PROCEDURE p1;

0 commit comments

Comments
 (0)