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