1SET sql_mode=ORACLE;
2# Testing routines with no parameters
3CREATE FUNCTION f1 RETURN INT
4AS
5BEGIN
6RETURN 10;
7END;
8/
9SHOW CREATE FUNCTION f1;
10Function	f1
11sql_mode	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT
12Create Function	CREATE DEFINER="root"@"localhost" FUNCTION "f1"() RETURN int(11)
13AS
14BEGIN
15RETURN 10;
16END
17character_set_client	latin1
18collation_connection	latin1_swedish_ci
19Database Collation	latin1_swedish_ci
20SELECT f1();
21f1()
2210
23DROP FUNCTION f1;
24CREATE PROCEDURE p1
25AS
26BEGIN
27SET @a=10;
28END;
29/
30SHOW CREATE PROCEDURE p1;
31Procedure	p1
32sql_mode	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT
33Create Procedure	CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
34AS
35BEGIN
36SET @a=10;
37END
38character_set_client	latin1
39collation_connection	latin1_swedish_ci
40Database Collation	latin1_swedish_ci
41SET @a=0;
42CALL p1();
43SELECT @a;
44@a
4510
46DROP PROCEDURE p1;
47# Testing ":=" to set the default value of a variable
48CREATE FUNCTION f1 () RETURN NUMBER(10) AS
49a NUMBER(10) := 10;
50BEGIN
51DECLARE
52b NUMBER(10) DEFAULT 3;
53BEGIN
54RETURN a+b;
55END;
56END;
57/
58SELECT f1();
59f1()
6013
61DROP FUNCTION f1;
62# Testing labels
63CREATE FUNCTION f1 (a INT) RETURN CLOB AS
64BEGIN
65<<label1>>
66BEGIN
67IF a = 1 THEN
68LEAVE label1;
69END IF;
70RETURN 'IS NOT 1';
71END label1;
72RETURN 'IS 1';
73END;
74/
75SELECT f1(1);
76f1(1)
77IS 1
78SELECT f1(2);
79f1(2)
80IS NOT 1
81DROP FUNCTION f1;
82CREATE FUNCTION f1 (a INT) RETURN INT IS
83BEGIN
84<<label1>>
85LOOP
86IF a = 2 THEN
87LEAVE label1;
88END IF;
89SET a= a-1;
90END LOOP;
91RETURN a;
92END;
93/
94SELECT f1(4);
95f1(4)
962
97DROP FUNCTION f1;
98CREATE FUNCTION f1 (a INT) RETURN INT AS
99BEGIN
100<<label1>>
101WHILE a>0 LOOP
102IF a = 2 THEN
103LEAVE label1;
104END IF;
105SET a= a-1;
106END LOOP label1;
107RETURN a;
108END;
109/
110SELECT f1(4);
111f1(4)
1122
113DROP FUNCTION f1;
114CREATE FUNCTION f1 (a INT) RETURN INT AS
115BEGIN
116<<label1>>
117REPEAT
118IF a = 2 THEN
119LEAVE label1;
120END IF;
121SET a= a-1;
122UNTIL a=0 END REPEAT;
123RETURN a;
124END;
125/
126SELECT f1(4);
127f1(4)
1282
129DROP FUNCTION f1;
130# Testing IN/OUT/INOUT
131CREATE PROCEDURE p1 (p1 IN VARCHAR2(10), p2 OUT VARCHAR2(10)) AS
132BEGIN
133SET p1='p1new';
134SET p2='p2new';
135END;
136/
137SET @p1='p1', @p2='p2';
138CALL p1(@p1, @p2);
139SELECT @p1, @p2;
140@p1	@p2
141p1	p2new
142DROP PROCEDURE p1;
143# Testing Oracle-style assigment
144CREATE PROCEDURE p1 (p1 OUT VARCHAR2(10)) AS
145BEGIN
146p1:= 'p1new';
147END;
148/
149SET @p1='p1';
150CALL p1(@p1);
151SELECT @p1;
152@p1
153p1new
154DROP PROCEDURE p1;
155# Testing that NULL is a valid statement
156CREATE PROCEDURE p1(a INT) AS
157BEGIN
158NULL;
159END;
160/
161DROP PROCEDURE p1;
162CREATE PROCEDURE p1(a INT) AS
163a INT:=10;
164BEGIN
165IF a=10 THEN NULL; ELSE NULL; END IF;
166END;
167/
168DROP PROCEDURE p1;
169# Keywords that are OK for table names, but not for SP variables
170CREATE TABLE function (function int);
171INSERT INTO function SET function=10;
172SELECT function.function FROM function;
173function
17410
175DROP TABLE function;
176# Testing that (some) keyword_sp are allowed in Oracle-style assignments
177CREATE PROCEDURE p1 (action OUT INT) AS BEGIN action:=10; END;/
178DROP PROCEDURE p1/
179CREATE PROCEDURE p1 (clob OUT INT) AS BEGIN clob:=10; END;/
180DROP PROCEDURE p1/
181CREATE PROCEDURE p1 (enum OUT INT) AS BEGIN enum:=10; END;/
182DROP PROCEDURE p1/
183CREATE PROCEDURE p1 (via OUT INT) AS BEGIN via:=10; END;/
184DROP PROCEDURE p1/
185# Testing keyword_directly_assignable
186CREATE PROCEDURE p1 (ascii OUT INT) AS BEGIN ascii:=10; END;/
187DROP PROCEDURE p1/
188CREATE PROCEDURE p1 (backup OUT INT) AS BEGIN backup:=10; END;/
189DROP PROCEDURE p1/
190CREATE PROCEDURE p1 (binlog OUT INT) AS BEGIN binlog:=10; END;/
191DROP PROCEDURE p1/
192CREATE PROCEDURE p1 (byte OUT INT) AS BEGIN byte:=10; END;/
193DROP PROCEDURE p1/
194CREATE PROCEDURE p1 (cache OUT INT) AS BEGIN cache:=10; END;/
195DROP PROCEDURE p1/
196CREATE PROCEDURE p1 (checksum OUT INT) AS BEGIN checksum:=10; END;/
197DROP PROCEDURE p1/
198CREATE PROCEDURE p1 (checkpoint OUT INT) AS BEGIN checkpoint:=10; END;/
199DROP PROCEDURE p1/
200CREATE PROCEDURE p1 (column_add OUT INT) AS BEGIN column_add:=10; END;/
201DROP PROCEDURE p1/
202CREATE PROCEDURE p1 (column_check OUT INT) AS BEGIN column_check:=10; END;/
203DROP PROCEDURE p1/
204CREATE PROCEDURE p1 (column_create OUT INT) AS BEGIN column_create:=10; END;/
205DROP PROCEDURE p1/
206CREATE PROCEDURE p1 (column_delete OUT INT) AS BEGIN column_delete:=10; END;/
207DROP PROCEDURE p1/
208CREATE PROCEDURE p1 (column_get OUT INT) AS BEGIN column_get:=10; END;/
209DROP PROCEDURE p1/
210CREATE PROCEDURE p1 (deallocate OUT INT) AS BEGIN deallocate:=10; END;/
211DROP PROCEDURE p1/
212CREATE PROCEDURE p1 (examined OUT INT) AS BEGIN examined:=10; END;/
213DROP PROCEDURE p1/
214CREATE PROCEDURE p1 (execute OUT INT) AS BEGIN execute:=10; END;/
215DROP PROCEDURE p1/
216CREATE PROCEDURE p1 (flush OUT INT) AS BEGIN flush:=10; END;/
217DROP PROCEDURE p1/
218CREATE PROCEDURE p1 (format OUT INT) AS BEGIN format:=10; END;/
219DROP PROCEDURE p1/
220CREATE PROCEDURE p1 (get OUT INT) AS BEGIN get:=10; END;/
221DROP PROCEDURE p1/
222CREATE PROCEDURE p1 (help OUT INT) AS BEGIN help:=10; END;/
223DROP PROCEDURE p1/
224CREATE PROCEDURE p1 (host OUT INT) AS BEGIN host:=10; END;/
225DROP PROCEDURE p1/
226CREATE PROCEDURE p1 (install OUT INT) AS BEGIN install:=10; END;/
227DROP PROCEDURE p1/
228CREATE PROCEDURE p1 (option OUT INT) AS BEGIN option:=10; END;/
229DROP PROCEDURE p1/
230CREATE PROCEDURE p1 (options OUT INT) AS BEGIN options:=10; END;/
231DROP PROCEDURE p1/
232CREATE PROCEDURE p1 (owner OUT INT) AS BEGIN owner:=10; END;/
233DROP PROCEDURE p1/
234CREATE PROCEDURE p1 (parser OUT INT) AS BEGIN parser:=10; END;/
235DROP PROCEDURE p1/
236CREATE PROCEDURE p1 (port OUT INT) AS BEGIN port:=10; END;/
237DROP PROCEDURE p1/
238CREATE PROCEDURE p1 (prepare OUT INT) AS BEGIN prepare:=10; END;/
239DROP PROCEDURE p1/
240CREATE PROCEDURE p1 (remove OUT INT) AS BEGIN remove:=10; END;/
241DROP PROCEDURE p1/
242CREATE PROCEDURE p1 (reset OUT INT) AS BEGIN reset:=10; END;/
243DROP PROCEDURE p1/
244CREATE PROCEDURE p1 (restore OUT INT) AS BEGIN restore:=10; END;/
245DROP PROCEDURE p1/
246CREATE PROCEDURE p1 (security OUT INT) AS BEGIN security:=10; END;/
247DROP PROCEDURE p1/
248CREATE PROCEDURE p1 (server OUT INT) AS BEGIN server:=10; END;/
249DROP PROCEDURE p1/
250CREATE PROCEDURE p1 (signed OUT INT) AS BEGIN signed:=10; END;/
251DROP PROCEDURE p1/
252CREATE PROCEDURE p1 (socket OUT INT) AS BEGIN socket:=10; END;/
253DROP PROCEDURE p1/
254CREATE PROCEDURE p1 (slave OUT INT) AS BEGIN slave:=10; END;/
255DROP PROCEDURE p1/
256CREATE PROCEDURE p1 (slaves OUT INT) AS BEGIN slaves:=10; END;/
257DROP PROCEDURE p1/
258CREATE PROCEDURE p1 (soname OUT INT) AS BEGIN soname:=10; END;/
259DROP PROCEDURE p1/
260CREATE PROCEDURE p1 (start OUT INT) AS BEGIN start:=10; END;/
261DROP PROCEDURE p1/
262CREATE PROCEDURE p1 (stop OUT INT) AS BEGIN stop:=10; END;/
263DROP PROCEDURE p1/
264CREATE PROCEDURE p1 (stored OUT INT) AS BEGIN stored:=10; END;/
265DROP PROCEDURE p1/
266CREATE PROCEDURE p1 (unicode OUT INT) AS BEGIN unicode:=10; END;/
267DROP PROCEDURE p1/
268CREATE PROCEDURE p1 (uninstall OUT INT) AS BEGIN uninstall:=10; END;/
269DROP PROCEDURE p1/
270CREATE PROCEDURE p1 (upgrade OUT INT) AS BEGIN upgrade:=10; END;/
271DROP PROCEDURE p1/
272CREATE PROCEDURE p1 (wrapper OUT INT) AS BEGIN wrapper:=10; END;/
273DROP PROCEDURE p1/
274CREATE PROCEDURE p1 (xa OUT INT) AS BEGIN xa:=10; END;/
275DROP PROCEDURE p1/
276# Testing that keyword_directly_not_assignable does not work in :=
277CREATE PROCEDURE p1 (commit OUT INT) AS BEGIN commit:=10; END;/
278ERROR 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 ':=10; END' at line 1
279CREATE PROCEDURE p1 (rollback OUT INT) AS BEGIN rollback:=10; END;/
280ERROR 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 ':=10; END' at line 1
281CREATE PROCEDURE p1 (shutdown OUT INT) AS BEGIN shutdown:=10; END;/
282ERROR 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 ':=10; END' at line 1
283CREATE PROCEDURE p1 (exception OUT INT) AS BEGIN exception:=10; END;/
284ERROR 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 ':=10; END' at line 1
285# Testing that keyword_directly_not_assignable works in SET statements.
286CREATE PROCEDURE p1 (contains OUT INT) AS BEGIN SET contains=10; END;/
287DROP PROCEDURE p1/
288CREATE PROCEDURE p1 (language OUT INT) AS BEGIN SET language=10; END;/
289DROP PROCEDURE p1/
290CREATE PROCEDURE p1 (no OUT INT) AS BEGIN SET no=10; END;/
291DROP PROCEDURE p1/
292CREATE PROCEDURE p1 (charset OUT INT) AS BEGIN SET charset=10; END;/
293DROP PROCEDURE p1/
294CREATE PROCEDURE p1 (do OUT INT) AS BEGIN SET do=10; END;/
295DROP PROCEDURE p1/
296CREATE PROCEDURE p1 (repair OUT INT) AS BEGIN SET repair=10; END;/
297DROP PROCEDURE p1/
298CREATE PROCEDURE p1 (handler OUT INT) AS BEGIN SET handler=10; END;/
299DROP PROCEDURE p1/
300CREATE PROCEDURE p1 (open OUT INT) AS BEGIN SET open=10; END;/
301DROP PROCEDURE p1/
302CREATE PROCEDURE p1 (close OUT INT) AS BEGIN SET close=10; END;/
303DROP PROCEDURE p1/
304CREATE PROCEDURE p1 (savepoint OUT INT) AS BEGIN SET savepoint=10; END;/
305DROP PROCEDURE p1/
306CREATE PROCEDURE p1 (truncate OUT INT) AS BEGIN SET truncate=10; END;/
307DROP PROCEDURE p1/
308CREATE PROCEDURE p1 (begin OUT INT) AS BEGIN SET begin=10; END;/
309DROP PROCEDURE p1/
310CREATE PROCEDURE p1 (end OUT INT) AS BEGIN SET end=10; END;/
311DROP PROCEDURE p1/
312CREATE PROCEDURE p1 (exception OUT INT) AS BEGIN SET exception=10; END;/
313DROP PROCEDURE p1/
314# Testing that keyword_directly_not_assignable works in table/column names
315CREATE TABLE contains (contains INT);
316DROP TABLE contains;
317CREATE TABLE language (language INT);
318DROP TABLE language;
319CREATE TABLE no (no INT);
320DROP TABLE no;
321CREATE TABLE charset (charset INT);
322DROP TABLE charset;
323CREATE TABLE do (do INT);
324DROP TABLE do;
325CREATE TABLE repair (repair INT);
326DROP TABLE repair;
327CREATE TABLE handler (handler INT);
328DROP TABLE handler;
329CREATE TABLE open (open INT);
330DROP TABLE open;
331CREATE TABLE close (close INT);
332DROP TABLE close;
333CREATE TABLE savepoint (savepoint INT);
334DROP TABLE savepoint;
335CREATE TABLE truncate (truncate INT);
336DROP TABLE truncate;
337CREATE TABLE begin (begin INT);
338DROP TABLE begin;
339CREATE TABLE end (end INT);
340DROP TABLE end;
341CREATE TABLE exception (exception INT);
342DROP TABLE exception;
343# Testing ELSIF
344CREATE FUNCTION f1(a INT) RETURN CLOB
345AS
346BEGIN
347IF a=1 THEN RETURN 'a is 1';
348ELSIF a=2 THEN RETURN 'a is 2';
349ELSE RETURN 'a is unknown';
350END IF;
351END;
352/
353SELECT f1(2) FROM DUAL;
354f1(2)
355a is 2
356DROP FUNCTION f1;
357# Testing top-level declarations
358CREATE PROCEDURE p1 (p1 OUT VARCHAR2(10))
359AS
360p2 VARCHAR(10);
361BEGIN
362p2:='p1new';
363p1:=p2;
364END;
365/
366SET @p1='p1';
367CALL p1(@p1);
368SELECT @p1;
369@p1
370p1new
371DROP PROCEDURE p1;
372CREATE FUNCTION f1 (p1 VARCHAR2(10)) RETURN VARCHAR(20)
373AS
374p2 VARCHAR(10);
375BEGIN
376p2:='new';
377RETURN CONCAT(p1, p2);
378END;
379/
380SET @p1='p1';
381SELECT f1(@p1);
382f1(@p1)
383p1new
384DROP FUNCTION f1;
385# Testing non-top declarations
386CREATE PROCEDURE p1 (p1 OUT VARCHAR2(10))
387AS
388BEGIN
389DECLARE
390p2 VARCHAR(10);
391BEGIN
392p2:='p1new';
393p1:=p2;
394END;
395DECLARE
396t1 VARCHAR(10);
397t2 VARCHAR(10);
398BEGIN
399END;
400END;
401/
402SET @p1='p1';
403CALL p1(@p1);
404SELECT @p1;
405@p1
406p1new
407DROP PROCEDURE p1;
408CREATE FUNCTION f1 (p1 VARCHAR2(10)) RETURN VARCHAR(20)
409AS
410BEGIN
411DECLARE
412p2 VARCHAR(10);
413BEGIN
414p2:='new';
415RETURN CONCAT(p1, p2);
416END;
417DECLARE
418t1 VARCHAR(10);
419t2 VARCHAR(10);
420BEGIN
421END;
422END;
423/
424SET @p1='p1';
425SELECT f1(@p1);
426f1(@p1)
427p1new
428DROP FUNCTION f1;
429# Testing exceptions
430CREATE TABLE t1 (c1 INT);
431CREATE PROCEDURE sp1 (p1 IN VARCHAR2(20), p2 OUT VARCHAR2(30))
432IS
433v1 INT;
434BEGIN
435SELECT c1 INTO v1 FROM t1;
436p2 := p1;
437EXCEPTION
438WHEN NOT FOUND THEN
439BEGIN
440p2 := 'def';
441END;
442END;
443/
444CALL sp1('abc', @a);
445SELECT @a;
446@a
447def
448DROP PROCEDURE sp1;
449DROP TABLE t1;
450CREATE PROCEDURE sp1 (v IN OUT INT, error IN INT)
451IS
452BEGIN
453SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=error, MESSAGE_TEXT='User defined error!';
454v:= 223;
455EXCEPTION
456WHEN 30001 THEN
457BEGIN
458v:= 113;
459END;
460END;
461/
462SET @v=10;
463CALL sp1(@v, 30001);
464CALL sp1(@v, 30002);
465ERROR 45000: User defined error!
466SELECT @v;
467@v
468113
469DROP PROCEDURE sp1;
470CREATE PROCEDURE sp1 (v IN OUT INT, error IN INT)
471IS
472BEGIN
473BEGIN
474BEGIN
475SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=error, MESSAGE_TEXT='User defined error!';
476v:= 223;
477EXCEPTION
478WHEN 30001 THEN
479BEGIN
480v:= 113;
481END;
482END;
483END;
484END;
485/
486SET @v=10;
487CALL sp1(@v, 30001);
488SELECT @v;
489@v
490113
491SET @v=10;
492CALL sp1(@v, 30002);
493ERROR 45000: User defined error!
494SELECT @v;
495@v
49610
497DROP PROCEDURE sp1;
498#
499# Testing EXIT statement
500#
501CREATE FUNCTION f1 RETURN INT
502IS
503i INT := 0;
504BEGIN
505EXIT;
506END;
507/
508ERROR 42000: EXIT with no matching label:
509CREATE FUNCTION f1 RETURN INT
510IS
511i INT := 0;
512BEGIN
513<<lable1>>
514BEGIN
515<<label2>>
516LOOP
517EXIT label1;
518END LOOP;
519END;
520END;
521/
522ERROR 42000: EXIT with no matching label: label1
523CREATE FUNCTION f1 RETURN INT
524IS
525i INT := 0;
526BEGIN
527LOOP
528LOOP
529i:= i + 1;
530IF i >= 5 THEN
531EXIT;
532END IF;
533END LOOP;
534i:= i + 100;
535EXIT;
536END LOOP;
537RETURN i;
538END;
539/
540SELECT f1() FROM DUAL;
541f1()
542105
543DROP FUNCTION f1;
544CREATE FUNCTION f1 RETURN INT
545IS
546i INT := 0;
547BEGIN
548<<label1>>
549LOOP
550<<label2>>
551LOOP
552i:= i + 1;
553IF i >= 5 THEN
554EXIT label2;
555END IF;
556END LOOP;
557i:= i + 100;
558EXIT;
559END LOOP;
560RETURN i;
561END;
562/
563SELECT f1() FROM DUAL;
564f1()
565105
566DROP FUNCTION f1;
567CREATE FUNCTION f1 RETURN INT
568IS
569i INT := 0;
570BEGIN
571<<label1>>
572LOOP
573<<label2>>
574LOOP
575i:= i + 1;
576IF i >= 5 THEN
577EXIT label1;
578END IF;
579END LOOP;
580i:= i + 100;
581EXIT;
582END LOOP;
583RETURN i;
584END;
585/
586SELECT f1() FROM DUAL;
587f1()
5885
589DROP FUNCTION f1;
590CREATE FUNCTION f1 RETURN INT
591IS
592i INT := 0;
593BEGIN
594LOOP
595i:= i + 1;
596EXIT WHEN i >=5;
597END LOOP;
598RETURN i;
599END;
600/
601SELECT f1() FROM DUAL;
602f1()
6035
604DROP FUNCTION f1;
605CREATE FUNCTION f1 RETURN INT
606IS
607i INT := 0;
608BEGIN
609<<label1>>
610LOOP
611<<label2>>
612LOOP
613i:= i + 1;
614EXIT label2 WHEN i >= 5;
615END LOOP;
616i:= i + 100;
617EXIT;
618END LOOP;
619RETURN i;
620END;
621/
622SELECT f1() FROM DUAL;
623f1()
624105
625DROP FUNCTION f1;
626CREATE FUNCTION f1 RETURN INT
627IS
628i INT := 0;
629BEGIN
630<<label1>>
631LOOP
632<<label2>>
633LOOP
634i:= i + 1;
635EXIT label1 WHEN i >= 5;
636END LOOP;
637i:= i + 100;
638EXIT;
639END LOOP;
640RETURN i;
641END;
642/
643SELECT f1() FROM DUAL;
644f1()
6455
646DROP FUNCTION f1;
647# Testing CURSOR declaration
648CREATE TABLE t1 (a INT);
649INSERT INTO t1 VALUES (1);
650CREATE FUNCTION f1 RETURN INT
651AS
652v_a INT:=10;
653CURSOR c IS SELECT a FROM t1;
654BEGIN
655OPEN c;
656FETCH c INTO v_a;
657CLOSE c;
658RETURN v_a;
659EXCEPTION
660WHEN OTHERS THEN RETURN -1;
661END;
662/
663SELECT f1() FROM DUAL;
664f1()
6651
666DROP FUNCTION f1;
667DROP TABLE t1;
668# Testing RETURN in procedures
669CREATE PROCEDURE p1 (a IN OUT INT)
670AS
671BEGIN
672RETURN 10;
673END;
674/
675ERROR 42000: RETURN is only allowed in a FUNCTION
676CREATE FUNCTION f1 (a INT) RETURN INT
677AS
678BEGIN
679RETURN;
680END;
681/
682ERROR 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 ';
683END' at line 4
684CREATE PROCEDURE p1 (a IN OUT INT)
685AS
686BEGIN
687IF a < 10 THEN
688BEGIN
689a:= a - 1;
690RETURN;
691END;
692END IF;
693a:= a + 1;
694EXCEPTION
695WHEN OTHERS THEN RETURN;
696END;
697/
698SET @v=10;
699CALL p1(@v);
700SELECT @v;
701@v
70211
703SET @v=9;
704CALL p1(@v);
705SELECT @v;
706@v
7078
708DROP PROCEDURE p1;
709CREATE PROCEDURE p1 (a IN OUT INT)
710AS
711BEGIN
712DROP TABLE t1_non_existent;
713EXCEPTION
714WHEN OTHERS THEN
715BEGIN
716a:= 100;
717RETURN;
718END;
719END;
720/
721SET @v=10;
722CALL p1(@v);
723SELECT @v;
724@v
725100
726DROP PROCEDURE p1;
727# Testing WHILE loop
728CREATE PROCEDURE p1 (a IN OUT INT)
729AS
730i INT:= 1;
731j INT:= 3;
732BEGIN
733WHILE i<=j
734LOOP
735a:= a + i;
736i:= i + 1;
737END LOOP;
738END;
739/
740SET @v=0;
741CALL p1(@v);
742SELECT @v;
743@v
7446
745DROP PROCEDURE p1;
746CREATE PROCEDURE p1 (a IN OUT INT)
747AS
748i INT:= 1;
749j INT:= 3;
750BEGIN
751<<label>>
752WHILE i<=j
753LOOP
754a:= a + i;
755i:= i + 1;
756END LOOP label;
757END;
758/
759SET @v=0;
760CALL p1(@v);
761SELECT @v;
762@v
7636
764DROP PROCEDURE p1;
765# Testing the FOR loop statement
766CREATE TABLE t1 (a INT);
767FOR i IN 1..3
768LOOP
769INSERT INTO t1 VALUES (i);
770END LOOP;
771/
772SELECT * FROM t1;
773a
7741
7752
7763
777DROP TABLE t1;
778CREATE FUNCTION f1 (lower_bound INT, upper_bound INT, lim INT) RETURN INT
779AS
780total INT := 0;
781BEGIN
782FOR i IN lower_bound . . upper_bound
783LOOP
784NULL
785END LOOP;
786RETURN total;
787END;
788/
789ERROR 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 '. upper_bound
790LOOP
791NULL
792END LOOP;
793RETURN total;
794END' at line 5
795CREATE FUNCTION f1 (lower_bound INT, upper_bound INT, lim INT) RETURN INT
796AS
797total INT := 0;
798BEGIN
799FOR i IN lower_bound .. upper_bound
800LOOP
801total:= total + i;
802IF i = lim THEN
803EXIT;
804END IF;
805-- Bounds are calculated only once.
806-- The below assignments have no effect on the loop condition
807lower_bound:= 900;
808upper_bound:= 1000;
809END LOOP;
810RETURN total;
811END;
812/
813SELECT f1(1, 3, 100) FROM DUAL;
814f1(1, 3, 100)
8156
816SELECT f1(1, 3, 2) FROM DUAL;
817f1(1, 3, 2)
8183
819DROP FUNCTION f1;
820CREATE FUNCTION f1 RETURN INT
821AS
822total INT := 0;
823BEGIN
824FOR i IN 1 .. 5
825LOOP
826total:= total + 1000;
827FOR j IN 1 .. 5
828LOOP
829total:= total + 1;
830IF j = 3 THEN
831EXIT; -- End the internal loop
832END IF;
833END LOOP;
834END LOOP;
835RETURN total;
836END;
837/
838SELECT f1() FROM DUAL;
839f1()
8405015
841DROP FUNCTION f1;
842CREATE FUNCTION f1 (a INT, b INT) RETURN INT
843AS
844total INT := 0;
845BEGIN
846FOR i IN REVERSE 1..a
847LOOP
848total:= total + i;
849IF i = b THEN
850EXIT;
851END IF;
852END LOOP;
853RETURN total;
854END
855/
856SELECT f1(3, 100) FROM DUAL;
857f1(3, 100)
8586
859SELECT f1(3, 2) FROM DUAL;
860f1(3, 2)
8615
862DROP FUNCTION f1;
863# Testing labeled FOR LOOP statement
864CREATE FUNCTION f1 (a INT, limita INT, b INT, limitb INT) RETURN INT
865AS
866total INT := 0;
867BEGIN
868<<la>>
869FOR ia IN 1 .. a
870LOOP
871total:= total + 1000;
872<<lb>>
873FOR ib IN 1 .. b
874LOOP
875total:= total + 1;
876EXIT lb WHEN ib = limitb;
877EXIT la WHEN ia = limita;
878END LOOP lb;
879END LOOP la;
880RETURN total;
881END;
882/
883SELECT f1(1, 1, 1, 1) FROM DUAL;
884f1(1, 1, 1, 1)
8851001
886SELECT f1(1, 2, 1, 2) FROM DUAL;
887f1(1, 2, 1, 2)
8881001
889SELECT f1(2, 1, 2, 1) FROM DUAL;
890f1(2, 1, 2, 1)
8912002
892SELECT f1(2, 1, 2, 2) FROM DUAL;
893f1(2, 1, 2, 2)
8941001
895SELECT f1(2, 2, 2, 2) FROM DUAL;
896f1(2, 2, 2, 2)
8972003
898SELECT f1(2, 3, 2, 3) FROM DUAL;
899f1(2, 3, 2, 3)
9002004
901DROP FUNCTION f1;
902# Testing labeled ITERATE in a labeled FOR LOOP statement
903CREATE FUNCTION f1 (a INT, b INT, blim INT) RETURN INT
904AS
905total INT := 0;
906BEGIN
907<<la>>
908FOR ia IN 1 .. a
909LOOP
910total:= total + 1000;
911DECLARE
912ib INT:= 1;
913BEGIN
914WHILE ib <= b
915LOOP
916IF ib > blim THEN
917ITERATE la;
918END IF;
919ib:= ib + 1;
920total:= total + 1;
921END LOOP;
922END;
923END LOOP la;
924RETURN total;
925END;
926/
927SELECT f1(3,3,0), f1(3,3,1), f1(3,3,2), f1(3,3,3), f1(3,3,4) FROM DUAL;
928f1(3,3,0)	f1(3,3,1)	f1(3,3,2)	f1(3,3,3)	f1(3,3,4)
9293000	3003	3006	3009	3009
930DROP FUNCTION f1;
931# Testing CONTINUE statement
932CREATE FUNCTION f1(a INT) RETURN INT
933AS
934total INT:= 0;
935BEGIN
936FOR i IN 1 .. a
937LOOP
938IF i=5 THEN
939CONTINUE;
940END IF;
941total:= total + 1;
942END LOOP;
943RETURN total;
944END;
945/
946SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
947f1(3)	f1(4)	f1(5)	f1(6)
9483	4	4	5
949DROP FUNCTION f1;
950CREATE FUNCTION f1(a INT) RETURN INT
951AS
952total INT:= 0;
953BEGIN
954<<lj>>
955FOR j IN 1 .. 2
956LOOP
957FOR i IN 1 .. a
958LOOP
959IF i=5 THEN
960CONTINUE lj;
961END IF;
962total:= total + 1;
963END LOOP;
964END LOOP;
965RETURN total;
966END;
967/
968SELECT f1(3), f1(4), f1(5) FROM DUAL;
969f1(3)	f1(4)	f1(5)
9706	8	8
971DROP FUNCTION f1;
972CREATE FUNCTION f1(a INT) RETURN INT
973AS
974total INT:= 0;
975BEGIN
976<<lj>>
977FOR j IN 1 .. 2
978LOOP
979FOR i IN 1 .. a
980LOOP
981CONTINUE lj WHEN i=5;
982total:= total + 1;
983END LOOP;
984END LOOP;
985RETURN total;
986END;
987/
988SELECT f1(3), f1(4), f1(5) FROM DUAL;
989f1(3)	f1(4)	f1(5)
9906	8	8
991DROP FUNCTION f1;
992CREATE FUNCTION f1(a INT) RETURN INT
993AS
994total INT:= 0;
995i INT:= 1;
996BEGIN
997WHILE i <= a
998LOOP
999i:= i + 1;
1000IF i=6 THEN
1001CONTINUE;
1002END IF;
1003total:= total + 1;
1004END LOOP;
1005RETURN total;
1006END;
1007/
1008SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
1009f1(3)	f1(4)	f1(5)	f1(6)
10103	4	4	5
1011DROP FUNCTION f1;
1012#
1013# Testing behaviour of unknown identifiers in EXIT and CONTINUE statements
1014#
1015CREATE PROCEDURE p1
1016AS
1017BEGIN
1018LOOP
1019EXIT WHEN unknown_ident IS NULL;
1020END LOOP;
1021END$$
1022CALL p1;
1023ERROR 42S22: Unknown column 'unknown_ident' in 'field list'
1024DROP PROCEDURE p1;
1025CREATE PROCEDURE p1
1026AS
1027BEGIN
1028<<label>>
1029LOOP
1030EXIT label WHEN unknown_ident IS NULL;
1031END LOOP;
1032END$$
1033CALL p1;
1034ERROR 42S22: Unknown column 'unknown_ident' in 'field list'
1035DROP PROCEDURE p1;
1036CREATE PROCEDURE p1
1037AS
1038BEGIN
1039LOOP
1040CONTINUE WHEN unknown_ident IS NULL;
1041END LOOP;
1042END$$
1043CALL p1;
1044ERROR 42S22: Unknown column 'unknown_ident' in 'field list'
1045DROP PROCEDURE p1;
1046CREATE PROCEDURE p1
1047AS
1048BEGIN
1049<<label>>
1050LOOP
1051CONTINUE label WHEN unknown_ident IS NULL;
1052END LOOP;
1053END$$
1054CALL p1;
1055ERROR 42S22: Unknown column 'unknown_ident' in 'field list'
1056DROP PROCEDURE p1;
1057#
1058# MDEV-10583 sql_mode=ORACLE: SQL%ROWCOUNT
1059#
1060EXPLAIN EXTENDED SELECT sql%rowcount;
1061id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
10621	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
1063Warnings:
1064Note	1003	select SQL%ROWCOUNT AS "sql%rowcount"
1065CREATE TABLE t1 AS SELECT SQL%ROWCOUNT;
1066SHOW CREATE TABLE t1;
1067Table	Create Table
1068t1	CREATE TABLE "t1" (
1069  "SQL%ROWCOUNT" bigint(21) NOT NULL
1070)
1071DROP TABLE t1;
1072#
1073# UPDATE
1074#
1075CREATE TABLE t1 (a INT);
1076CREATE PROCEDURE p1
1077AS
1078BEGIN
1079UPDATE t1 SET a=30;
1080SELECT SQL%ROWCOUNT;
1081END;
1082$$
1083CALL p1();
1084SQL%ROWCOUNT
10850
1086DROP PROCEDURE p1;
1087DROP TABLE t1;
1088CREATE TABLE t1 (a INT);
1089INSERT INTO t1 VALUES (10);
1090INSERT INTO t1 VALUES (20);
1091CREATE PROCEDURE p1
1092AS
1093BEGIN
1094UPDATE t1 SET a=30;
1095SELECT SQL%ROWCOUNT;
1096END;
1097$$
1098CALL p1();
1099SQL%ROWCOUNT
11002
1101DROP PROCEDURE p1;
1102DROP TABLE t1;
1103#
1104# DELETE
1105#
1106CREATE TABLE t1 (a INT);
1107CREATE PROCEDURE p1
1108AS
1109BEGIN
1110DELETE FROM t1;
1111SELECT SQL%ROWCOUNT;
1112END;
1113$$
1114CALL p1();
1115SQL%ROWCOUNT
11160
1117DROP PROCEDURE p1;
1118DROP TABLE t1;
1119CREATE TABLE t1 (a INT);
1120INSERT INTO t1 VALUES (10);
1121INSERT INTO t1 VALUES (20);
1122CREATE PROCEDURE p1
1123AS
1124BEGIN
1125DELETE FROM t1;
1126SELECT SQL%ROWCOUNT;
1127END;
1128$$
1129CALL p1();
1130SQL%ROWCOUNT
11312
1132DROP PROCEDURE p1;
1133DROP TABLE t1;
1134#
1135# SELECT ... INTO var FROM ... - one row found
1136#
1137CREATE TABLE t1 (a INT);
1138INSERT INTO t1 VALUES (10);
1139INSERT INTO t1 VALUES (20);
1140CREATE PROCEDURE p1
1141AS
1142va INT;
1143BEGIN
1144SELECT a INTO va FROM t1 LIMIT 1;
1145SELECT SQL%ROWCOUNT;
1146END;
1147$$
1148CALL p1();
1149SQL%ROWCOUNT
11501
1151DROP PROCEDURE p1;
1152DROP TABLE t1;
1153#
1154# SELECT ... INTO var FROM ... - no rows found
1155#
1156CREATE TABLE t1 (a INT);
1157CREATE PROCEDURE p1
1158AS
1159va INT;
1160BEGIN
1161SELECT a INTO va FROM t1;
1162SELECT SQL%ROWCOUNT;
1163END;
1164$$
1165CALL p1();
1166SQL%ROWCOUNT
11670
1168Warnings:
1169Warning	1329	No data - zero rows fetched, selected, or processed
1170DROP PROCEDURE p1;
1171DROP TABLE t1;
1172CREATE TABLE t1 (a INT);
1173CREATE PROCEDURE p1
1174AS
1175va INT;
1176BEGIN
1177SELECT a INTO va FROM t1;
1178SELECT SQL%ROWCOUNT;
1179EXCEPTION
1180WHEN NO_DATA_FOUND THEN SELECT SQL%ROWCOUNT||' (EXCEPTION)';
1181END;
1182$$
1183CALL p1();
1184SQL%ROWCOUNT||' (EXCEPTION)'
11850 (EXCEPTION)
1186DROP PROCEDURE p1;
1187DROP TABLE t1;
1188#
1189# SELECT ... INTO var FROM ... - multiple rows found
1190#
1191CREATE TABLE t1 (a INT);
1192INSERT INTO t1 VALUES (10);
1193INSERT INTO t1 VALUES (20);
1194CREATE PROCEDURE p1
1195AS
1196va INT:=1;
1197BEGIN
1198SELECT a INTO va FROM t1;
1199SELECT SQL%ROWCOUNT;
1200EXCEPTION
1201WHEN TOO_MANY_ROWS THEN SELECT SQL%ROWCOUNT||' (EXCEPTION) va='||va;
1202END;
1203$$
1204CALL p1();
1205SQL%ROWCOUNT||' (EXCEPTION) va='||va
12061 (EXCEPTION) va=10
1207DROP PROCEDURE p1;
1208DROP TABLE t1;
1209#
1210# INSERT INTO t2 SELECT ...
1211#
1212CREATE TABLE t1 (a INT);
1213CREATE TABLE t2 (a INT);
1214INSERT INTO t1 VALUES (10);
1215INSERT INTO t1 VALUES (20);
1216CREATE PROCEDURE p1
1217AS
1218BEGIN
1219INSERT INTO t2 SELECT * FROM t1;
1220SELECT SQL%ROWCOUNT;
1221END;
1222$$
1223CALL p1();
1224SQL%ROWCOUNT
12252
1226DROP PROCEDURE p1;
1227DROP TABLE t1, t2;
1228#
1229# End of MDEV-10583 sql_mode=ORACLE: SQL%ROWCOUNT
1230#
1231#
1232# MDEV-10577 sql_mode=ORACLE: %TYPE in variable declarations
1233#
1234#
1235# Missing table
1236#
1237CREATE PROCEDURE p1
1238AS
1239a t1.a%TYPE;
1240BEGIN
1241NULL;
1242END;
1243$$
1244CALL p1();
1245ERROR 42S02: Table 'test.t1' doesn't exist
1246DROP PROCEDURE p1;
1247#
1248# Missing column
1249#
1250CREATE TABLE t1 (b INT);
1251CREATE PROCEDURE p1
1252AS
1253a t1.a%TYPE;
1254BEGIN
1255NULL;
1256END;
1257$$
1258CALL p1();
1259ERROR 42S22: Unknown column 'a' in 't1'
1260DROP PROCEDURE p1;
1261DROP TABLE t1;
1262#
1263# One %TYPE variable
1264#
1265CREATE TABLE t1 (a INT);
1266CREATE PROCEDURE p1
1267AS
1268a t1.a%TYPE;
1269BEGIN
1270a:= 123;
1271SELECT a;
1272END;
1273$$
1274CALL p1();
1275a
1276123
1277DROP PROCEDURE p1;
1278DROP TABLE t1;
1279#
1280# Two %TYPE variables, with a truncation warning on assignment
1281#
1282CREATE TABLE t1 (a TINYINT, b INT);
1283CREATE PROCEDURE p1
1284AS
1285a t1.a%TYPE;
1286b t1.b%TYPE;
1287BEGIN
1288a:= 200;
1289b:= 200;
1290SELECT a, b;
1291END;
1292$$
1293CALL p1();
1294a	b
1295127	200
1296Warnings:
1297Warning	1264	Out of range value for column 'a' at row 1
1298DROP PROCEDURE p1;
1299DROP TABLE t1;
1300#
1301# %TYPE variables for fields with various attributes
1302#
1303CREATE TABLE t1 (
1304id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
1305a TINYINT NOT NULL,
1306b INT NOT NULL,
1307ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
1308UNIQUE(a)
1309);
1310CREATE PROCEDURE p1
1311AS
1312id t1.id%TYPE;
1313a t1.a%TYPE;
1314b t1.b%TYPE;
1315ts t1.ts%TYPE;
1316BEGIN
1317SELECT id, a, b, ts;
1318CREATE TABLE t2 AS SELECT id, a, b, ts;
1319SHOW CREATE TABLE t2;
1320DROP TABLE t2;
1321END;
1322$$
1323CALL p1();
1324id	a	b	ts
1325NULL	NULL	NULL	NULL
1326Table	Create Table
1327t2	CREATE TABLE "t2" (
1328  "id" int(11) DEFAULT NULL,
1329  "a" tinyint(4) DEFAULT NULL,
1330  "b" int(11) DEFAULT NULL,
1331  "ts" timestamp NULL DEFAULT NULL
1332)
1333DROP PROCEDURE p1;
1334DROP TABLE t1;
1335#
1336# %TYPE + virtual columns
1337#
1338CREATE TABLE t1 (
1339a INT NOT NULL,
1340b VARCHAR(32),
1341c INT AS (a + 10) VIRTUAL,
1342d VARCHAR(5) AS (left(b,5)) PERSISTENT
1343);
1344CREATE PROCEDURE p1
1345AS
1346c t1.c%TYPE;
1347d t1.d%TYPE;
1348BEGIN
1349SELECT c, d;
1350CREATE TABLE t2 AS SELECT c, d;
1351SHOW CREATE TABLE t2;
1352DROP TABLE t2;
1353END;
1354$$
1355CALL p1();
1356c	d
1357NULL	NULL
1358Table	Create Table
1359t2	CREATE TABLE "t2" (
1360  "c" int(11) DEFAULT NULL,
1361  "d" varchar(5) DEFAULT NULL
1362)
1363DROP PROCEDURE p1;
1364DROP TABLE t1;
1365#
1366# %TYPE + the ZEROFILL attribute
1367#
1368CREATE TABLE t1 (
1369dz DECIMAL(10,3) ZEROFILL
1370);
1371CREATE PROCEDURE p1
1372AS
1373dzr t1.dz%TYPE := 10;
1374dzt DECIMAL(10,3) ZEROFILL := 10;
1375BEGIN
1376SELECT dzr, dzt;
1377CREATE TABLE t2 AS SELECT dzr,dzt;
1378SHOW CREATE TABLE t2;
1379DROP TABLE t2;
1380END;
1381$$
1382CALL p1();
1383dzr	dzt
13840000010.000	0000010.000
1385Table	Create Table
1386t2	CREATE TABLE "t2" (
1387  "dzr" decimal(10,3) unsigned DEFAULT NULL,
1388  "dzt" decimal(10,3) unsigned DEFAULT NULL
1389)
1390DROP PROCEDURE p1;
1391DROP TABLE t1;
1392#
1393# Temporary tables shadow real tables for %TYPE purposes
1394#
1395CREATE TABLE t1 (a VARCHAR(10));
1396INSERT INTO t1 VALUES ('t1');
1397CREATE TEMPORARY TABLE t1 (a INT);
1398INSERT INTO t1 VALUES (10);
1399SELECT * FROM t1;
1400a
140110
1402CREATE PROCEDURE p1
1403AS
1404a t1.a%TYPE:=11;
1405BEGIN
1406CREATE TABLE t2 AS SELECT a;
1407END;
1408$$
1409#
1410# Should use INT(11) as %TYPE, as in the temporary table
1411#
1412CALL p1();
1413SHOW CREATE TABLE t2;
1414Table	Create Table
1415t2	CREATE TABLE "t2" (
1416  "a" int(11) DEFAULT NULL
1417)
1418SELECT * FROM t2;
1419a
142011
1421DROP TABLE t2;
1422SELECT * FROM t1;
1423a
142410
1425DROP TEMPORARY TABLE t1;
1426SELECT * FROM t1;
1427a
1428t1
1429#
1430# Should use VARCHAR(10) as %TYPE, as in the real table
1431#
1432CALL p1();
1433SHOW CREATE TABLE t2;
1434Table	Create Table
1435t2	CREATE TABLE "t2" (
1436  "a" varchar(10) DEFAULT NULL
1437)
1438SELECT * FROM t2;
1439a
144011
1441DROP TABLE t2;
1442DROP PROCEDURE p1;
1443DROP TABLE t1;
1444#
1445# t1.a%TYPE searches for "t1" in the current database
1446#
1447CREATE TABLE t1 (a VARCHAR(10));
1448CREATE DATABASE test1;
1449CREATE TABLE test1.t1 (a INT);
1450CREATE PROCEDURE p1
1451AS
1452a t1.a%TYPE:=11;
1453BEGIN
1454CREATE TABLE test.t2 AS SELECT a;
1455END;
1456$$
1457#
1458# This interprets t1.a%TYPE as VARCHAR(10), as in test.t1.a
1459#
1460USE test;
1461CALL test.p1();
1462SHOW CREATE TABLE test.t2;
1463Table	Create Table
1464t2	CREATE TABLE "t2" (
1465  "a" varchar(10) DEFAULT NULL
1466)
1467DROP TABLE test.t2;
1468#
1469# This interprets t1.a%TYPE as INT, as in test1.t1.a
1470#
1471USE test1;
1472CALL test.p1();
1473SHOW CREATE TABLE test.t2;
1474Table	Create Table
1475t2	CREATE TABLE "t2" (
1476  "a" int(11) DEFAULT NULL
1477)
1478DROP TABLE test.t2;
1479#
1480# Error if there is no an active database
1481#
1482DROP DATABASE test1;
1483CALL test.p1();
1484ERROR 3D000: No database selected
1485USE test;
1486DROP PROCEDURE p1;
1487DROP TABLE t1;
1488#
1489# A reference to a table in a non-existing database
1490#
1491CREATE PROCEDURE p1
1492AS
1493a test1.t1.a%TYPE;
1494BEGIN
1495CREATE TABLE t1 AS SELECT a;
1496END;
1497$$
1498CALL p1;
1499ERROR 42S02: Table 'test1.t1' doesn't exist
1500DROP PROCEDURE p1;
1501#
1502# A reference to a table in a different database
1503#
1504CREATE TABLE t1(a INT);
1505CREATE DATABASE test1;
1506CREATE TABLE test1.t1 (a VARCHAR(10));
1507CREATE PROCEDURE p1
1508AS
1509a t1.a%TYPE;
1510b test1.t1.a%TYPE;
1511BEGIN
1512CREATE TABLE t2 AS SELECT a,b;
1513END;
1514$$
1515CALL p1;
1516SHOW CREATE TABLE t2;
1517Table	Create Table
1518t2	CREATE TABLE "t2" (
1519  "a" int(11) DEFAULT NULL,
1520  "b" varchar(10) DEFAULT NULL
1521)
1522DROP PROCEDURE p1;
1523DROP TABLE t2;
1524DROP DATABASE test1;
1525DROP TABLE t1;
1526#
1527# Using a table before it appears in a %TYPE declaration + multiple %TYPE declarations
1528#
1529CREATE TABLE t1 (a INT, b VARCHAR(10));
1530INSERT INTO t1 (a,b) VALUES (10,'b10');
1531CREATE PROCEDURE p1
1532AS
1533BEGIN
1534INSERT INTO t1 (a,b) VALUES (11, 'b11');
1535SELECT * FROM t1;
1536DECLARE
1537va t1.a%TYPE:= 30;
1538vb t1.b%TYPE:= 'b30';
1539BEGIN
1540INSERT INTO t1 (a,b) VALUES (12,'b12');
1541SELECT * FROM t1;
1542INSERT INTO t1 (a,b) VALUES (va, vb);
1543SELECT * FROM t1;
1544END;
1545DECLARE
1546va t1.a%TYPE:= 40;
1547vb t1.b%TYPE:= 'b40';
1548BEGIN
1549INSERT INTO t1 (a,b) VALUES (va,vb);
1550SELECT * FROM t1;
1551END;
1552END;
1553$$
1554CALL p1;
1555a	b
155610	b10
155711	b11
1558a	b
155910	b10
156011	b11
156112	b12
1562a	b
156310	b10
156411	b11
156512	b12
156630	b30
1567a	b
156810	b10
156911	b11
157012	b12
157130	b30
157240	b40
1573DROP TABLE t1;
1574DROP PROCEDURE p1;
1575#
1576# %TYPE variables + TABLE vs VIEW
1577#
1578CREATE TABLE t1 (
1579bit6 BIT(6),
1580bit7 BIT(7),
1581bit8 BIT(8),
1582i1 TINYINT,
1583i2 SMALLINT,
1584i3 MEDIUMINT,
1585i4 INT,
1586i8 BIGINT,
1587ff FLOAT,
1588fd DOUBLE,
1589cc CHAR(10),
1590cv VARCHAR(10),
1591cvu VARCHAR(10) CHARACTER SET utf8,
1592t1 TINYTEXT,
1593t2 TEXT,
1594t3 MEDIUMTEXT,
1595t4 LONGTEXT,
1596enum1 ENUM('a','b','c'),
1597set1  SET('a','b','c'),
1598blob1 TINYBLOB,
1599blob2 BLOB,
1600blob3 MEDIUMBLOB,
1601blob4 LONGBLOB,
1602yy  YEAR,
1603dd  DATE,
1604tm0 TIME,
1605tm3 TIME(3),
1606tm6 TIME(6),
1607dt0 DATETIME,
1608dt3 DATETIME(3),
1609dt6 DATETIME(6),
1610ts0 TIMESTAMP,
1611ts3 TIMESTAMP(3),
1612ts6 TIMESTAMP(6),
1613dc100 DECIMAL(10,0),
1614dc103 DECIMAL(10,3),
1615dc209 DECIMAL(20,9)
1616);
1617CREATE PROCEDURE p1(command enum('create','select'))
1618AS
1619bit6  t1.bit6%TYPE := 0x30;
1620bit7  t1.bit7%TYPE := 0x41;
1621bit8  t1.bit8%TYPE := 0x7E;
1622i1  t1.i1%TYPE := 11;
1623i2  t1.i2%TYPE := 12;
1624i3  t1.i3%TYPE := 13;
1625i4  t1.i4%TYPE := 14;
1626i8  t1.i8%TYPE := 18;
1627ff  t1.ff%TYPE := 21;
1628fd  t1.fd%TYPE := 22;
1629cc  t1.cc%TYPE := 'char';
1630cv  t1.cv%TYPE := 'varchar';
1631cvu t1.cvu%TYPE := 'varcharu8';
1632t1  t1.t1%TYPE := 'text1';
1633t2  t1.t2%TYPE := 'text2';
1634t3  t1.t3%TYPE := 'text3';
1635t4  t1.t4%TYPE := 'text4';
1636enum1 t1.enum1%TYPE := 'b';
1637set1  t1.set1%TYPE  := 'a,c';
1638blob1 t1.blob1%TYPE := 'blob1';
1639blob2 t1.blob2%TYPE := 'blob2';
1640blob3 t1.blob3%TYPE := 'blob3';
1641blob4 t1.blob4%TYPE := 'blob4';
1642yy  t1.yy%TYPE := 2001;
1643dd  t1.dd%TYPE := '2001-01-01';
1644tm0 t1.tm0%TYPE := '00:00:01';
1645tm3 t1.tm3%TYPE := '00:00:03.333';
1646tm6 t1.tm6%TYPE := '00:00:06.666666';
1647dt0 t1.dt0%TYPE := '2001-01-01 00:00:01';
1648dt3 t1.dt3%TYPE := '2001-01-03 00:00:01.333';
1649dt6 t1.dt6%TYPE := '2001-01-06 00:00:01.666666';
1650ts0 t1.ts0%TYPE := '2002-01-01 00:00:01';
1651ts3 t1.ts3%TYPE := '2002-01-03 00:00:01.333';
1652ts6 t1.ts6%TYPE := '2002-01-06 00:00:01.666666';
1653dc100 t1.dc100%TYPE := 10;
1654dc103 t1.dc103%TYPE := 10.123;
1655dc209 t1.dc209%TYPE := 10.123456789;
1656BEGIN
1657CASE
1658WHEN command='create' THEN
1659CREATE TABLE t2 AS SELECT
1660bit6, bit7, bit8,
1661i1,i2,i3,i4,i8,
1662ff,fd, dc100, dc103, dc209,
1663cc,cv,cvu,
1664t1,t2,t3,t4,
1665enum1, set1,
1666blob1, blob2, blob3, blob4,
1667dd, yy,
1668tm0, tm3, tm6,
1669dt0, dt3, dt6,
1670ts0, ts3, ts6;
1671WHEN command='select' THEN
1672SELECT
1673bit6, bit7, bit8,
1674i1,i2,i3,i4,i8,
1675ff,fd, dc100, dc103, dc209,
1676cc,cv,cvu,
1677t1,t2,t3,t4,
1678enum1, set1,
1679blob1, blob2, blob3, blob4,
1680dd, yy,
1681tm0, tm3, tm6,
1682dt0, dt3, dt6,
1683ts0, ts3, ts6;
1684END CASE;
1685END;
1686$$
1687#
1688# TABLE
1689#
1690CALL p1('create');
1691SHOW CREATE TABLE t2;
1692Table	Create Table
1693t2	CREATE TABLE "t2" (
1694  "bit6" bit(6) DEFAULT NULL,
1695  "bit7" bit(7) DEFAULT NULL,
1696  "bit8" bit(8) DEFAULT NULL,
1697  "i1" tinyint(4) DEFAULT NULL,
1698  "i2" smallint(6) DEFAULT NULL,
1699  "i3" mediumint(9) DEFAULT NULL,
1700  "i4" int(11) DEFAULT NULL,
1701  "i8" bigint(20) DEFAULT NULL,
1702  "ff" float DEFAULT NULL,
1703  "fd" double DEFAULT NULL,
1704  "dc100" decimal(10,0) DEFAULT NULL,
1705  "dc103" decimal(10,3) DEFAULT NULL,
1706  "dc209" decimal(20,9) DEFAULT NULL,
1707  "cc" char(10) DEFAULT NULL,
1708  "cv" varchar(10) DEFAULT NULL,
1709  "cvu" varchar(10) CHARACTER SET utf8 DEFAULT NULL,
1710  "t1" tinytext DEFAULT NULL,
1711  "t2" text DEFAULT NULL,
1712  "t3" mediumtext DEFAULT NULL,
1713  "t4" longtext DEFAULT NULL,
1714  "enum1" char(1) DEFAULT NULL,
1715  "set1" char(5) DEFAULT NULL,
1716  "blob1" tinyblob DEFAULT NULL,
1717  "blob2" longblob DEFAULT NULL,
1718  "blob3" mediumblob DEFAULT NULL,
1719  "blob4" longblob DEFAULT NULL,
1720  "dd" datetime DEFAULT NULL,
1721  "yy" year(4) DEFAULT NULL,
1722  "tm0" time DEFAULT NULL,
1723  "tm3" time(3) DEFAULT NULL,
1724  "tm6" time(6) DEFAULT NULL,
1725  "dt0" datetime DEFAULT NULL,
1726  "dt3" datetime(3) DEFAULT NULL,
1727  "dt6" datetime(6) DEFAULT NULL,
1728  "ts0" timestamp NULL DEFAULT NULL,
1729  "ts3" timestamp(3) NULL DEFAULT NULL,
1730  "ts6" timestamp(6) NULL DEFAULT NULL
1731)
1732SELECT * FROM t2;
1733bit6	0
1734bit7	A
1735bit8	~
1736i1	11
1737i2	12
1738i3	13
1739i4	14
1740i8	18
1741ff	21
1742fd	22
1743dc100	10
1744dc103	10.123
1745dc209	10.123456789
1746cc	char
1747cv	varchar
1748cvu	varcharu8
1749t1	text1
1750t2	text2
1751t3	text3
1752t4	text4
1753enum1	b
1754set1	a,c
1755blob1	blob1
1756blob2	blob2
1757blob3	blob3
1758blob4	blob4
1759dd	2001-01-01 00:00:00
1760yy	2001
1761tm0	00:00:01
1762tm3	00:00:03.333
1763tm6	00:00:06.666666
1764dt0	2001-01-01 00:00:01
1765dt3	2001-01-03 00:00:01.333
1766dt6	2001-01-06 00:00:01.666666
1767ts0	2002-01-01 00:00:01
1768ts3	2002-01-03 00:00:01.333
1769ts6	2002-01-06 00:00:01.666666
1770DROP TABLE t2;
1771CALL p1('select');
1772Catalog	Database	Table	Table_alias	Column	Column_alias	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
1773def				bit6	bit6	16	6	1	Y	32	0	63
1774def				bit7	bit7	16	7	1	Y	32	0	63
1775def				bit8	bit8	16	8	1	Y	32	0	63
1776def				i1	i1	1	4	2	Y	32768	0	63
1777def				i2	i2	2	6	2	Y	32768	0	63
1778def				i3	i3	9	9	2	Y	32768	0	63
1779def				i4	i4	3	11	2	Y	32768	0	63
1780def				i8	i8	8	20	2	Y	32768	0	63
1781def				ff	ff	4	12	2	Y	32768	31	63
1782def				fd	fd	5	22	2	Y	32768	31	63
1783def				dc100	dc100	246	11	2	Y	32768	0	63
1784def				dc103	dc103	246	12	6	Y	32768	3	63
1785def				dc209	dc209	246	22	12	Y	32768	9	63
1786def				cc	cc	254	10	4	Y	0	0	8
1787def				cv	cv	253	10	7	Y	0	0	8
1788def				cvu	cvu	253	10	9	Y	0	0	8
1789def				t1	t1	252	255	5	Y	16	0	8
1790def				t2	t2	252	65535	5	Y	16	0	8
1791def				t3	t3	252	16777215	5	Y	16	0	8
1792def				t4	t4	252	4294967295	5	Y	16	0	8
1793def				enum1	enum1	254	1	1	Y	256	0	8
1794def				set1	set1	254	5	3	Y	2048	0	8
1795def				blob1	blob1	252	255	5	Y	144	0	63
1796def				blob2	blob2	252	4294967295	5	Y	144	0	63
1797def				blob3	blob3	252	16777215	5	Y	144	0	63
1798def				blob4	blob4	252	4294967295	5	Y	144	0	63
1799def				dd	dd	12	19	19	Y	128	0	63
1800def				yy	yy	13	4	4	Y	32864	0	63
1801def				tm0	tm0	11	10	8	Y	128	0	63
1802def				tm3	tm3	11	14	12	Y	128	3	63
1803def				tm6	tm6	11	17	15	Y	128	6	63
1804def				dt0	dt0	12	19	19	Y	128	0	63
1805def				dt3	dt3	12	23	23	Y	128	3	63
1806def				dt6	dt6	12	26	26	Y	128	6	63
1807def				ts0	ts0	7	19	19	Y	9376	0	63
1808def				ts3	ts3	7	23	23	Y	160	3	63
1809def				ts6	ts6	7	26	26	Y	160	6	63
1810bit6	0
1811bit7	A
1812bit8	~
1813i1	11
1814i2	12
1815i3	13
1816i4	14
1817i8	18
1818ff	21
1819fd	22
1820dc100	10
1821dc103	10.123
1822dc209	10.123456789
1823cc	char
1824cv	varchar
1825cvu	varcharu8
1826t1	text1
1827t2	text2
1828t3	text3
1829t4	text4
1830enum1	b
1831set1	a,c
1832blob1	blob1
1833blob2	blob2
1834blob3	blob3
1835blob4	blob4
1836dd	2001-01-01 00:00:00
1837yy	2001
1838tm0	00:00:01
1839tm3	00:00:03.333
1840tm6	00:00:06.666666
1841dt0	2001-01-01 00:00:01
1842dt3	2001-01-03 00:00:01.333
1843dt6	2001-01-06 00:00:01.666666
1844ts0	2002-01-01 00:00:01
1845ts3	2002-01-03 00:00:01.333
1846ts6	2002-01-06 00:00:01.666666
1847#
1848# VIEW
1849#
1850ALTER TABLE t1 RENAME t0;
1851CREATE VIEW t1 AS SELECT * FROM t0;
1852CALL p1('create');
1853SHOW CREATE TABLE t2;
1854Table	Create Table
1855t2	CREATE TABLE "t2" (
1856  "bit6" bit(6) DEFAULT NULL,
1857  "bit7" bit(7) DEFAULT NULL,
1858  "bit8" bit(8) DEFAULT NULL,
1859  "i1" tinyint(4) DEFAULT NULL,
1860  "i2" smallint(6) DEFAULT NULL,
1861  "i3" mediumint(9) DEFAULT NULL,
1862  "i4" int(11) DEFAULT NULL,
1863  "i8" bigint(20) DEFAULT NULL,
1864  "ff" float DEFAULT NULL,
1865  "fd" double DEFAULT NULL,
1866  "dc100" decimal(10,0) DEFAULT NULL,
1867  "dc103" decimal(10,3) DEFAULT NULL,
1868  "dc209" decimal(20,9) DEFAULT NULL,
1869  "cc" char(10) DEFAULT NULL,
1870  "cv" varchar(10) DEFAULT NULL,
1871  "cvu" varchar(10) CHARACTER SET utf8 DEFAULT NULL,
1872  "t1" tinytext DEFAULT NULL,
1873  "t2" text DEFAULT NULL,
1874  "t3" mediumtext DEFAULT NULL,
1875  "t4" longtext DEFAULT NULL,
1876  "enum1" char(1) DEFAULT NULL,
1877  "set1" char(5) DEFAULT NULL,
1878  "blob1" tinyblob DEFAULT NULL,
1879  "blob2" longblob DEFAULT NULL,
1880  "blob3" mediumblob DEFAULT NULL,
1881  "blob4" longblob DEFAULT NULL,
1882  "dd" datetime DEFAULT NULL,
1883  "yy" year(4) DEFAULT NULL,
1884  "tm0" time DEFAULT NULL,
1885  "tm3" time(3) DEFAULT NULL,
1886  "tm6" time(6) DEFAULT NULL,
1887  "dt0" datetime DEFAULT NULL,
1888  "dt3" datetime(3) DEFAULT NULL,
1889  "dt6" datetime(6) DEFAULT NULL,
1890  "ts0" timestamp NULL DEFAULT NULL,
1891  "ts3" timestamp(3) NULL DEFAULT NULL,
1892  "ts6" timestamp(6) NULL DEFAULT NULL
1893)
1894SELECT * FROM t2;
1895bit6	0
1896bit7	A
1897bit8	~
1898i1	11
1899i2	12
1900i3	13
1901i4	14
1902i8	18
1903ff	21
1904fd	22
1905dc100	10
1906dc103	10.123
1907dc209	10.123456789
1908cc	char
1909cv	varchar
1910cvu	varcharu8
1911t1	text1
1912t2	text2
1913t3	text3
1914t4	text4
1915enum1	b
1916set1	a,c
1917blob1	blob1
1918blob2	blob2
1919blob3	blob3
1920blob4	blob4
1921dd	2001-01-01 00:00:00
1922yy	2001
1923tm0	00:00:01
1924tm3	00:00:03.333
1925tm6	00:00:06.666666
1926dt0	2001-01-01 00:00:01
1927dt3	2001-01-03 00:00:01.333
1928dt6	2001-01-06 00:00:01.666666
1929ts0	2002-01-01 00:00:01
1930ts3	2002-01-03 00:00:01.333
1931ts6	2002-01-06 00:00:01.666666
1932DROP TABLE t2;
1933CALL p1('select');
1934Catalog	Database	Table	Table_alias	Column	Column_alias	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
1935def				bit6	bit6	16	6	1	Y	32	0	63
1936def				bit7	bit7	16	7	1	Y	32	0	63
1937def				bit8	bit8	16	8	1	Y	32	0	63
1938def				i1	i1	1	4	2	Y	32768	0	63
1939def				i2	i2	2	6	2	Y	32768	0	63
1940def				i3	i3	9	9	2	Y	32768	0	63
1941def				i4	i4	3	11	2	Y	32768	0	63
1942def				i8	i8	8	20	2	Y	32768	0	63
1943def				ff	ff	4	12	2	Y	32768	31	63
1944def				fd	fd	5	22	2	Y	32768	31	63
1945def				dc100	dc100	246	11	2	Y	32768	0	63
1946def				dc103	dc103	246	12	6	Y	32768	3	63
1947def				dc209	dc209	246	22	12	Y	32768	9	63
1948def				cc	cc	254	10	4	Y	0	0	8
1949def				cv	cv	253	10	7	Y	0	0	8
1950def				cvu	cvu	253	10	9	Y	0	0	8
1951def				t1	t1	252	255	5	Y	16	0	8
1952def				t2	t2	252	65535	5	Y	16	0	8
1953def				t3	t3	252	16777215	5	Y	16	0	8
1954def				t4	t4	252	4294967295	5	Y	16	0	8
1955def				enum1	enum1	254	1	1	Y	256	0	8
1956def				set1	set1	254	5	3	Y	2048	0	8
1957def				blob1	blob1	252	255	5	Y	144	0	63
1958def				blob2	blob2	252	4294967295	5	Y	144	0	63
1959def				blob3	blob3	252	16777215	5	Y	144	0	63
1960def				blob4	blob4	252	4294967295	5	Y	144	0	63
1961def				dd	dd	12	19	19	Y	128	0	63
1962def				yy	yy	13	4	4	Y	32864	0	63
1963def				tm0	tm0	11	10	8	Y	128	0	63
1964def				tm3	tm3	11	14	12	Y	128	3	63
1965def				tm6	tm6	11	17	15	Y	128	6	63
1966def				dt0	dt0	12	19	19	Y	128	0	63
1967def				dt3	dt3	12	23	23	Y	128	3	63
1968def				dt6	dt6	12	26	26	Y	128	6	63
1969def				ts0	ts0	7	19	19	Y	160	0	63
1970def				ts3	ts3	7	23	23	Y	160	3	63
1971def				ts6	ts6	7	26	26	Y	160	6	63
1972bit6	0
1973bit7	A
1974bit8	~
1975i1	11
1976i2	12
1977i3	13
1978i4	14
1979i8	18
1980ff	21
1981fd	22
1982dc100	10
1983dc103	10.123
1984dc209	10.123456789
1985cc	char
1986cv	varchar
1987cvu	varcharu8
1988t1	text1
1989t2	text2
1990t3	text3
1991t4	text4
1992enum1	b
1993set1	a,c
1994blob1	blob1
1995blob2	blob2
1996blob3	blob3
1997blob4	blob4
1998dd	2001-01-01 00:00:00
1999yy	2001
2000tm0	00:00:01
2001tm3	00:00:03.333
2002tm6	00:00:06.666666
2003dt0	2001-01-01 00:00:01
2004dt3	2001-01-03 00:00:01.333
2005dt6	2001-01-06 00:00:01.666666
2006ts0	2002-01-01 00:00:01
2007ts3	2002-01-03 00:00:01.333
2008ts6	2002-01-06 00:00:01.666666
2009DROP VIEW t1;
2010DROP TABLE t0;
2011DROP PROCEDURE p1;
2012#
2013# VIEW with subqueries
2014#
2015CREATE TABLE t1 (a INT,b INT);
2016INSERT INTO t1 VALUES (10,1),(20,2),(30,3),(40,4);
2017SELECT AVG(a) FROM t1;
2018AVG(a)
201925.0000
2020CREATE VIEW v1 AS SELECT a,1 as b FROM t1 WHERE a>(SELECT AVG(a) FROM t1) AND b>(SELECT 1);
2021SELECT * FROM v1;
2022a	b
202330	1
202440	1
2025CREATE PROCEDURE p1
2026AS
2027a v1.a%TYPE := 10;
2028b v1.b%TYPE := 1;
2029BEGIN
2030SELECT a,b;
2031END;
2032$$
2033CALL p1;
2034a	b
203510	1
2036DROP PROCEDURE p1;
2037CREATE FUNCTION f1 RETURN INT
2038AS
2039a v1.a%TYPE := 10;
2040b v1.b%TYPE := 1;
2041BEGIN
2042RETURN a+b;
2043END;
2044$$
2045SELECT f1();
2046f1()
204711
2048DROP FUNCTION f1;
2049DROP VIEW v1;
2050DROP TABLE t1;
2051#
2052# %TYPE variables + INFORMATION_SCHEMA
2053#
2054CREATE PROCEDURE p1
2055AS
2056tables_table_name INFORMATION_SCHEMA.TABLES.TABLE_NAME%TYPE;
2057tables_table_rows INFORMATION_SCHEMA.TABLES.TABLE_ROWS%TYPE;
2058processlist_info INFORMATION_SCHEMA.PROCESSLIST.INFO%TYPE;
2059processlist_info_binary INFORMATION_SCHEMA.PROCESSLIST.INFO_BINARY%TYPE;
2060BEGIN
2061CREATE TABLE t1 AS SELECT
2062tables_table_name,
2063tables_table_rows,
2064processlist_info,
2065processlist_info_binary;
2066END;
2067$$
2068CALL p1();
2069SHOW CREATE TABLE t1;
2070Table	Create Table
2071t1	CREATE TABLE "t1" (
2072  "tables_table_name" varchar(64) CHARACTER SET utf8 DEFAULT NULL,
2073  "tables_table_rows" bigint(21) unsigned DEFAULT NULL,
2074  "processlist_info" longtext CHARACTER SET utf8 DEFAULT NULL,
2075  "processlist_info_binary" blob(65535) DEFAULT NULL
2076)
2077DROP TABLE t1;
2078DROP PROCEDURE p1;
2079#
2080# %TYPE + Table structure change
2081# Data type for both a0 and a1 is chosen in the very beginning
2082#
2083CREATE PROCEDURE p1
2084AS
2085a0 t1.a%TYPE;
2086BEGIN
2087ALTER TABLE t1 MODIFY a VARCHAR(10); -- This does not affect a1
2088DECLARE
2089a1 t1.a%TYPE;
2090BEGIN
2091CREATE TABLE t2 AS SELECT a0, a1;
2092SHOW CREATE TABLE t2;
2093DROP TABLE t2;
2094END;
2095END
2096$$
2097CREATE TABLE t1 (a INT);
2098CALL p1;
2099Table	Create Table
2100t2	CREATE TABLE "t2" (
2101  "a0" int(11) DEFAULT NULL,
2102  "a1" int(11) DEFAULT NULL
2103)
2104DROP TABLE t1;
2105DROP PROCEDURE p1;
2106#
2107# %TYPE in parameters
2108#
2109CREATE TABLE t1 (a VARCHAR(10));
2110CREATE DATABASE test1;
2111CREATE TABLE test1.t1 (b SMALLINT);
2112CREATE PROCEDURE p1(a t1.a%TYPE, b test1.t1.b%TYPE)
2113AS
2114BEGIN
2115CREATE TABLE t2 AS SELECT a, b;
2116END;
2117$$
2118CALL p1('test', 123);
2119SHOW CREATE TABLE t2;
2120Table	Create Table
2121t2	CREATE TABLE "t2" (
2122  "a" varchar(10) DEFAULT NULL,
2123  "b" smallint(6) DEFAULT NULL
2124)
2125SELECT * FROM t2;
2126a	b
2127test	123
2128DROP TABLE t2;
2129DROP PROCEDURE p1;
2130DROP TABLE test1.t1;
2131DROP DATABASE test1;
2132DROP TABLE t1;
2133#
2134# %TYPE in a stored function variables and arguments
2135#
2136CREATE TABLE t1 (a INT);
2137SET sql_mode=ORACLE;
2138CREATE FUNCTION f1 (prm t1.a%TYPE) RETURN INT
2139AS
2140a t1.a%TYPE:= prm;
2141BEGIN
2142RETURN a;
2143END;
2144$$
2145SELECT f1(20);
2146f1(20)
214720
2148DROP FUNCTION f1;
2149DROP TABLE t1;
2150#
2151# %TYPE in function RETURN clause is not supported yet
2152#
2153CREATE FUNCTION f1 RETURN t1.a%TYPE
2154AS
2155BEGIN
2156RETURN 0;
2157END;
2158$$
2159ERROR 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 't1.a%TYPE
2160AS
2161BEGIN
2162RETURN 0;
2163END' at line 1
2164#
2165# End of MDEV-10577 sql_mode=ORACLE: %TYPE in variable declarations
2166#
2167#
2168# MDEV-12089 sql_mode=ORACLE: Understand optional routine name after the END keyword
2169#
2170CREATE FUNCTION f1 RETURN INT AS
2171BEGIN
2172RETURN 10;
2173END f1;
2174$$
2175DROP FUNCTION f1;
2176CREATE FUNCTION test.f1 RETURN INT AS
2177BEGIN
2178RETURN 10;
2179END test.f1;
2180$$
2181DROP FUNCTION f1;
2182CREATE FUNCTION test.f1 RETURN INT AS
2183BEGIN
2184RETURN 10;
2185END test2.f1;
2186$$
2187ERROR HY000: END identifier 'test2.f1' does not match 'test.f1'
2188CREATE FUNCTION test.f1 RETURN INT AS
2189BEGIN
2190RETURN 10;
2191END test.f2;
2192$$
2193ERROR HY000: END identifier 'test.f2' does not match 'test.f1'
2194CREATE FUNCTION f1 RETURN INT AS
2195BEGIN
2196RETURN 10;
2197END test.f2;
2198$$
2199ERROR HY000: END identifier 'test.f2' does not match 'test.f1'
2200CREATE FUNCTION f1 RETURN INT AS
2201BEGIN
2202RETURN 10;
2203END test2.f1;
2204$$
2205ERROR HY000: END identifier 'test2.f1' does not match 'test.f1'
2206CREATE PROCEDURE p1 AS
2207BEGIN
2208NULL;
2209END p1;
2210$$
2211DROP PROCEDURE p1;
2212CREATE PROCEDURE test.p1 AS
2213BEGIN
2214NULL;
2215END test.p1;
2216$$
2217DROP PROCEDURE p1;
2218CREATE PROCEDURE test.p1 AS
2219BEGIN
2220NULL;
2221END test2.p1;
2222$$
2223ERROR HY000: END identifier 'test2.p1' does not match 'test.p1'
2224CREATE PROCEDURE test.p1 AS
2225BEGIN
2226NULL;
2227END test.p2;
2228$$
2229ERROR HY000: END identifier 'test.p2' does not match 'test.p1'
2230CREATE PROCEDURE p1 AS
2231BEGIN
2232NULL;
2233END test.p2;
2234$$
2235ERROR HY000: END identifier 'test.p2' does not match 'test.p1'
2236CREATE PROCEDURE p1 AS
2237BEGIN
2238NULL;
2239END test2.p1;
2240$$
2241ERROR HY000: END identifier 'test2.p1' does not match 'test.p1'
2242#
2243# MDEV-12107 sql_mode=ORACLE: Inside routines the CALL keywoard is optional
2244#
2245CREATE OR REPLACE PROCEDURE p1(a INT) AS
2246BEGIN
2247SELECT 'This is p1' AS "comment";
2248END;
2249/
2250CREATE OR REPLACE PROCEDURE p2 AS
2251BEGIN
2252SELECT 'This is p2' AS "comment";
2253END;
2254/
2255BEGIN
2256p1(10);
2257p2;
2258test.p1(10);
2259test.p2;
2260END;
2261/
2262comment
2263This is p1
2264comment
2265This is p2
2266comment
2267This is p1
2268comment
2269This is p2
2270CREATE PROCEDURE p3 AS
2271BEGIN
2272p1(10);
2273p2;
2274test.p1(10);
2275test.p2;
2276END
2277/
2278CALL p3;
2279comment
2280This is p1
2281comment
2282This is p2
2283comment
2284This is p1
2285comment
2286This is p2
2287DROP PROCEDURE p3;
2288DROP PROCEDURE p2;
2289DROP PROCEDURE p1;
2290#
2291# MDEV-12854 Synchronize CREATE..SELECT data type and result set metadata data type for INT functions
2292#
2293SELECT SQL%ROWCOUNT;
2294Catalog	Database	Table	Table_alias	Column	Column_alias	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
2295def					SQL%ROWCOUNT	8	21	1	N	32897	0	63
2296SQL%ROWCOUNT
22970
2298#
2299# MDEV-13686 EXCEPTION reserved keyword in SQL_MODE=oracle but not in Oracle itself
2300#
2301CREATE TABLE t1 (c1 int);
2302CREATE VIEW v1 AS SELECT c1 exception FROM t1;
2303SELECT exception FROM v1;
2304exception
2305DROP VIEW v1;
2306DROP TABLE t1;
2307#
2308# MDEV-14139 Anchored data types for variables
2309#
2310BEGIN NOT ATOMIC
2311DECLARE a a%TYPE;
2312END;
2313$$
2314ERROR 42000: Undeclared variable: a
2315DECLARE
2316int11 INT;
2317dec103 DECIMAL(10,3);
2318flt0 FLOAT;
2319dbl0 DOUBLE;
2320enum0 ENUM('a','b');
2321bit3 BIT(3);
2322varchar10 VARCHAR(10);
2323text1 TEXT;
2324tinytext1 TINYTEXT;
2325mediumtext1 MEDIUMTEXT;
2326longtext1 LONGTEXT;
2327time3 TIME(3);
2328datetime4 DATETIME(4);
2329timestamp5 TIMESTAMP(5);
2330date0 DATE;
2331a_int11 int11%TYPE;
2332a_dec103 dec103%TYPE;
2333a_flt0 flt0%TYPE;
2334a_dbl0 dbl0%TYPE;
2335a_bit3 bit3%TYPE;
2336a_enum0 enum0%TYPE;
2337a_varchar10 varchar10%TYPE;
2338a_text1 text1%TYPE;
2339a_tinytext1 tinytext1%TYPE;
2340a_mediumtext1 mediumtext1%TYPE;
2341a_longtext1 longtext1%TYPE;
2342a_time3 time3%TYPE;
2343a_datetime4 datetime4%TYPE;
2344a_timestamp5 timestamp5%TYPE;
2345a_date0 date0%TYPE;
2346aa_int11 a_int11%TYPE;
2347aa_dec103 a_dec103%TYPE;
2348aa_flt0 a_flt0%TYPE;
2349aa_dbl0 a_dbl0%TYPE;
2350aa_bit3 a_bit3%TYPE;
2351aa_enum0 a_enum0%TYPE;
2352aa_varchar10 a_varchar10%TYPE;
2353aa_text1 a_text1%TYPE;
2354aa_tinytext1 a_tinytext1%TYPE;
2355aa_mediumtext1 a_mediumtext1%TYPE;
2356aa_longtext1 a_longtext1%TYPE;
2357aa_time3 a_time3%TYPE;
2358aa_datetime4 a_datetime4%TYPE;
2359aa_timestamp5 a_timestamp5%TYPE;
2360aa_date0 a_date0%TYPE;
2361BEGIN
2362CREATE TABLE t1 AS
2363SELECT a_int11,a_dec103,a_flt0,a_dbl0,a_bit3,
2364a_enum0,a_varchar10,
2365a_text1,a_tinytext1,a_mediumtext1,a_longtext1,
2366a_time3,a_datetime4,a_timestamp5,a_date0;
2367SHOW CREATE TABLE t1;
2368DROP TABLE t1;
2369CREATE TABLE t1 AS
2370SELECT aa_int11,aa_dec103,aa_flt0,aa_dbl0,aa_bit3,
2371aa_enum0,aa_varchar10,
2372aa_text1,aa_tinytext1,aa_mediumtext1,aa_longtext1,
2373aa_time3,aa_datetime4,aa_timestamp5,aa_date0;
2374SHOW CREATE TABLE t1;
2375DROP TABLE t1;
2376END;
2377$$
2378Table	Create Table
2379t1	CREATE TABLE "t1" (
2380  "a_int11" int(11) DEFAULT NULL,
2381  "a_dec103" decimal(10,3) DEFAULT NULL,
2382  "a_flt0" float DEFAULT NULL,
2383  "a_dbl0" double DEFAULT NULL,
2384  "a_bit3" bit(3) DEFAULT NULL,
2385  "a_enum0" char(1) DEFAULT NULL,
2386  "a_varchar10" varchar(10) DEFAULT NULL,
2387  "a_text1" text DEFAULT NULL,
2388  "a_tinytext1" tinytext DEFAULT NULL,
2389  "a_mediumtext1" mediumtext DEFAULT NULL,
2390  "a_longtext1" longtext DEFAULT NULL,
2391  "a_time3" time(3) DEFAULT NULL,
2392  "a_datetime4" datetime(4) DEFAULT NULL,
2393  "a_timestamp5" timestamp(5) NULL DEFAULT NULL,
2394  "a_date0" datetime DEFAULT NULL
2395)
2396Table	Create Table
2397t1	CREATE TABLE "t1" (
2398  "aa_int11" int(11) DEFAULT NULL,
2399  "aa_dec103" decimal(10,3) DEFAULT NULL,
2400  "aa_flt0" float DEFAULT NULL,
2401  "aa_dbl0" double DEFAULT NULL,
2402  "aa_bit3" bit(3) DEFAULT NULL,
2403  "aa_enum0" char(1) DEFAULT NULL,
2404  "aa_varchar10" varchar(10) DEFAULT NULL,
2405  "aa_text1" text DEFAULT NULL,
2406  "aa_tinytext1" tinytext DEFAULT NULL,
2407  "aa_mediumtext1" mediumtext DEFAULT NULL,
2408  "aa_longtext1" longtext DEFAULT NULL,
2409  "aa_time3" time(3) DEFAULT NULL,
2410  "aa_datetime4" datetime(4) DEFAULT NULL,
2411  "aa_timestamp5" timestamp(5) NULL DEFAULT NULL,
2412  "aa_date0" datetime DEFAULT NULL
2413)
2414#
2415#  MDEV-11160 "Incorrect column name" when "CREATE TABLE t1 AS SELECT spvar"
2416#
2417CREATE TABLE t1 (x INT);
2418INSERT INTO t1 VALUES (10);
2419CREATE VIEW v1 AS SELECT x+1 AS a,x+1 AS b FROM t1;
2420CREATE PROCEDURE p1
2421AS
2422a INT := 1;
2423b INT := 2;
2424BEGIN
2425CREATE TABLE t2 AS SELECT a,b FROM v1;
2426SHOW CREATE TABLE t2;
2427SELECT * FROM t2;
2428DROP TABLE t2;
2429END;
2430$$
2431CALL p1();
2432Table	Create Table
2433t2	CREATE TABLE "t2" (
2434  "a" int(11) DEFAULT NULL,
2435  "b" int(11) DEFAULT NULL
2436)
2437a	b
24381	2
2439DROP PROCEDURE p1;
2440DROP VIEW v1;
2441DROP TABLE t1;
2442#
2443# MDEV-14228 MariaDB crashes with function
2444#
2445CREATE TABLE t1 (c VARCHAR(16), KEY(c));
2446INSERT INTO t1 VALUES ('foo');
2447CREATE FUNCTION f1() RETURN VARCHAR(16)
2448IS
2449v VARCHAR2(16);
2450BEGIN
2451FOR v IN (SELECT DISTINCT c FROM t1)
2452LOOP
2453IF (v = 'bar') THEN
2454SELECT 1 INTO @a;
2455END IF;
2456END LOOP;
2457RETURN 'qux';
2458END $$
2459SELECT f1();
2460ERROR HY000: Illegal parameter data types row and varchar for operation '='
2461DROP FUNCTION f1;
2462CREATE FUNCTION f1() RETURN VARCHAR(16)
2463IS
2464v t1%ROWTYPE;
2465BEGIN
2466IF v = 'bar' THEN
2467NULL;
2468END IF;
2469RETURN 'qux';
2470END $$
2471SELECT f1();
2472ERROR HY000: Illegal parameter data types row and varchar for operation '='
2473DROP FUNCTION f1;
2474CREATE FUNCTION f1() RETURN VARCHAR(16)
2475IS
2476v ROW(a INT);
2477BEGIN
2478IF v = 'bar' THEN
2479NULL;
2480END IF;
2481RETURN 'qux';
2482END $$
2483SELECT f1();
2484ERROR HY000: Illegal parameter data types row and varchar for operation '='
2485DROP FUNCTION f1;
2486DROP TABLE t1;
2487DECLARE
2488v ROW(a INT);
2489BEGIN
2490SELECT v IN ('a','b');
2491END $$
2492ERROR HY000: Illegal parameter data types row and varchar for operation 'in'
2493DECLARE
2494v ROW(a INT);
2495BEGIN
2496SELECT 'a' IN (v,'b');
2497END $$
2498ERROR HY000: Illegal parameter data types varchar and row for operation 'in'
2499DECLARE
2500v ROW(a INT);
2501BEGIN
2502SELECT 'a' IN ('b',v);
2503END $$
2504ERROR HY000: Illegal parameter data types varchar and row for operation 'in'
2505#
2506# MDEV-17253 Oracle compatibility: The REVERSE key word for FOR loop behaves incorrectly
2507#
2508DECLARE
2509totalprice DECIMAL(12,2):=NULL;
2510loop_start INTEGER := 1;
2511BEGIN
2512FOR idx IN REVERSE loop_start..10 LOOP
2513SELECT idx;
2514END LOOP;
2515END;
2516$$
2517idx
251810
2519idx
25209
2521idx
25228
2523idx
25247
2525idx
25266
2527idx
25285
2529idx
25304
2531idx
25323
2533idx
25342
2535idx
25361
2537CREATE PROCEDURE p1 AS
2538loop_start INTEGER := 1;
2539BEGIN
2540FOR idx IN REVERSE 3..loop_start LOOP
2541SELECT idx;
2542END LOOP;
2543END;
2544$$
2545CALL p1();
2546DROP PROCEDURE p1;
2547CREATE PROCEDURE p1 AS
2548loop_start INTEGER := 1;
2549BEGIN
2550FOR idx IN REVERSE loop_start..3 LOOP
2551SELECT idx;
2552END LOOP;
2553END;
2554$$
2555CALL p1();
2556idx
25573
2558idx
25592
2560idx
25611
2562DROP PROCEDURE p1;
2563