1
2--echo #
3--echo # MDEV-12457 Cursors with parameters
4--echo #
5
6CREATE TABLE t1 (a INT, b VARCHAR(10)) ENGINE=MyISAM;
7INSERT INTO t1 VALUES (1,'old'),(2,'old'),(3,'old'),(4,'old'),(5,'old');
8DELIMITER $$;
9CREATE PROCEDURE p1(min INT,max INT)
10BEGIN
11  DECLARE done INT DEFAULT FALSE;
12  DECLARE va INT;
13  DECLARE cur CURSOR(pmin INT, pmax INT) FOR SELECT a FROM t1 WHERE a BETWEEN pmin AND pmax;
14  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
15  OPEN cur(min,max);
16  read_loop: LOOP
17    FETCH cur INTO va;
18    IF done THEN
19      LEAVE read_loop;
20    END IF;
21    INSERT INTO t1 VALUES (va,'new');
22  END LOOP;
23  CLOSE cur;
24END;
25$$
26DELIMITER ;$$
27CALL p1(2,4);
28SELECT * FROM t1 ORDER BY b DESC,a;
29DROP PROCEDURE p1;
30DROP TABLE t1;
31
32
33--echo #
34--echo # OPEN with a wrong number of parameters
35--echo #
36
37CREATE TABLE t1 (a INT, b VARCHAR(10));
38DELIMITER $$;
39--error ER_WRONG_PARAMCOUNT_TO_CURSOR
40CREATE PROCEDURE p1(a_a INT,a_b VARCHAR(32))
41BEGIN
42  DECLARE v_a INT;
43  DECLARE v_b VARCHAR(10);
44  DECLARE c CURSOR (p_a INT, p_b VARCHAR(32)) FOR SELECT * FROM t1 WHERE a=p_a;
45  OPEN c(a_a);
46  CLOSE c;
47END;
48$$
49DELIMITER ;$$
50DROP TABLE t1;
51
52
53--echo #
54--echo # Cursor parameters are not visible outside of the cursor
55--echo #
56
57DELIMITER $$;
58--error ER_UNKNOWN_SYSTEM_VARIABLE
59CREATE PROCEDURE p1(a_a INT)
60BEGIN
61  DECLARE v_a INT;
62  DECLARE c CURSOR (p_a INT) FOR SELECT a FROM t1 WHERE a=p_a;
63  OPEN c(a_a);
64  SET p_a=10;
65END;
66$$
67DELIMITER ;$$
68
69DELIMITER $$;
70--error ER_UNKNOWN_SYSTEM_VARIABLE
71CREATE PROCEDURE p1(a_a INT)
72BEGIN
73  DECLARE v_a INT;
74  DECLARE c CURSOR (p_a INT) FOR SELECT a FROM t1 WHERE a=p_a;
75  SET p_a= 10;
76  OPEN c(a_a);
77END;
78$$
79DELIMITER ;$$
80
81
82--echo #
83--echo # Cursor parameter shadowing a local variable
84--echo #
85
86CREATE TABLE t1 (a INT);
87INSERT INTO t1 VALUES (1);
88DELIMITER $$;
89CREATE PROCEDURE p1(a INT)
90BEGIN
91  DECLARE done INT DEFAULT 0;
92  DECLARE v_a INT DEFAULT NULL;
93  DECLARE p_a INT DEFAULT NULL;
94  DECLARE c CURSOR (p_a VARCHAR(32)) FOR SELECT p_a FROM t1;
95  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
96  OPEN c(a);
97  read_loop: LOOP
98    FETCH c INTO v_a;
99    IF done THEN
100      LEAVE read_loop;
101    END IF;
102    SELECT v_a;
103  END LOOP;
104  CLOSE c;
105END;
106$$
107DELIMITER ;$$
108CALL p1(1);
109CALL p1(NULL);
110DROP PROCEDURE p1;
111DROP TABLE t1;
112
113
114--echo #
115--echo # Parameters in SELECT list
116--echo #
117
118DELIMITER $$;
119CREATE PROCEDURE p1(a_a INT, a_b VARCHAR(32))
120BEGIN
121  DECLARE v_a INT;
122  DECLARE v_b VARCHAR(10);
123  DECLARE c CURSOR (p_a INT, p_b VARCHAR(32)) FOR SELECT p_a,p_b FROM DUAL;
124  OPEN c(a_a + 0,a_b);
125  FETCH c INTO v_a, v_b;
126  SELECT v_a, v_b;
127  CLOSE c;
128  OPEN c(a_a + 1,a_b);
129  FETCH c INTO v_a, v_b;
130  SELECT v_a, v_b;
131  CLOSE c;
132END;
133$$
134DELIMITER ;$$
135CALL p1(1,'b1');
136DROP PROCEDURE p1;
137
138
139--echo #
140--echo # Parameters in SELECT list + UNION
141--echo #
142
143DELIMITER $$;
144CREATE PROCEDURE p1(a_a INT, a_b VARCHAR(32))
145BEGIN
146  DECLARE v_a INT;
147  DECLARE v_b VARCHAR(10);
148  DECLARE c CURSOR(p_a INT, p_b VARCHAR(32)) FOR
149    SELECT p_a,p_b FROM DUAL
150    UNION ALL
151    SELECT p_a+1,CONCAT(p_b,'b') FROM DUAL;
152  OPEN c(a_a,a_b);
153  FETCH c INTO v_a, v_b;
154  SELECT v_a, v_b;
155  FETCH c INTO v_a, v_b;
156  SELECT v_a, v_b;
157  CLOSE c;
158END;
159$$
160DELIMITER ;$$
161CALL p1(1,'b1');
162DROP PROCEDURE p1;
163
164
165--echo #
166--echo # Parameters in SELECT list + type conversion + warnings
167--echo #
168
169SET sql_mode='';
170DELIMITER $$;
171CREATE PROCEDURE p1(a_a VARCHAR(32))
172BEGIN
173  DECLARE v_a INT;
174  DECLARE c CURSOR (p_a INT) FOR SELECT p_a FROM DUAL;
175  OPEN c(a_a);
176  FETCH c INTO v_a;
177  SELECT v_a;
178  CLOSE c;
179END;
180$$
181DELIMITER ;$$
182CALL p1('1b');
183CALL p1('b1');
184DROP PROCEDURE p1;
185SET sql_mode=DEFAULT;
186
187
188--echo #
189--echo # One parameter in SELECT list + subselect
190--echo #
191
192DELIMITER $$;
193CREATE PROCEDURE p1(a_a VARCHAR(32))
194BEGIN
195  DECLARE v_a VARCHAR(10);
196  DECLARE c CURSOR (p_a VARCHAR(32)) FOR
197  SELECT p_a FROM DUAL UNION SELECT REVERSE(p_a) FROM DUAL;
198  OPEN c((SELECT a_a));
199  FETCH c INTO v_a;
200  SELECT v_a;
201  FETCH c INTO v_a;
202  SELECT v_a;
203  CLOSE c;
204END;
205$$
206DELIMITER ;$$
207CALL p1('ab');
208DROP PROCEDURE p1;
209
210
211--echo #
212--echo # Two parameters in SELECT list + subselect
213--echo #
214
215DELIMITER $$;
216CREATE PROCEDURE p1()
217BEGIN
218  DECLARE v_a VARCHAR(32);
219  DECLARE v_b VARCHAR(32);
220  DECLARE c CURSOR (p_a VARCHAR(32), p_b VARCHAR(32)) FOR
221    SELECT p_a, p_b FROM DUAL
222      UNION
223    SELECT p_b, p_a FROM DUAL;
224  OPEN c((SELECT 'aaa'),(SELECT 'bbb'));
225  FETCH c INTO v_a, v_b;
226  SELECT v_a, v_b;
227  FETCH c INTO v_a, v_b;
228  SELECT v_a, v_b;
229  CLOSE c;
230END;
231$$
232DELIMITER ;$$
233CALL p1();
234DROP PROCEDURE p1;
235
236
237--echo #
238--echo # Two parameters in SELECT list + two parameters in WHERE + subselects
239--echo #
240
241DELIMITER $$;
242CREATE PROCEDURE p1(a_a VARCHAR(32), a_b VARCHAR(32))
243BEGIN
244  DECLARE done INT DEFAULT 0;
245  DECLARE v_a VARCHAR(32);
246  DECLARE v_b VARCHAR(32);
247  DECLARE c CURSOR (value_a VARCHAR(32), value_b VARCHAR(32),
248                    pattern_a VARCHAR(32), pattern_b VARCHAR(32)) FOR
249    SELECT value_a, value_b FROM DUAL WHERE value_a LIKE pattern_a
250      UNION
251    SELECT value_b, value_a FROM DUAL WHERE value_b LIKE pattern_b;
252  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
253  OPEN c((SELECT 'aaa'),(SELECT 'bbb'),(SELECT a_a),(SELECT a_b));
254  read_loop: LOOP
255    FETCH c INTO v_a, v_b;
256    IF done THEN
257      LEAVE read_loop;
258    END IF;
259    SELECT v_a, v_b;
260  END LOOP;
261  CLOSE c;
262END;
263$$
264DELIMITER ;$$
265CALL p1('%','%');
266CALL p1('aaa','xxx');
267CALL p1('xxx','bbb');
268CALL p1('xxx','xxx');
269DROP PROCEDURE p1;
270
271
272--echo #
273--echo # Parameters in SELECT list + stored function
274--echo #
275
276DELIMITER $$;
277CREATE FUNCTION f1 (a VARCHAR(32)) RETURNS VARCHAR(32)
278BEGIN
279  RETURN CONCAT(a,'y');
280END;
281$$
282CREATE PROCEDURE p1(a_a VARCHAR(32))
283BEGIN
284  DECLARE done INT DEFAULT 0;
285  DECLARE v_a VARCHAR(10);
286  DECLARE v_b VARCHAR(10);
287  DECLARE c CURSOR (p_sel_a VARCHAR(32), p_cmp_a VARCHAR(32)) FOR
288    SELECT p_sel_a, p_cmp_a FROM DUAL;
289  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
290  OPEN c(f1(a_a), f1(a_a));
291  read_loop: LOOP
292    FETCH c INTO v_a, v_b;
293    IF done THEN
294      LEAVE read_loop;
295    END IF;
296    SELECT v_a, v_b;
297  END LOOP;
298  CLOSE c;
299END;
300$$
301DELIMITER ;$$
302CALL p1('x');
303# A complex expression
304CALL p1(f1(COALESCE(NULL, f1('x'))));
305DROP PROCEDURE p1;
306DROP FUNCTION f1;
307
308
309--echo #
310--echo # One parameter in WHERE clause
311--echo #
312
313CREATE TABLE t1 (a INT, b VARCHAR(10));
314CREATE TABLE t2 (a INT, b VARCHAR(10));
315INSERT INTO t1 VALUES (1,'11');
316INSERT INTO t1 VALUES (1,'12');
317INSERT INTO t1 VALUES (2,'21');
318INSERT INTO t1 VALUES (2,'22');
319INSERT INTO t1 VALUES (3,'31');
320INSERT INTO t1 VALUES (3,'32');
321DELIMITER $$;
322CREATE PROCEDURE p1(a_a INT)
323BEGIN
324  DECLARE done INT DEFAULT 0;
325  DECLARE v_a INT;
326  DECLARE v_b VARCHAR(10);
327  DECLARE c CURSOR (p_a INT) FOR SELECT a,b FROM t1 WHERE a=p_a;
328  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
329  OPEN c(a_a);
330  read_loop: LOOP
331    FETCH c INTO v_a, v_b;
332    IF done THEN
333      LEAVE read_loop;
334    END IF;
335    INSERT INTO t2 VALUES (v_a,v_b);
336  END LOOP;
337  CLOSE c;
338END;
339$$
340DELIMITER ;$$
341CALL p1(1);
342SELECT * FROM t2;
343DROP TABLE t1;
344DROP TABLE t2;
345DROP PROCEDURE p1;
346
347
348--echo #
349--echo # Two parameters in WHERE clause
350--echo #
351
352CREATE TABLE t1 (a INT, b VARCHAR(10));
353CREATE TABLE t2 (a INT, b VARCHAR(10));
354INSERT INTO t1 VALUES (1,'11');
355INSERT INTO t1 VALUES (1,'12');
356INSERT INTO t1 VALUES (2,'21');
357INSERT INTO t1 VALUES (2,'22');
358INSERT INTO t1 VALUES (3,'31');
359INSERT INTO t1 VALUES (3,'32');
360DELIMITER $$;
361CREATE PROCEDURE p1(a_a INT, a_b VARCHAR(32))
362BEGIN
363  DECLARE done INT DEFAULT 0;
364  DECLARE v_a INT;
365  DECLARE v_b VARCHAR(10);
366  DECLARE c CURSOR (p_a INT, p_b VARCHAR(32)) FOR SELECT a,b FROM t1 WHERE a=p_a AND b=p_b;
367  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
368  OPEN c(a_a, a_b);
369  read_loop: LOOP
370    FETCH c INTO v_a, v_b;
371    IF done THEN
372      LEAVE read_loop;
373    END IF;
374    INSERT INTO t2 VALUES (v_a,v_b);
375  END LOOP;
376  CLOSE c;
377END;
378$$
379DELIMITER ;$$
380CALL p1(1,'11');
381SELECT * FROM t2;
382DROP TABLE t1;
383DROP TABLE t2;
384DROP PROCEDURE p1;
385
386--echo #
387--echo # Parameters in WHERE and HAVING clauses
388--echo #
389CREATE TABLE t1 (name VARCHAR(10), value INT);
390INSERT INTO t1 VALUES ('but',1);
391INSERT INTO t1 VALUES ('but',1);
392INSERT INTO t1 VALUES ('but',1);
393INSERT INTO t1 VALUES ('bin',1);
394INSERT INTO t1 VALUES ('bin',1);
395INSERT INTO t1 VALUES ('bot',1);
396DELIMITER $$;
397CREATE PROCEDURE p1 (arg_name_limit VARCHAR(32), arg_total_limit INT)
398BEGIN
399  DECLARE i INT DEFAULT 0;
400  DECLARE v_name VARCHAR(10);
401  DECLARE v_total INT;
402-- +0 is needed to work around the bug MDEV-11081
403  DECLARE c CURSOR(p_v INT) FOR
404    SELECT name, SUM(value + p_v) + 0 AS total FROM t1
405    WHERE name LIKE arg_name_limit
406    GROUP BY name HAVING total>=arg_total_limit;
407  WHILE i < 2 DO
408    BEGIN
409      DECLARE done INT DEFAULT 0;
410      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
411      OPEN c(i);
412      read_loop: LOOP
413        FETCH c INTO v_name, v_total;
414        IF done THEN
415          LEAVE read_loop;
416        END IF;
417        SELECT v_name, v_total;
418      END LOOP;
419      CLOSE c;
420      SET i= i + 1;
421    END;
422  END WHILE;
423END;
424$$
425DELIMITER ;$$
426CALL p1('%', 2);
427CALL p1('b_t', 0);
428DROP PROCEDURE p1;
429DROP TABLE t1;
430
431
432--echo #
433--echo # One parameter in LIMIT clause
434--echo #
435
436CREATE TABLE t1 (a INT, b VARCHAR(10));
437INSERT INTO t1 VALUES (1,'b1');
438INSERT INTO t1 VALUES (2,'b2');
439INSERT INTO t1 VALUES (3,'b3');
440INSERT INTO t1 VALUES (4,'b4');
441INSERT INTO t1 VALUES (5,'b5');
442INSERT INTO t1 VALUES (6,'b6');
443DELIMITER $$;
444CREATE PROCEDURE p1(a_a INT)
445BEGIN
446  DECLARE done INT DEFAULT 0;
447  DECLARE v_a INT;
448  DECLARE v_b VARCHAR(10);
449  DECLARE c CURSOR (p_a INT) FOR SELECT a,b FROM t1 ORDER BY a LIMIT p_a;
450  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
451  CREATE TABLE t2 (a INT, b VARCHAR(10));
452  OPEN c(a_a);
453  read_loop: LOOP
454    FETCH c INTO v_a, v_b;
455    IF done THEN
456      LEAVE read_loop;
457    END IF;
458    INSERT INTO t2 VALUES (v_a,v_b);
459  END LOOP;
460  CLOSE c;
461  SELECT * FROM t2;
462  DROP TABLE t2;
463END;
464$$
465DELIMITER ;$$
466CALL p1(1);
467CALL p1(3);
468CALL p1(6);
469DROP TABLE t1;
470DROP PROCEDURE p1;
471
472
473
474--echo #
475--echo # End of MDEV-12457 Cursors with parameters
476--echo #
477
478
479--echo #
480--echo # MDEV-14415 Add Oracle-style FOR loop to sql_mode=DEFAULT
481--echo #
482
483--echo # Explicit cursor
484
485CREATE TABLE t1 (a INT, b VARCHAR(10));
486INSERT INTO t1 VALUES (1,'b1'), (2,'b2'), (3,'b3');
487DELIMITER $$;
488BEGIN NOT ATOMIC
489  DECLARE cur CURSOR FOR SELECT * FROM t1;
490  FOR rec IN cur
491  DO
492    SELECT rec.a AS a, rec.b AS b;
493  END FOR;
494END;
495$$
496DELIMITER ;$$
497DROP TABLE t1;
498
499--echo # Explicit cursor with parameters
500
501CREATE TABLE t1 (a INT, b VARCHAR(10));
502INSERT INTO t1 VALUES (1,'b1'), (2,'b2'), (3,'b3');
503DELIMITER $$;
504BEGIN NOT ATOMIC
505  DECLARE cur CURSOR(pa INT) FOR SELECT * FROM t1 WHERE a>=pa;
506  FOR rec IN cur(2)
507  DO
508    SELECT rec.a AS a, rec.b AS b;
509  END FOR;
510END;
511$$
512DELIMITER ;$$
513DROP TABLE t1;
514
515--echo # Explicit cursor + label
516
517CREATE TABLE t1 (a INT, b VARCHAR(10));
518INSERT INTO t1 VALUES ('1','b1'), ('2','b2');
519DELIMITER $$;
520BEGIN NOT ATOMIC
521  DECLARE cur CURSOR FOR SELECT * FROM t1;
522  forrec:
523  FOR rec IN cur
524  DO
525    SELECT rec.a AS a, rec.b AS b;
526    IF rec.a = 2 THEN
527      LEAVE forrec;
528    END IF;
529  END FOR forrec;
530END;
531$$
532DELIMITER ;$$
533DROP TABLE t1;
534
535--echo # Explicit cursor + FETCH inside the loop body produce an error on "NOT FOUND"
536
537DELIMITER $$;
538--error ER_SP_FETCH_NO_DATA
539BEGIN NOT ATOMIC
540  DECLARE x INT;
541  DECLARE cur CURSOR FOR SELECT 1 AS x;
542  FOR rec IN cur
543  DO
544    FETCH cur INTO x;
545  END FOR;
546END;
547$$
548DELIMITER ;$$
549
550
551--echo # Explicit cursor + FETCH inside the loop body are normally handled by "HANDLER FOR NOT FOUND"
552
553DELIMITER $$;
554BEGIN NOT ATOMIC
555  DECLARE done INT DEFAULT 0;
556  DECLARE cur CURSOR FOR SELECT 1 AS x, 'y1' AS y UNION
557                         SELECT 2,'y2' UNION
558                         SELECT 3,'y3';
559  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
560  forrec:
561  FOR rec IN cur
562  DO
563    SELECT CONCAT(rec.x, ' ', rec.y) AS 'Implicit FETCH';
564    FETCH cur INTO rec;
565    IF done THEN
566      SELECT 'NO DATA' AS `Explicit FETCH`;
567      LEAVE forrec;
568    ELSE
569      SELECT CONCAT(rec.x, ' ', rec.y) AS 'Explicit FETCH';
570    END IF;
571  END FOR;
572END;
573$$
574DELIMITER ;$$
575
576
577--echo # Implicit cursor
578
579CREATE TABLE t1 (a INT, b VARCHAR(10));
580INSERT INTO t1 VALUES ('1','b1'), ('2','b2');
581DELIMITER $$;
582BEGIN NOT ATOMIC
583  FOR rec IN (SELECT * FROM t1)
584  DO
585    SELECT rec.a AS a, rec.b AS b;
586  END FOR;
587END;
588$$
589DELIMITER ;$$
590DROP TABLE t1;
591
592--echo # Implicit cursor + label
593
594CREATE TABLE t1 (a INT, b VARCHAR(10));
595INSERT INTO t1 VALUES ('1','b1'), ('2','b2');
596DELIMITER $$;
597BEGIN NOT ATOMIC
598  forrec:
599  FOR rec IN (SELECT * FROM t1)
600  DO
601    SELECT rec.a AS a, rec.b AS b;
602    IF rec.a = 2 THEN
603      LEAVE forrec;
604    END IF;
605  END FOR;
606END;
607$$
608DELIMITER ;$$
609DROP TABLE t1;
610
611
612--echo #
613--echo # MDEV-15941 Explicit cursor FOR loop does not close the cursor
614--echo #
615
616DELIMITER $$;
617--error ER_SP_CURSOR_NOT_OPEN
618BEGIN NOT ATOMIC
619  DECLARE v INT;
620  DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
621  FOR rec IN cur
622  DO
623    SELECT rec.a;
624  END FOR;
625  FETCH cur INTO v;
626END;
627$$
628DELIMITER ;$$
629
630
631DELIMITER $$;
632--error ER_SP_CURSOR_NOT_OPEN
633BEGIN NOT ATOMIC
634  DECLARE v INT;
635  DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
636label:
637  FOR rec IN cur
638  DO
639    SELECT rec.a;
640  END FOR;
641  FETCH cur INTO v;
642END;
643$$
644DELIMITER ;$$
645
646
647DELIMITER $$;
648--error ER_SP_CURSOR_ALREADY_OPEN
649BEGIN NOT ATOMIC
650  DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
651  OPEN cur;
652  FOR rec IN cur DO
653    SELECT rec.a;
654  END FOR;
655END;
656$$
657DELIMITER ;$$
658
659
660DELIMITER $$;
661BEGIN NOT ATOMIC
662  DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
663  FOR rec IN cur
664  DO
665    SELECT rec.a;
666  END FOR;
667  FOR rec IN cur
668  DO
669    SELECT rec.a;
670  END FOR;
671END;
672$$
673DELIMITER ;$$
674
675
676DELIMITER $$;
677BEGIN NOT ATOMIC
678  DECLARE cur CURSOR FOR SELECT 1 AS a FROM DUAL;
679label1:
680  FOR rec IN cur
681  DO
682    SELECT rec.a;
683  END FOR;
684label2:
685  FOR rec IN cur
686  DO
687    SELECT rec.a;
688  END FOR;
689END;
690$$
691DELIMITER ;$$
692
693
694--echo #
695--echo # MDEV-16584 SP with a cursor inside a loop wastes THD memory aggressively
696--echo #
697
698DELIMITER $$;
699CREATE PROCEDURE p1()
700BEGIN
701  DECLARE mem_used_old BIGINT UNSIGNED DEFAULT
702    (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS
703     WHERE VARIABLE_NAME='MEMORY_USED');
704  DECLARE i INT DEFAULT 1;
705  WHILE i <= 5000
706  DO
707    BEGIN
708      DECLARE msg TEXT;
709      DECLARE mem_used_cur BIGINT UNSIGNED DEFAULT
710        (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS
711         WHERE VARIABLE_NAME='MEMORY_USED');
712      DECLARE cur CURSOR FOR SELECT 1 FROM DUAL;
713      IF (mem_used_cur >= mem_used_old * 2) THEN
714        SHOW STATUS LIKE 'Memory_used';
715        SET msg=CONCAT('Memory leak detected: i=', i, ' mem_used_old=',mem_used_old,' mem_used_cur=', mem_used_cur);
716        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT=msg;
717      END IF;
718    END;
719    SET i=i+1;
720  END WHILE;
721END;
722$$
723DELIMITER ;$$
724CALL p1;
725DROP PROCEDURE p1;
726
727
728--echo #
729--echo # MDEV-17278 CURSOR FOR LOOP - ERROR: unexpected end of stream, read 0 bytes (SERVER CRASH)
730--echo #
731
732CREATE TABLE t1 (id2 int, id int, en1 enum('aaa','a','b','c'));
733INSERT INTO t1 VALUES(1,1,'aaa'),(2,2,'a'),(3,3,'b'),(4,4,'c');
734DELIMITER $$;
735CREATE PROCEDURE p1()
736BEGIN
737  FOR rec IN (SELECT en1 FROM t1)
738  DO
739    SELECT rec.en1;
740  END FOR;
741END;
742$$
743DELIMITER ;$$
744CALL p1();
745DROP PROCEDURE p1;
746DROP TABLE t1;
747