1SET sql_mode=ORACLE;
2#
3# MDEV-10598 sql_mode=ORACLE: Variable declarations can go after cursor declarations
4#
5#
6# Variable after cursor declaration
7#
8CREATE TABLE t1 (a INT);
9insert into t1 values (1);
10insert into t1 values (2);
11CREATE PROCEDURE p1
12AS
13CURSOR c IS SELECT a FROM t1;
14var1 varchar(10);
15BEGIN
16OPEN c;
17fetch c into var1;
18SELECT c%ROWCOUNT,var1;
19close c;
20END;
21$$
22CALL p1;
23c%ROWCOUNT	var1
241	1
25DROP PROCEDURE p1;
26drop table t1;
27#
28# Variable after condition declaration
29#
30CREATE TABLE t1 (col1 INT);
31insert into t1 values (1);
32create unique index t1_col1 on t1 (col1);
33CREATE PROCEDURE p1
34AS
35dup_key CONDITION FOR SQLSTATE '23000';
36var1 varchar(40);
37CONTINUE HANDLER FOR dup_key
38BEGIN
39var1:='duplicate key in index';
40END;
41BEGIN
42var1:='';
43insert into t1 values (1);
44select var1;
45END;
46$$
47CALL p1;
48var1
49duplicate key in index
50DROP PROCEDURE p1;
51drop table t1;
52#
53# Condition after cursor declaration
54#
55CREATE TABLE t1 (col1 INT);
56insert into t1 values (1);
57create unique index t1_col1 on t1 (col1);
58CREATE PROCEDURE p1
59AS
60var1 varchar(40);
61var2 integer;
62CURSOR c IS SELECT col1 FROM t1;
63dup_key CONDITION FOR SQLSTATE '23000';
64CONTINUE HANDLER FOR dup_key
65BEGIN
66var1:='duplicate key in index';
67END;
68BEGIN
69var1:='';
70insert into t1 values (1);
71SELECT var1;
72END;
73$$
74CALL p1;
75var1
76duplicate key in index
77DROP PROCEDURE p1;
78drop table t1;
79#
80# Cursor after handler declaration
81#
82CREATE TABLE t1 (col1 INT);
83insert into t1 values (1);
84create unique index t1_col1 on t1 (col1);
85CREATE PROCEDURE p1
86AS
87var1 varchar(40);
88var2 integer;
89dup_key CONDITION FOR SQLSTATE '23000';
90CONTINUE HANDLER FOR dup_key
91BEGIN
92var1:='duplicate key in index';
93END;
94CURSOR c IS SELECT col1 FROM t1;
95BEGIN
96var1:='';
97insert into t1 values (1);
98SELECT var1;
99END;
100$$
101ERROR 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 'CURSOR c IS SELECT col1 FROM t1;
102BEGIN
103var1:='';
104insert into t1 values (1);
105S...' at line 10
106drop table t1;
107#
108# Condition after handler declaration
109#
110CREATE TABLE t1 (col1 INT);
111insert into t1 values (1);
112create unique index t1_col1 on t1 (col1);
113CREATE PROCEDURE p1
114AS
115var1 varchar(40);
116var2 integer;
117dup_key CONDITION FOR SQLSTATE '23000';
118CURSOR c IS SELECT col1 FROM t1;
119CONTINUE HANDLER FOR dup_key
120BEGIN
121var1:='duplicate key in index';
122END;
123divide_by_zero CONDITION FOR SQLSTATE '22012';
124BEGIN
125var1:='';
126insert into t1 values (1);
127SELECT var1;
128END;
129$$
130ERROR 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 'divide_by_zero CONDITION FOR SQLSTATE '22012';
131BEGIN
132var1:='';
133insert into t1...' at line 11
134drop table t1;
135#
136# Variable after handler declaration
137#
138CREATE TABLE t1 (col1 INT);
139insert into t1 values (1);
140create unique index t1_col1 on t1 (col1);
141CREATE PROCEDURE p1
142AS
143var1 varchar(40);
144var2 integer;
145dup_key CONDITION FOR SQLSTATE '23000';
146CURSOR c IS SELECT col1 FROM t1;
147CONTINUE HANDLER FOR dup_key
148BEGIN
149var1:='duplicate key in index';
150END;
151divide_by_zero CONDITION FOR SQLSTATE '22012';
152BEGIN
153var1:='';
154insert into t1 values (1);
155SELECT var1;
156END;
157$$
158ERROR 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 'divide_by_zero CONDITION FOR SQLSTATE '22012';
159BEGIN
160var1:='';
161insert into t1...' at line 11
162drop table t1;
163#
164# Variable after cursor (inner block)
165#
166CREATE TABLE t1 (col1 INT);
167insert into t1 values (1);
168insert into t1 values (2);
169create unique index t1_col1 on t1 (col1);
170CREATE PROCEDURE p1
171AS
172CURSOR c IS SELECT col1 FROM t1;
173var1 varchar(40);
174BEGIN
175OPEN c;
176begin
177declare
178CURSOR c IS SELECT col1 FROM t1 where col1=2;
179var2 integer;
180dup_key CONDITION FOR SQLSTATE '23000';
181CONTINUE HANDLER FOR dup_key
182BEGIN
183var1:='duplicate key in index';
184END;
185begin
186OPEN c;
187fetch c into var1;
188SELECT 'inner cursor',var1;
189insert into t1 values (2);
190close c;
191end;
192end;
193SELECT var1;
194fetch c into var1;
195SELECT c%ROWCOUNT,var1;
196begin
197insert into t1 values (2);
198exception when 1062 then
199begin
200SELECT 'dup key caugth';
201end;
202end;
203close c;
204END;
205$$
206CALL p1;
207inner cursor	var1
208inner cursor	2
209var1
210duplicate key in index
211c%ROWCOUNT	var1
2121	1
213dup key caugth
214dup key caugth
215DROP PROCEDURE p1;
216drop table t1;
217#
218# Cursor declaration and row type declaration in same block
219#
220CREATE TABLE t1 (a INT, b VARCHAR(10));
221insert into t1 values(1,'a');
222CREATE PROCEDURE p1()
223AS
224CURSOR cur1 IS SELECT a FROM t1;
225rec1 cur1%ROWTYPE;
226BEGIN
227rec1.a:= 10;
228END;
229$$
230call p1;
231DROP PROCEDURE p1;
232drop table t1;
233#
234# Recursive cursor and cursor%ROWTYPE declarations in the same block
235#
236CREATE PROCEDURE p1
237AS
238a INT:=10;
239b VARCHAR(10):='b0';
240c DOUBLE:=0.1;
241CURSOR cur1 IS SELECT a, b, c;
242rec1 cur1%ROWTYPE;
243CURSOR cur2 IS SELECT rec1.a + 1 "a", rec1.b||'0' AS b, rec1.c AS c;
244rec2 cur2%ROWTYPE;
245BEGIN
246OPEN cur1;
247FETCH cur1 INTO rec1;
248CLOSE cur1;
249SELECT rec1.a;
250OPEN cur2;
251FETCH cur2 INTO rec2;
252CLOSE cur2;
253SELECT rec2.a;
254CREATE TABLE t2 AS SELECT rec2.a AS a, rec2.b AS b, rec2.c AS c;
255SHOW CREATE TABLE t2;
256DROP TABLE t2;
257END;
258$$
259CALL p1();
260rec1.a
26110
262rec2.a
26311
264Table	Create Table
265t2	CREATE TABLE "t2" (
266  "a" bigint(20) DEFAULT NULL,
267  "b" varchar(11) DEFAULT NULL,
268  "c" double DEFAULT NULL
269)
270DROP PROCEDURE p1;
271#
272# MDEV-12916 Wrong column data type for an INT field of a cursor-anchored ROW variable
273#
274CREATE PROCEDURE p1
275AS
276a INT DEFAULT 10;
277CURSOR cur1 IS SELECT a;
278rec1 cur1%ROWTYPE;
279BEGIN
280CREATE TABLE t1 AS SELECT rec1.a;
281SHOW CREATE TABLE t1;
282DROP TABLE t1;
283END;
284$$
285CALL p1();
286Table	Create Table
287t1	CREATE TABLE "t1" (
288  "rec1.a" int(11) DEFAULT NULL
289)
290DROP PROCEDURE p1;
291