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