1SET sql_mode=ORACLE;
2
3--echo #
4--echo # MDEV-12011 sql_mode=ORACLE: cursor%ROWTYPE in variable declarations
5--echo #
6
7--echo #
8--echo # A complete working example
9--echo #
10
11CREATE TABLE t1 (a INT, b VARCHAR(32));
12CREATE TABLE t2 LIKE t1;
13INSERT INTO t1 VALUES (10,'b10');
14INSERT INTO t1 VALUES (20,'b20');
15INSERT INTO t1 VALUES (30,'b30');
16DELIMITER $$;
17CREATE PROCEDURE p1 AS
18  CURSOR c IS SELECT a,b FROM t1;
19BEGIN
20  DECLARE
21    rec c%ROWTYPE;
22  BEGIN
23    OPEN c;
24    LOOP
25      FETCH c INTO rec;
26      EXIT WHEN c%NOTFOUND;
27      SELECT 'rec=(' || rec.a ||','|| rec.b||')' AS c FROM dual;
28      INSERT INTO t2 VALUES (rec.a, rec.b);
29    END LOOP;
30    CLOSE c;
31  END;
32END;
33$$
34DELIMITER ;$$
35CALL p1();
36SELECT * FROM t2;
37DROP PROCEDURE p1;
38DROP TABLE t2;
39DROP TABLE t1;
40
41
42--echo #
43--echo # cursor%ROWTYPE referring to a table in a non-existing database
44--echo #
45
46DELIMITER $$;
47CREATE PROCEDURE p1()
48AS
49  CURSOR cur IS SELECT * FROM tes2.t1;
50BEGIN
51  DECLARE
52    rec cur%ROWTYPE;
53  BEGIN
54    NULL;
55  END;
56END;
57$$
58DELIMITER ;$$
59--error ER_NO_SUCH_TABLE
60CALL p1();
61CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10));
62--error ER_NO_SUCH_TABLE
63CALL p1();
64DROP TABLE t1;
65DROP PROCEDURE p1;
66
67
68--echo #
69--echo # cursor%ROWTYPE referring to a table in the current database
70--echo #
71
72DELIMITER $$;
73CREATE PROCEDURE p1()
74AS
75  CURSOR cur IS SELECT * FROM t1;
76BEGIN
77  DECLARE
78    rec cur%ROWTYPE;
79  BEGIN
80    CREATE TABLE t2 AS SELECT rec.a, rec.b, rec.c, rec.d;
81    SHOW CREATE TABLE t2;
82    DROP TABLE t2;
83  END;
84END;
85$$
86DELIMITER ;$$
87--error ER_NO_SUCH_TABLE
88CALL p1();
89CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10));
90CALL p1();
91DROP TABLE t1;
92--error ER_NO_SUCH_TABLE
93CALL p1();
94DROP PROCEDURE p1;
95
96
97--echo #
98--echo # cursor%ROWTYPE referring to a table in an explicitly specified database
99--echo #
100
101DELIMITER $$;
102CREATE PROCEDURE p1()
103AS
104  CURSOR cur IS SELECT * FROM test.t1;
105BEGIN
106  DECLARE
107    rec cur%ROWTYPE;
108  BEGIN
109    CREATE TABLE t2 AS SELECT rec.a, rec.b, rec.c, rec.d;
110    SHOW CREATE TABLE t2;
111    DROP TABLE t2;
112  END;
113END;
114$$
115DELIMITER ;$$
116--error ER_NO_SUCH_TABLE
117CALL p1();
118CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10));
119CALL p1();
120DROP TABLE t1;
121DROP PROCEDURE p1;
122
123
124--echo #
125--echo # Cursor%ROWTYPE referring to a view in the current database
126--echo #
127
128DELIMITER $$;
129CREATE PROCEDURE p1()
130AS
131  CURSOR cur IS SELECT * FROM v1;
132BEGIN
133  DECLARE
134    rec cur%ROWTYPE;
135  BEGIN
136    CREATE TABLE t2 AS SELECT rec.a, rec.b, rec.c, rec.d;
137    SHOW CREATE TABLE t2;
138    DROP TABLE t2;
139  END;
140END;
141$$
142DELIMITER ;$$
143--error ER_NO_SUCH_TABLE
144CALL p1();
145CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10));
146CREATE VIEW v1 AS SELECT * FROM t1;
147CALL p1();
148DROP VIEW v1;
149DROP TABLE t1;
150DROP PROCEDURE p1;
151
152
153--echo #
154--echo # cursor%ROWTYPE referring to a view in an explicitly specified database
155--echo #
156
157DELIMITER $$;
158CREATE PROCEDURE p1()
159AS
160  CURSOR cur IS SELECT * FROM test.v1;
161BEGIN
162  DECLARE
163    rec cur%ROWTYPE;
164  BEGIN
165    CREATE TABLE t2 AS SELECT rec.a, rec.b, rec.c, rec.d;
166    SHOW CREATE TABLE t2;
167    DROP TABLE t2;
168  END;
169END;
170$$
171DELIMITER ;$$
172--error ER_NO_SUCH_TABLE
173CALL p1();
174CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10));
175CREATE VIEW v1 AS SELECT * FROM t1;
176CALL p1();
177DROP VIEW v1;
178DROP TABLE t1;
179DROP PROCEDURE p1;
180
181
182--echo #
183--echo # Checking that all cursor%ROWTYPE fields are NULL by default
184--echo #
185
186CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10,2));
187DELIMITER $$;
188CREATE PROCEDURE p1()
189AS
190  CURSOR cur1 IS SELECT * FROM t1;
191BEGIN
192  DECLARE
193    rec1 cur1%ROWTYPE;
194  BEGIN
195    SELECT rec1.a, rec1.b, rec1.c, rec1.d;
196  END;
197END;
198$$
199DELIMITER ;$$
200CALL p1();
201DROP TABLE t1;
202DROP PROCEDURE p1;
203
204
205--echo #
206--echo # A cursor%ROWTYPE variable with a ROW expression as a default
207--echo #
208CREATE TABLE t1 (a INT, b VARCHAR(10));
209DELIMITER $$;
210CREATE PROCEDURE p1()
211AS
212  CURSOR cur1 IS SELECT * FROM t1;
213BEGIN
214  DECLARE
215    rec1 cur1%ROWTYPE := ROW(10,'bbb');
216  BEGIN
217    SELECT rec1.a, rec1.b;
218  END;
219END;
220$$
221DELIMITER ;$$
222CALL p1();
223DROP TABLE t1;
224DROP PROCEDURE p1;
225
226
227--echo #
228--echo # A cursor%ROWTYPE variable with an incompatible ROW expression as a default
229--echo #
230CREATE TABLE t1 (a INT, b VARCHAR(10));
231DELIMITER $$;
232CREATE PROCEDURE p1()
233AS
234  CURSOR cur1 IS SELECT * FROM t1;
235BEGIN
236  DECLARE
237    rec1 cur1%ROWTYPE := ROW(10,'bbb','ccc');
238  BEGIN
239    SELECT rec1.a, rec1.b;
240  END;
241END;
242$$
243DELIMITER ;$$
244--error ER_OPERAND_COLUMNS
245CALL p1();
246DROP TABLE t1;
247DROP PROCEDURE p1;
248
249
250--echo #
251--echo # A cursor%ROWTYPE variable with a ROW variable as a default
252--echo #
253CREATE TABLE t1 (a INT, b VARCHAR(10));
254DELIMITER $$;
255CREATE PROCEDURE p1()
256AS
257  CURSOR cur IS SELECT * FROM t1;
258BEGIN
259  DECLARE
260    rec1 ROW(a INT, b VARCHAR(10)):= ROW(10,'bbb');
261    rec2 cur%ROWTYPE := rec1;
262  BEGIN
263    SELECT rec2.a, rec2.b;
264  END;
265END;
266$$
267DELIMITER ;$$
268CALL p1();
269DROP TABLE t1;
270DROP PROCEDURE p1;
271
272
273--echo #
274--echo # A ROW variable using a cursor%ROWTYPE variable as a default
275--echo #
276CREATE TABLE t1 (a INT, b VARCHAR(10));
277DELIMITER $$;
278CREATE PROCEDURE p1()
279AS
280  CURSOR cur1 IS SELECT * FROM t1;
281BEGIN
282  DECLARE
283    rec1 cur1%ROWTYPE := ROW(10,'bbb');
284    rec2 ROW(a INT, b VARCHAR(10)):= rec1;
285  BEGIN
286    SELECT rec2.a, rec2.b;
287  END;
288END;
289$$
290DELIMITER ;$$
291CALL p1();
292DROP TABLE t1;
293DROP PROCEDURE p1;
294
295
296--echo #
297--echo # Assigning cursor%ROWTYPE variables with a different column count
298--echo #
299CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE);
300CREATE TABLE t2 (a INT, b VARCHAR(10));
301DELIMITER $$;
302CREATE PROCEDURE p1()
303AS
304  CURSOR cur1 IS SELECT * FROM t1;
305  CURSOR cur2 IS SELECT * FROM t2;
306BEGIN
307  DECLARE
308    rec1 cur1%ROWTYPE;
309    rec2 cur2%ROWTYPE;
310  BEGIN
311    rec2:=rec1;
312  END;
313END;
314$$
315DELIMITER ;$$
316--error ER_OPERAND_COLUMNS
317CALL p1();
318DROP PROCEDURE p1;
319DELIMITER $$;
320CREATE PROCEDURE p1()
321AS
322  CURSOR cur1 IS SELECT * FROM t1;
323  CURSOR cur2 IS SELECT * FROM t2;
324BEGIN
325  DECLARE
326    rec1 cur1%ROWTYPE;
327    rec2 cur2%ROWTYPE;
328  BEGIN
329    rec1:=rec2;
330  END;
331END;
332$$
333DELIMITER ;$$
334--error ER_OPERAND_COLUMNS
335CALL p1();
336DROP TABLE t2;
337DROP TABLE t1;
338DROP PROCEDURE p1;
339
340
341--echo #
342--echo # Assigning compatible cursor%ROWTYPE variables (equal number of fields)
343--echo #
344CREATE TABLE t1 (a INT, b VARCHAR(10));
345CREATE TABLE t2 (x INT, y VARCHAR(10));
346DELIMITER $$;
347CREATE PROCEDURE p1()
348AS
349  CURSOR cur1 IS SELECT * FROM t1;
350  CURSOR cur2 IS SELECT * FROM t2;
351BEGIN
352  DECLARE
353    rec1 cur1%ROWTYPE;
354    rec2 cur2%ROWTYPE;
355  BEGIN
356    rec1.a:= 10;
357    rec1.b:= 'bbb';
358    rec2:=rec1;
359    SELECT rec2.x, rec2.y;
360  END;
361END;
362$$
363DELIMITER ;$$
364CALL p1();
365DROP TABLE t2;
366DROP TABLE t1;
367DROP PROCEDURE p1;
368
369
370--echo #
371--echo # Assigning between incompatible cursor%ROWTYPE and explicit ROW variables
372--echo #
373
374CREATE TABLE t1 (a INT, b VARCHAR(10));
375DELIMITER $$;
376CREATE PROCEDURE p1()
377AS
378  CURSOR cur1 IS SELECT * FROM t1;
379BEGIN
380  DECLARE
381    rec1 cur1%ROWTYPE;
382    rec2 ROW(x INT,y INT,z INT);
383  BEGIN
384    rec2.x:= 10;
385    rec2.y:= 20;
386    rec2.z:= 30;
387    rec1:= rec2;
388  END;
389END;
390$$
391DELIMITER ;$$
392--error ER_OPERAND_COLUMNS
393CALL p1();
394DROP TABLE t1;
395DROP PROCEDURE p1;
396
397
398--echo #
399--echo # Assigning between compatible cursor%ROWTYPE and explicit ROW variables
400--echo #
401
402CREATE TABLE t1 (a INT, b VARCHAR(10));
403DELIMITER $$;
404CREATE PROCEDURE p1()
405AS
406  CURSOR cur1 IS SELECT * FROM t1;
407BEGIN
408  DECLARE
409    rec1 cur1%ROWTYPE;
410    rec2 ROW(x INT,y INT);
411  BEGIN
412    rec2.x:= 10;
413    rec2.y:= 20;
414    rec1:= rec2;
415    SELECT rec1.a, rec1.b;
416    rec1.a:= 11;
417    rec1.b:= 21;
418    rec2:= rec1;
419    SELECT rec2.x, rec2.y;
420  END;
421END;
422$$
423DELIMITER ;$$
424CALL p1();
425DROP TABLE t1;
426DROP PROCEDURE p1;
427
428
429--echo #
430--echo # Assigning cursor%ROWTYPE from a ROW expression
431--echo #
432
433CREATE TABLE t1 (a INT, b VARCHAR(10));
434DELIMITER $$;
435CREATE PROCEDURE p1()
436AS
437  CURSOR cur1 IS SELECT * FROM t1;
438BEGIN
439  DECLARE
440    rec1 cur1%ROWTYPE;
441  BEGIN
442    rec1:= ROW(10,20);
443    SELECT rec1.a, rec1.b;
444  END;
445END;
446$$
447DELIMITER ;$$
448CALL p1();
449DROP TABLE t1;
450DROP PROCEDURE p1;
451
452
453--echo #
454--echo # Fetching a cursor into a cursor%ROWTYPE variable with a wrong field count
455--echo #
456
457CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10,2));
458CREATE TABLE t2 (a INT, b VARCHAR(10));
459INSERT INTO t1 VALUES (10,'bb1',111.111e2, 12.31);
460DELIMITER $$;
461CREATE PROCEDURE p1()
462AS
463  CURSOR cur1 IS SELECT * FROM t1;
464  CURSOR cur2 IS SELECT * FROM t2;
465BEGIN
466  DECLARE
467    rec2 cur2%ROWTYPE;
468  BEGIN
469    OPEN cur1;
470    FETCH cur1 INTO rec2;
471    CLOSE cur1;
472  END;
473END;
474$$
475DELIMITER ;$$
476--error ER_SP_WRONG_NO_OF_FETCH_ARGS
477CALL p1();
478DROP TABLE t2;
479DROP TABLE t1;
480DROP PROCEDURE p1;
481
482
483--echo #
484--echo # Fetching a cursor into a cursor%ROWTYPE variable
485--echo #
486
487CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10,2));
488CREATE TABLE t2 LIKE t1;
489INSERT INTO t1 VALUES (10,'bb1',111.111e2, 12.31);
490INSERT INTO t1 VALUES (20,'bb2',222.222e2, 12.32);
491INSERT INTO t1 VALUES (30,'bb3',333.333e2, 12.33);
492DELIMITER $$;
493CREATE PROCEDURE p1()
494AS
495  CURSOR cur IS SELECT * FROM t1;
496BEGIN
497  DECLARE
498    rec cur%ROWTYPE;
499  BEGIN
500    OPEN cur;
501    LOOP
502      FETCH cur INTO rec;
503      EXIT WHEN cur%NOTFOUND;
504      SELECT rec.a, rec.b, rec.c, rec.d;
505      INSERT INTO t2 VALUES (rec.a, rec.b, rec.c, rec.d);
506    END LOOP;
507    CLOSE cur;
508  END;
509END;
510$$
511DELIMITER ;$$
512CALL p1();
513SELECT * FROM t2;
514DROP TABLE t2;
515DROP TABLE t1;
516DROP PROCEDURE p1;
517
518
519--echo #
520--echo # Fetching a cursor into a cursor%ROWTYPE variable, cur%ROWTYPE declared inside the LOOP
521--echo #
522
523CREATE TABLE t1 (a INT, b VARCHAR(10), c DOUBLE, d DECIMAL(10,2));
524CREATE TABLE t2 LIKE t1;
525INSERT INTO t1 VALUES (10,'bb1',111.111e2, 12.31);
526INSERT INTO t1 VALUES (20,'bb2',222.222e2, 12.32);
527INSERT INTO t1 VALUES (30,'bb3',333.333e2, 12.33);
528DELIMITER $$;
529CREATE PROCEDURE p1()
530AS
531  CURSOR cur IS SELECT * FROM t1;
532BEGIN
533  OPEN cur;
534  LOOP
535    DECLARE
536      rec cur%ROWTYPE;
537    BEGIN
538      FETCH cur INTO rec;
539      EXIT WHEN cur%NOTFOUND;
540      SELECT rec.a, rec.b, rec.c, rec.d;
541      INSERT INTO t2 VALUES (rec.a, rec.b, rec.c, rec.d);
542    END;
543  END LOOP;
544  CLOSE cur;
545END;
546$$
547DELIMITER ;$$
548CALL p1();
549SELECT * FROM t2;
550DROP TABLE t2;
551DROP TABLE t1;
552DROP PROCEDURE p1;
553
554
555--echo #
556--echo # Fetching a cursor into a cursor%ROWTYPE variable with different column names
557--echo #
558
559CREATE TABLE t1 (a INT, b VARCHAR(10));
560CREATE TABLE t2 (x INT, y VARCHAR(10));
561INSERT INTO t1 VALUES (10,'bbb');
562DELIMITER $$;
563CREATE PROCEDURE p1()
564AS
565  CURSOR cur1 IS SELECT * FROM t1;
566  CURSOR cur2 IS SELECT * FROM t2;
567BEGIN
568  DECLARE
569    rec2 cur2%ROWTYPE;
570  BEGIN
571    OPEN cur1;
572    FETCH cur1 INTO rec2;
573    SELECT rec2.x, rec2.y;
574    CLOSE cur1;
575  END;
576END;
577$$
578DELIMITER ;$$
579CALL p1();
580DROP TABLE t2;
581DROP TABLE t1;
582DROP PROCEDURE p1;
583
584
585--echo #
586--echo # Fetching a cursor into a cursor%ROWTYPE variable, with truncation
587--echo #
588
589CREATE TABLE t1 (a INT, b VARCHAR(10));
590CREATE TABLE t2 (a INT, b INT);
591INSERT INTO t1 VALUES (10,'11x');
592DELIMITER $$;
593CREATE PROCEDURE p1()
594AS
595  CURSOR cur1 IS SELECT * FROM t1;
596  CURSOR cur2 IS SELECT * FROM t2;
597BEGIN
598  DECLARE
599    rec2 cur2%ROWTYPE;
600  BEGIN
601    OPEN cur1;
602    FETCH cur1 INTO rec2;
603    SELECT rec2.a, rec2.b;
604    CLOSE cur1;
605  END;
606END;
607$$
608DELIMITER ;$$
609CALL p1();
610DROP TABLE t2;
611DROP TABLE t1;
612DROP PROCEDURE p1;
613
614
615--echo #
616--echo # cursor%ROWTYPE variables are not allowed in LIMIT
617--echo #
618CREATE TABLE t1 (a INT, b INT);
619INSERT INTO t1 VALUES (1,2);
620DELIMITER $$;
621--error ER_WRONG_SPVAR_TYPE_IN_LIMIT
622CREATE PROCEDURE p1()
623AS
624  CURSOR cur1 IS SELECT * FROM t1;
625BEGIN
626  DECLARE
627    rec1 cur1%ROWTYPE:=(1,2);
628  BEGIN
629    SELECT * FROM t1 LIMIT rec1.a;
630  END;
631END;
632$$
633DELIMITER ;$$
634DROP TABLE t1;
635
636
637--echo #
638--echo # cursor%ROWTYPE variable fields as OUT parameters
639--echo #
640
641CREATE TABLE t1 (a INT, b VARCHAR(10));
642DELIMITER $$;
643CREATE PROCEDURE p1(a OUT INT,b OUT VARCHAR(10))
644AS
645BEGIN
646  a:=10;
647  b:='bb';
648END;
649$$
650CREATE PROCEDURE p2()
651AS
652  CURSOR cur1 IS SELECT * FROM t1;
653BEGIN
654  DECLARE
655    rec1 cur1%ROWTYPE;
656  BEGIN
657    CALL p1(rec1.a, rec1.b);
658    SELECT rec1.a, rec1.b;
659  END;
660END;
661$$
662DELIMITER ;$$
663CALL p2();
664DROP PROCEDURE p2;
665DROP PROCEDURE p1;
666DROP TABLE t1;
667
668
669--echo #
670--echo # Passing the entire cursor%ROWTYPE variable
671--echo #
672
673CREATE TABLE t1 (a INT, b VARCHAR(10));
674DELIMITER $$;
675CREATE PROCEDURE p1(a ROW(a INT, b VARCHAR(10)))
676AS
677BEGIN
678  SELECT a.a, a.b;
679END;
680$$
681CREATE PROCEDURE p2()
682AS
683  CURSOR cur IS SELECT * FROM t1;
684BEGIN
685  DECLARE
686    rec1 cur%ROWTYPE:= ROW(10,'bb');
687  BEGIN
688    CALL p1(rec1);
689  END;
690END;
691$$
692DELIMITER ;$$
693CALL p2();
694DROP PROCEDURE p2;
695DROP PROCEDURE p1;
696DROP TABLE t1;
697
698
699--echo #
700--echo # Passing the entire cursor%ROWTYPE variable as an OUT parameter
701--echo #
702
703CREATE TABLE t1 (a INT, b VARCHAR(10));
704DELIMITER $$;
705CREATE PROCEDURE p1(a OUT ROW(a INT, b VARCHAR(10)))
706AS
707BEGIN
708  a:= ROW(10,'bb');
709END;
710$$
711CREATE PROCEDURE p2()
712AS
713  CURSOR cur IS SELECT * FROM t1;
714BEGIN
715  DECLARE
716    rec1 cur%ROWTYPE;
717  BEGIN
718    CALL p1(rec1);
719    SELECT rec1.a, rec1.b;
720  END;
721END;
722$$
723DELIMITER ;$$
724CALL p2();
725DROP PROCEDURE p2;
726DROP PROCEDURE p1;
727DROP TABLE t1;
728
729
730--echo #
731--echo # Assigning a cursor%ROWTYPE field to an OUT parameter
732--echo #
733
734DELIMITER $$;
735CREATE PROCEDURE p1 (res IN OUT INTEGER)
736AS
737  a INT:=10;
738  CURSOR cur1 IS SELECT a FROM DUAL;
739BEGIN
740  DECLARE
741    rec1 cur1%ROWTYPE;
742  BEGIN
743    OPEN cur1;
744    FETCH cur1 INTO rec1;
745    CLOSE cur1;
746    res:=rec1.a;
747  END;
748END;
749$$
750DELIMITER ;$$
751CALL p1(@res);
752SELECT @res;
753SET @res=NULL;
754DROP PROCEDURE p1;
755
756
757--echo #
758--echo # Testing Item_splocal_row_field_by_name::print
759--echo #
760
761CREATE TABLE t1 (a INT, b VARCHAR(10));
762DELIMITER $$;
763CREATE PROCEDURE p1
764AS
765  CURSOR cur1 IS SELECT * FROM t1;
766BEGIN
767  DECLARE
768    rec cur1%ROWTYPE:=ROW(10,'bb');
769  BEGIN
770    EXPLAIN EXTENDED SELECT rec.a, rec.b;
771  END;
772END;
773$$
774DELIMITER ;$$
775CALL p1();
776DROP PROCEDURE p1;
777DROP TABLE t1;
778
779
780--echo #
781--echo # Run time error in the cursor statement
782--echo #
783
784DELIMITER $$;
785CREATE PROCEDURE p1
786AS
787  CURSOR cur1 IS SELECT
788    10 AS a,
789    CONCAT(_latin1'a' COLLATE latin1_bin,
790           _latin1'a' COLLATE latin1_swedish_ci) AS b;
791BEGIN
792  DECLARE
793    rec1 cur1%ROWTYPE;
794  BEGIN
795    OPEN cur1;
796    FETCH cur1 INTO rec1;
797    CLOSE cur1;
798  SELECT a,b;
799  END;
800END;
801$$
802DELIMITER ;$$
803--error ER_CANT_AGGREGATE_2COLLATIONS
804CALL p1();
805DROP PROCEDURE p1;
806
807
808
809--echo #
810--echo # Non-existing field
811--echo #
812
813CREATE TABLE t1 (a INT, b VARCHAR(10));
814DELIMITER $$;
815CREATE PROCEDURE p1
816AS
817  CURSOR cur1 IS SELECT * FROM t1;
818BEGIN
819  DECLARE
820    rec cur1%ROWTYPE;
821  BEGIN
822    SELECT rec.c;
823  END;
824END;
825$$
826DELIMITER ;$$
827--error ER_ROW_VARIABLE_DOES_NOT_HAVE_FIELD
828CALL p1();
829ALTER TABLE t1 ADD c INT;
830#
831# The below ALTER is needed as a workaround to call sp_cache_invalidate()
832# Please remove it after fixing MDEV-12166
833#
834ALTER PROCEDURE p1 COMMENT 'test';
835CALL p1();
836DROP PROCEDURE p1;
837DROP TABLE t1;
838
839
840--echo #
841--echo # Testing that field names are case insensitive
842--echo #
843
844CREATE TABLE t1 (a INT, b VARCHAR(10));
845DELIMITER $$;
846CREATE PROCEDURE p1
847AS
848  CURSOR cur IS SELECT * FROM t1;
849BEGIN
850  DECLARE
851    rec cur%ROWTYPE:=ROW(10,'bb');
852  BEGIN
853    SELECT rec.A, rec.B;
854  END;
855END;
856$$
857DELIMITER ;$$
858CALL p1();
859DROP PROCEDURE p1;
860DROP TABLE t1;
861
862
863--echo #
864--echo # Testing that cursor%ROWTYPE uses temporary tables vs shadowed real tables
865--echo #
866
867CREATE TABLE t1 (a INT, b VARCHAR(10));
868CREATE TEMPORARY TABLE t1 (x INT, y VARCHAR(10));
869DELIMITER $$;
870CREATE PROCEDURE p1
871AS
872  CURSOR cur IS SELECT * FROM t1;
873BEGIN
874  DECLARE
875    rec cur%ROWTYPE:=ROW(10,'bb');
876  BEGIN
877    SELECT rec.A, rec.B;
878  END;
879END;
880$$
881DELIMITER ;$$
882--error ER_ROW_VARIABLE_DOES_NOT_HAVE_FIELD
883CALL p1();
884DROP TEMPORARY TABLE t1;
885#
886# The below ALTER is needed as a workaround to call sp_cache_invalidate()
887# Please remove it after fixing MDEV-12166
888#
889ALTER PROCEDURE p1 COMMENT 'test';
890CALL p1();
891DROP PROCEDURE p1;
892DROP TABLE t1;
893
894
895--echo #
896--echo # Testing that the structure of cursor%ROWTYPE variables is determined at the CURSOR instantiation time
897--echo #
898
899CREATE TABLE t1 (a INT, b VARCHAR(32));
900INSERT INTO t1 VALUES (10,'b10');
901DELIMITER $$;
902CREATE PROCEDURE p1 AS
903  CURSOR cur IS SELECT * FROM t1;
904BEGIN
905  DROP TABLE t1;
906  CREATE TABLE t1 (a INT, b VARCHAR(32), c INT);
907  DECLARE
908    rec cur%ROWTYPE; -- This has a column "c"
909  BEGIN
910    rec.c:=10;
911  END;
912END;
913$$
914DELIMITER ;$$
915CALL p1();
916DROP TABLE t1;
917DROP PROCEDURE p1;
918
919
920CREATE TABLE t1 (a INT, b VARCHAR(32));
921INSERT INTO t1 VALUES (10,'b10');
922DELIMITER $$;
923CREATE PROCEDURE p1 AS
924  CURSOR cur IS SELECT * FROM t1;
925BEGIN
926  DECLARE
927    rec cur%ROWTYPE; -- This does not have a column "c"
928  BEGIN
929    DROP TABLE t1;
930    CREATE TABLE t1 (a INT, b VARCHAR(32), c INT);
931    rec.c:=10;
932  END;
933END;
934$$
935DELIMITER ;$$
936--error ER_ROW_VARIABLE_DOES_NOT_HAVE_FIELD
937CALL p1();
938DROP TABLE t1;
939DROP PROCEDURE p1;
940
941
942--echo #
943--echo # Duplicate field nams in a cursor referenced by %ROWTYPE
944--echo #
945
946CREATE TABLE t1 (a INT);
947CREATE TABLE t2 (a INT);
948DELIMITER $$;
949CREATE PROCEDURE p1 AS
950  CURSOR cur IS SELECT * FROM t1, t2;
951BEGIN
952  DECLARE
953    rec cur%ROWTYPE;
954  BEGIN
955    SELECT rec.a;
956    rec.a:=10;
957  END;
958END;
959$$
960DELIMITER ;$$
961--error ER_DUP_FIELDNAME
962CALL p1();
963DROP PROCEDURE p1;
964DROP TABLE t2;
965DROP TABLE t1;
966
967
968--echo #
969--echo # Tricky field names a cursor referenced by %ROWTYPE
970--echo #
971
972SET NAMES utf8;
973CREATE TABLE t1 (a VARCHAR(10));
974INSERT INTO t1 VALUES ('a');
975DELIMITER $$;
976CREATE PROCEDURE p1 AS
977  CURSOR cur IS SELECT a, CONCAT(a,'a'), CONCAT(a,'ö') FROM t1;
978BEGIN
979  DECLARE
980    rec cur%ROWTYPE;
981  BEGIN
982    OPEN cur;
983    FETCH cur INTO rec;
984    CLOSE cur;
985    SELECT rec.a, rec."CONCAT(a,'a')", rec."CONCAT(a,'ö')";
986  END;
987END;
988$$
989DELIMITER ;$$
990CALL p1();
991DROP PROCEDURE p1;
992DROP TABLE t1;
993SET NAMES latin1;
994
995
996--echo #
997--echo # Using definitions recursively (cursor%ROWTYPE variables in another cursor SELECT)
998--echo #
999CREATE TABLE t1 (a INT, b VARCHAR(10));
1000INSERT INTO t1 VALUES (10,'b1'),(20,'b2'),(30,'b3');
1001DELIMITER $$;
1002CREATE PROCEDURE p1 AS
1003  CURSOR cur1 IS SELECT a,b FROM t1;
1004BEGIN
1005  DECLARE
1006    rec1 cur1%ROWTYPE:=ROW(0,'b0');
1007    CURSOR cur2 IS SELECT rec1.a AS a, rec1.b AS b FROM t1;
1008  BEGIN
1009    DECLARE
1010      rec2 cur2%ROWTYPE;
1011    BEGIN
1012      OPEN cur2;
1013      LOOP
1014        FETCH cur2 INTO rec2;
1015        EXIT WHEN cur2%NOTFOUND;
1016        SELECT rec2.a, rec2.b;
1017      END LOOP;
1018      CLOSE cur2;
1019    END;
1020  END;
1021END;
1022$$
1023DELIMITER ;$$
1024CALL p1();
1025DROP PROCEDURE p1;
1026DROP TABLE t1;
1027
1028
1029--echo #
1030--echo # Testing queries with auto-generated Items.
1031--echo # An instance of Item_func_conv_charset is created during the below SELECT query.
1032--echo # We check here that during an implicit cursor OPEN
1033--echo # done in sp_instr_cursor_copy_struct::exec_core()
1034--echo # all temporary Items are created on a proper memory root and are safely destroyed.
1035--echo #
1036
1037CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1, b VARCHAR(10) CHARACTER SET utf8);
1038INSERT INTO t1 VALUES (0xFF, 'a');
1039DELIMITER $$;
1040CREATE PROCEDURE p1
1041AS
1042  CURSOR cur1 IS SELECT CONCAT(a,b) AS c FROM t1;
1043BEGIN
1044  DECLARE
1045    rec1 cur1%ROWTYPE;
1046  BEGIN
1047    OPEN cur1;
1048    FETCH cur1 INTO rec1;
1049    CLOSE cur1;
1050    SELECT HEX(rec1.c);
1051  END;
1052END;
1053$$
1054DELIMITER ;$$
1055CALL p1();
1056DROP PROCEDURE p1;
1057DROP TABLE t1;
1058
1059
1060--echo #
1061--echo # MDEV-10581 sql_mode=ORACLE: Explicit cursor FOR LOOP
1062--echo #
1063
1064--echo # IN followed by a non-identifier
1065
1066DELIMITER $$;
1067--error ER_PARSE_ERROR
1068CREATE PROCEDURE p1 AS
1069  CURSOR c1 IS SELECT 'test' AS a FROM DUAL;
1070BEGIN
1071  FOR rec IN 10
1072  LOOP
1073    NULL;
1074  END LOOP;
1075END;
1076$$
1077DELIMITER ;$$
1078
1079
1080--echo # IN followed by a quoted identifier: table.column
1081
1082DELIMITER $$;
1083--error ER_PARSE_ERROR
1084CREATE PROCEDURE p1 AS
1085  CURSOR c1 IS SELECT 'test' AS a FROM DUAL;
1086BEGIN
1087  FOR rec IN c1.c2
1088  LOOP
1089    NULL;
1090  END LOOP;
1091END;
1092$$
1093DELIMITER ;$$
1094
1095
1096--echo # IN followed by a quoted identifier: .table.column
1097
1098DELIMITER $$;
1099--error ER_PARSE_ERROR
1100CREATE PROCEDURE p1 AS
1101  CURSOR c1 IS SELECT 'test' AS a FROM DUAL;
1102BEGIN
1103  FOR rec IN .c1.c2
1104  LOOP
1105    NULL;
1106  END LOOP;
1107END;
1108$$
1109DELIMITER ;$$
1110
1111
1112--echo # IN followed by a quoted identifier: schema.table.column
1113
1114DELIMITER $$;
1115--error ER_PARSE_ERROR
1116CREATE PROCEDURE p1 AS
1117  CURSOR c1 IS SELECT 'test' AS a FROM DUAL;
1118BEGIN
1119  FOR rec IN c1.c2.c3
1120  LOOP
1121    NULL;
1122  END LOOP;
1123END;
1124$$
1125DELIMITER ;$$
1126
1127
1128--echo # IN followed by an unknown cursor name
1129
1130DELIMITER $$;
1131--error ER_SP_CURSOR_MISMATCH
1132CREATE PROCEDURE p1 AS
1133  CURSOR c1 IS SELECT 'test' AS a FROM DUAL;
1134BEGIN
1135  FOR rec IN c2
1136  LOOP
1137    NULL;
1138  END LOOP;
1139END;
1140$$
1141DELIMITER ;$$
1142
1143
1144--echo # Make sure "rec" shadows other declarations outside the loop
1145
1146CREATE TABLE t1 (a INT, b VARCHAR(10));
1147INSERT INTO t1 VALUES (10, 'b0');
1148DELIMITER $$;
1149CREATE PROCEDURE p1 AS
1150  rec INT:=10;
1151  CURSOR c1 IS SELECT a,b FROM t1;
1152BEGIN
1153  FOR rec IN c1
1154  LOOP
1155    SELECT rec.a;
1156  END LOOP;
1157  SELECT rec;
1158END;
1159$$
1160DELIMITER ;$$
1161CALL p1;
1162DROP PROCEDURE p1;
1163DROP TABLE t1;
1164
1165
1166--echo # Make sure "rec" is not visible after END LOOP
1167
1168DELIMITER $$;
1169--error ER_UNKNOWN_STRUCTURED_VARIABLE
1170CREATE PROCEDURE p1 AS
1171  CURSOR c1 IS SELECT 'test' AS a FROM DUAL;
1172BEGIN
1173  FOR rec IN c1
1174  LOOP
1175    NULL;
1176  END LOOP;
1177  rec.a:= 10;
1178END;
1179$$
1180DELIMITER ;$$
1181
1182
1183--echo # Make sure that duplicate column names are not allowed
1184
1185DELIMITER $$;
1186CREATE PROCEDURE p1 AS
1187  CURSOR cur IS SELECT 'a' AS a, 'A' as a;
1188BEGIN
1189  FOR rec IN cur
1190  LOOP
1191    NULL;
1192  END LOOP;
1193END;
1194$$
1195DELIMITER ;$$
1196--error ER_DUP_FIELDNAME
1197CALL p1;
1198DROP PROCEDURE p1;
1199
1200
1201--echo # A complete working example
1202
1203CREATE TABLE t1 (a INT, b VARCHAR(10));
1204INSERT INTO t1 VALUES (10,'b0');
1205INSERT INTO t1 VALUES (11,'b1');
1206INSERT INTO t1 VALUES (12,'b2');
1207CREATE TABLE t2 LIKE t1;
1208CREATE TABLE t3 LIKE t1;
1209DELIMITER $$;
1210CREATE PROCEDURE p1 AS
1211  CURSOR cur IS SELECT a, b FROM t1;
1212BEGIN
1213  FOR rec IN cur
1214  LOOP
1215    SELECT rec.a, rec.b;
1216    INSERT INTO t2 VALUES (rec.a, rec.b);
1217    rec.a:= rec.a + 1000;
1218    rec.b:= 'b' || rec.b;
1219    INSERT INTO t3 VALUES (rec.a, rec.b);
1220  END LOOP;
1221END;
1222$$
1223DELIMITER ;$$
1224CALL p1();
1225SELECT * FROM t2;
1226SELECT * FROM t3;
1227DROP PROCEDURE p1;
1228DROP TABLE t3;
1229DROP TABLE t2;
1230DROP TABLE t1;
1231
1232
1233--echo #
1234--echo # MDEV-12314 Implicit cursor FOR LOOP for cursors with parameters
1235--echo #
1236
1237CREATE TABLE t1 (a INT, b VARCHAR(32));
1238INSERT INTO t1 VALUES (10,'b0');
1239INSERT INTO t1 VALUES (11,'b1');
1240INSERT INTO t1 VALUES (12,'b2');
1241DELIMITER $$;
1242CREATE PROCEDURE p1(pa INT, pb VARCHAR(32)) AS
1243  CURSOR cur(va INT, vb VARCHAR(32)) IS
1244    SELECT a, b FROM t1 WHERE a=va AND b=vb;
1245BEGIN
1246  FOR rec IN cur(pa,pb)
1247  LOOP
1248    SELECT rec.a, rec.b;
1249  END LOOP;
1250END;
1251$$
1252DELIMITER ;$$
1253CALL p1(10,'B0');
1254CALL p1(11,'B1');
1255CALL p1(12,'B2');
1256CALL p1(12,'non-existing');
1257DROP TABLE t1;
1258DROP PROCEDURE p1;
1259
1260
1261--echo #
1262--echo # MDEV-12098 sql_mode=ORACLE: Implicit cursor FOR loop
1263--echo #
1264
1265--echo # Parse error in the cursor SELECT statement
1266DELIMITER $$;
1267--error ER_PARSE_ERROR
1268CREATE PROCEDURE p1 AS
1269BEGIN
1270  FOR rec IN (SELECT a, b FROM)
1271  LOOP
1272    SELECT rec.a, rec.b;
1273  END LOOP;
1274END;
1275$$
1276DELIMITER ;$$
1277
1278
1279--echo # Make sure "rec" is not visible after END LOOP
1280
1281DELIMITER $$;
1282--error ER_UNKNOWN_STRUCTURED_VARIABLE
1283CREATE PROCEDURE p1 AS
1284BEGIN
1285  FOR rec IN (SELECT 'test' AS a)
1286  LOOP
1287    NULL;
1288  END LOOP;
1289  rec.a:= 10;
1290END;
1291$$
1292DELIMITER ;$$
1293
1294--echo # Make sure "rec" is not visible inside the SELECT statement
1295
1296DELIMITER $$;
1297CREATE PROCEDURE p1 AS
1298BEGIN
1299  FOR rec IN (SELECT rec)
1300  LOOP
1301    NULL;
1302  END LOOP;
1303END;
1304$$
1305DELIMITER ;$$
1306--error ER_BAD_FIELD_ERROR
1307CALL p1;
1308DROP PROCEDURE p1;
1309
1310DELIMITER $$;
1311CREATE PROCEDURE p1 AS
1312BEGIN
1313  FOR rec IN (SELECT rec.a)
1314  LOOP
1315    NULL;
1316  END LOOP;
1317END;
1318$$
1319DELIMITER ;$$
1320--error ER_UNKNOWN_TABLE
1321CALL p1;
1322DROP PROCEDURE p1;
1323
1324--echo # Totally confusing name mixture
1325
1326CREATE TABLE rec (rec INT);
1327INSERT INTO rec VALUES (10);
1328DELIMITER $$;
1329CREATE PROCEDURE p1 AS
1330BEGIN
1331  FOR rec IN (SELECT rec FROM rec)
1332  LOOP
1333    SELECT rec.rec;
1334  END LOOP;
1335END;
1336$$
1337DELIMITER ;$$
1338CALL p1;
1339DROP PROCEDURE p1;
1340DROP TABLE rec;
1341
1342
1343--echo # Make sure that duplicate column names are not allowed
1344
1345DELIMITER $$;
1346CREATE PROCEDURE p1 AS
1347BEGIN
1348  FOR rec IN (SELECT 'a' AS a, 'A' as a)
1349  LOOP
1350    NULL;
1351  END LOOP;
1352END;
1353$$
1354DELIMITER ;$$
1355--error ER_DUP_FIELDNAME
1356CALL p1;
1357DROP PROCEDURE p1;
1358
1359
1360--echo # A complete working example
1361
1362CREATE TABLE t1 (a INT, b VARCHAR(10));
1363INSERT INTO t1 VALUES (10,'b0');
1364INSERT INTO t1 VALUES (11,'b1');
1365INSERT INTO t1 VALUES (12,'b2');
1366CREATE TABLE t2 LIKE t1;
1367CREATE TABLE t3 LIKE t1;
1368DELIMITER $$;
1369CREATE PROCEDURE p1 AS
1370BEGIN
1371  FOR rec IN (SELECT a, b FROM t1)
1372  LOOP
1373    SELECT rec.a, rec.b;
1374    INSERT INTO t2 VALUES (rec.a, rec.b);
1375    rec.a:= rec.a + 1000;
1376    rec.b:= 'b'|| rec.b;
1377    INSERT INTO t3 VALUES (rec.a, rec.b);
1378  END LOOP;
1379END;
1380$$
1381DELIMITER ;$$
1382CALL p1();
1383SELECT * FROM t2;
1384SELECT * FROM t3;
1385DROP PROCEDURE p1;
1386DROP TABLE t3;
1387DROP TABLE t2;
1388DROP TABLE t1;
1389
1390
1391--echo # A combination of explicit and implicit cursors
1392
1393CREATE TABLE t1 (a INT, b VARCHAR(10));
1394INSERT INTO t1 VALUES (10,'b1');
1395INSERT INTO t1 VALUES (11,'b2');
1396INSERT INTO t1 VALUES (12,'b3');
1397DELIMITER $$;
1398CREATE PROCEDURE p1 AS
1399BEGIN
1400  FOR rec1 IN (SELECT a, b FROM t1)
1401  LOOP
1402    DECLARE
1403      CURSOR cur2 IS SELECT a+1000 AS a, 'bb'||b AS b FROM t1 WHERE a=rec1.a AND b=rec1.b;
1404    BEGIN
1405      SELECT rec1.a, rec1.b;
1406      FOR rec2 IN cur2
1407      LOOP
1408        SELECT rec2.a, rec2.b;
1409      END LOOP;
1410    END;
1411  END LOOP;
1412  FOR rec1 IN (SELECT a,b FROM t1)
1413  LOOP
1414    FOR rec2 IN (SELECT a+2000 AS a,'bbb'||b AS b FROM t1 WHERE a=rec1.a AND b=rec1.b)
1415    LOOP
1416      SELECT rec2.a, rec2.b;
1417    END LOOP;
1418  END LOOP;
1419END;
1420$$
1421DELIMITER ;$$
1422CALL p1();
1423DROP PROCEDURE p1;
1424DROP TABLE t1;
1425
1426
1427--echo #
1428--echo # MDEV-15941 Explicit cursor FOR loop does not close the cursor
1429--echo #
1430
1431DELIMITER $$;
1432--error ER_SP_CURSOR_NOT_OPEN
1433DECLARE
1434  CURSOR cur IS SELECT 1 AS a FROM DUAL;
1435  v INT;
1436BEGIN
1437  FOR rec IN cur
1438  LOOP
1439    NULL;
1440  END LOOP;
1441  FETCH cur INTO v;
1442END;
1443$$
1444DELIMITER ;$$
1445
1446
1447DELIMITER $$;
1448--error ER_SP_CURSOR_NOT_OPEN
1449DECLARE
1450  CURSOR cur IS SELECT 1 AS a FROM DUAL;
1451  v INT;
1452BEGIN
1453<<label>>
1454  FOR rec IN cur
1455  LOOP
1456    NULL;
1457  END LOOP label;
1458  FETCH cur INTO v;
1459END;
1460$$
1461DELIMITER ;$$
1462
1463
1464DELIMITER $$;
1465--error ER_SP_CURSOR_ALREADY_OPEN
1466DECLARE
1467  CURSOR cur IS SELECT 1 AS a FROM DUAL;
1468BEGIN
1469  OPEN cur;
1470  FOR rec IN cur
1471  LOOP
1472    NULL;
1473  END LOOP;
1474END;
1475$$
1476DELIMITER ;$$
1477
1478
1479DELIMITER $$;
1480DECLARE
1481  CURSOR cur IS SELECT 1 AS a FROM DUAL;
1482BEGIN
1483  FOR rec IN cur
1484  LOOP
1485    SELECT rec.a;
1486  END LOOP;
1487  SELECT cur%ISOPEN;
1488  FOR rec IN cur
1489  LOOP
1490    SELECT rec.a;
1491  END LOOP;
1492  SELECT cur%ISOPEN;
1493END;
1494$$
1495DELIMITER ;$$
1496
1497
1498DELIMITER $$;
1499DECLARE
1500  CURSOR cur IS SELECT 1 AS a FROM DUAL;
1501BEGIN
1502<<label1>>
1503  FOR rec IN cur
1504  LOOP
1505    SELECT rec.a;
1506  END LOOP label1;
1507  SELECT cur%ISOPEN;
1508<<label2>>
1509  FOR rec IN cur
1510  LOOP
1511    SELECT rec.a;
1512  END LOOP;
1513  SELECT cur%ISOPEN;
1514END;
1515$$
1516DELIMITER ;$$
1517
1518
1519--echo #
1520--echo # MDEV-14139 Anchored data types for variables
1521--echo #
1522
1523DELIMITER $$;
1524DECLARE
1525  CURSOR c1 IS SELECT 10 AS a, 'bbb' AS b, TIME'10:20:30' AS c;
1526  row1 c1%ROWTYPE;
1527  a_row1 row1%TYPE;
1528  aa_row1 a_row1%TYPE;
1529BEGIN
1530  CREATE TABLE t2 AS SELECT a_row1.a AS a, a_row1.b AS b, a_row1.c AS c;
1531  SHOW CREATE TABLE t2;
1532  DROP TABLE t2;
1533  CREATE TABLE t2 AS SELECT aa_row1.a AS a, aa_row1.b AS b, aa_row1.c AS c;
1534  SHOW CREATE TABLE t2;
1535  DROP TABLE t2;
1536END;
1537$$
1538DELIMITER ;$$
1539
1540--echo #
1541--echo # MDEV-14388 Server crashes in handle_select / val_uint in ORACLE mode
1542--echo #
1543
1544CREATE TABLE t1 (id INT);
1545INSERT INTO t1 VALUES (0),(1),(2),(3);
1546DELIMITER $$;
1547CREATE FUNCTION f1() RETURN INT is
1548BEGIN
1549  FOR v1 in (SELECT id FROM t1)
1550  LOOP
1551    NULL;
1552  END LOOP;
1553  RETURN 1;
1554END;
1555$$
1556DELIMITER ;$$
1557SELECT f1();
1558DROP FUNCTION f1;
1559DROP TABLE t1;
1560
1561CREATE TABLE t1 (id INT);
1562INSERT INTO t1 VALUES (1),(2),(3),(4);
1563DELIMITER $$;
1564CREATE FUNCTION f1() RETURN INT IS
1565  CURSOR cur IS SELECT id FROM t1;
1566  rec cur%ROWTYPE;
1567BEGIN
1568  RETURN 1;
1569END;
1570$$
1571DELIMITER ;$$
1572SELECT f1();
1573DROP FUNCTION f1;
1574DROP TABLE t1;
1575
1576
1577--echo #
1578--echo # MDEV-17278 CURSOR FOR LOOP - ERROR: unexpected end of stream, read 0 bytes (SERVER CRASH)
1579--echo #
1580
1581CREATE TABLE t1 (id2 int, id int, en1 enum('aaa','a','b','c'));
1582INSERT INTO t1 VALUES(1,1,'aaa'),(2,2,'a'),(3,3,'b'),(4,4,'c');
1583
1584DELIMITER $$;
1585CREATE PROCEDURE p1()
1586AS
1587BEGIN
1588  FOR rec IN (SELECT en1 FROM t1)
1589  LOOP
1590    SELECT rec.en1;
1591  END LOOP;
1592END;
1593$$
1594DELIMITER ;$$
1595CALL p1();
1596DROP PROCEDURE p1;
1597DROP TABLE t1;
1598