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