mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	 c80ced4111
			
		
	
	c80ced4111
	
	
	
		
			
			The files below "mysql-test/suite/funcs_1" in version 5.1
did not depend on the equivalent ones in 5.0,
probably because they had been checked in independent of each other
in both versions.
Step 1:
Foreach file F in the suite that has a "deleted" counterpart D, use
    bk rm $F
    bk mv $D $F
to get those files into the 5.1 suite that (for BK) depend on 5.0.
		
	
		
			
				
	
	
		
			465 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			465 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| #### suite/funcs_1/storedproc/storedproc_03.inc
 | |
| #
 | |
| --source suite/funcs_1/storedproc/load_sp_tb.inc
 | |
| 
 | |
| # ==============================================================================
 | |
| # (numbering from requirement document TP v1.0, Last updated: 25 Jan 2005 01:00)
 | |
| #
 | |
| # 3.1.3 Syntax checks for the stored procedure-specific flow control statements IF, CASE, LOOP, LEAVE, ITERATE, REPEAT, WHILE:
 | |
| #
 | |
| #-  1. Ensure that all subclauses that should be supported are supported.
 | |
| #-  2. Ensure that all subclauses that should not be supported are disallowed with an appropriate error message.
 | |
| #-  3. Ensure that all supported subclauses are supported only in the correct order.
 | |
| #-  4. Ensure that an appropriate error message is returned if a subclause is out-of-order in a stored procedure definition.
 | |
| #-  5. Ensure that all subclauses that are defined to be mandatory are indeed required to be mandatory by the MySQL server and tools.
 | |
| #-  6. Ensure that any subclauses that are defined to be optional are indeed treated as optional by the MySQL server and tools.
 | |
| ##  7. Ensure that the IF statement acts correctly for all variants, including cases where statements are nested.
 | |
| ##  8. Ensure that the CASE statement acts correctly for all variants, including cases where statements are nested.
 | |
| ##  9. Ensure that the LOOP statement acts correctly for all variants, including cases where statements are nested.
 | |
| #- 10. Ensure that the labels enclosing each LOOP statement must match.
 | |
| #- 11. Ensure that it is possible to put a beginning label at the start of a LOOP statement without also requiring an ending label at the end of the same statement.
 | |
| #- 12. Ensure that it is not possible to put an ending label at the end of a LOOP statement without also requiring a matching beginning label at the start of the same statement.
 | |
| #- 13. Ensure that every beginning label must end with a colon (:).
 | |
| #- 14. Ensure that every beginning label with the same scope must be unique.
 | |
| ## 15. Ensure that the LEAVE statement acts correctly for all variants, including cases where statements are nested.
 | |
| ## 16. Ensure that the ITERATE statement acts correctly for all variants, including cases where statements are nested.
 | |
| #- 17. Ensure that the ITERATE statement fails, with an appropriate error message, if it appears in any context other than within LOOP, REPEAT, or WHILE statements.
 | |
| ## 18. Ensure that the REPEAT statement acts correctly for all variants, including cases where statements are nested.
 | |
| #- 19. Ensure that the labels enclosing each REPEAT statement must match.
 | |
| #- 20. Ensure that it is possible to put a beginning label at the start of a REPEAT statement without also requiring an ending label at the end of the same statement.
 | |
| #- 21. Ensure that it is not possible to put an ending label at the end of a REPEAT statement without also requiring a matching beginning label at the start of the same statement.
 | |
| #- 22. Ensure that every beginning label must end with a colon (:).
 | |
| #- 23. Ensure that every beginning label with the same scope must be unique.
 | |
| ## 24. Ensure that the WHILE statement acts correctly for all variants, including cases where statements are nested.
 | |
| #- 25. Ensure that the labels enclosing each WHILE statement must match.
 | |
| #- 26. Ensure that it is possible to put a beginning label at the start of a WHILE statement without also requiring an ending label at the end of the same statement.
 | |
| #- 27. Ensure that it is not possible to put an ending label at the end of a WHILE statement without also requiring a matching beginning label at the start of the same statement.
 | |
| #- 28. Ensure that every beginning label must end with a colon (:).
 | |
| #- 29. Ensure that every beginning label with the same scope must be unique.
 | |
| ## 30. Ensure that multiple cases of all possible combinations of the control flow statements, nested within multiple compound statements within a stored procedure, always act correctly and return the expected result.
 | |
| #
 | |
| # ==============================================================================
 | |
| let $message= Section 3.1.3 - Syntax checks for the stored procedure-specific flow
 | |
| control statements IF, CASE, LOOP, LEAVE, ITERATE, REPEAT, WHILE:;
 | |
| --source include/show_msg80.inc
 | |
| 
 | |
| #FIXME # 3.1.3: enhance syntax checks with very complicated checks
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| let $message= Testcase 3.1.3.7:;
 | |
| --source include/show_msg.inc
 | |
| let $message=
 | |
| Ensure that the IF statement acts correctly for all variants, including cases
 | |
| where statements are nested.;
 | |
| --source include/show_msg80.inc
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| DROP PROCEDURE IF EXISTS sp9;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742( f1 CHAR(20), f2 VARCHAR(20), f3 SMALLINT);
 | |
| 
 | |
| delimiter //;
 | |
| CREATE PROCEDURE sp9( action char(20), subaction char(20) )
 | |
| BEGIN
 | |
|    if action = 'action' then
 | |
|       if subaction = 'subaction' then
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'subaction' , 1);
 | |
|       else
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'none' , 2);
 | |
|       END if;
 | |
|    else
 | |
|       if subaction = 'subaction'
 | |
|       then
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'subaction' , 3);
 | |
|       elseif subaction = 'subaction1'
 | |
|       then
 | |
|          BEGIN
 | |
|             insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values ('none', 'subaction1', 4);
 | |
|          END;
 | |
|       else
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'none' , 5);
 | |
|       END if;
 | |
|    END if;
 | |
| END//
 | |
| delimiter ;//
 | |
| 
 | |
| CALL sp9( 'action', 'subaction' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=1;
 | |
| 
 | |
| CALL sp9( 'temp', 'subaction' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=3;
 | |
| 
 | |
| CALL sp9( 'temp', 'subaction1' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=4;
 | |
| 
 | |
| CALL sp9( 'action', 'temp' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=2;
 | |
| 
 | |
| CALL sp9( 'temp', 'temp' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=5;
 | |
| 
 | |
| # cleanup 3.1.3.7
 | |
| DROP PROCEDURE sp9;
 | |
| DROP TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| let $message= Testcase 3.1.3.8.:;
 | |
| --source include/show_msg.inc
 | |
| let $message=
 | |
| Ensure that the CASE statement acts correctly for all variants, including cases
 | |
| where statements are nested.;
 | |
| --source include/show_msg80.inc
 | |
| 
 | |
| --disable_warnings
 | |
| drop table IF EXISTS res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| DROP PROCEDURE IF EXISTS sp10;
 | |
| --enable_warnings
 | |
| 
 | |
| create table res_t3_itisalongname_1381742_itsaverylongname_1381742( f1 char(20), f2 varchar(20), f3 smallint);
 | |
| 
 | |
| delimiter //;
 | |
| CREATE PROCEDURE sp10( action char(20), subaction char(20) )
 | |
| BEGIN
 | |
|    case action
 | |
|    when 'action' then
 | |
|       case
 | |
|       when subaction = 'subaction_1' then
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'subaction_2' , 1);
 | |
|       when subaction = 'subaction_2' then
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'subaction_2' , 2);
 | |
|       else
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'none' , 3);
 | |
|       END case;
 | |
|     else
 | |
|       case
 | |
|       when subaction = 'subaction_1' then
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'subaction_1' , 4);
 | |
|       when subaction = 'subaction_2' then
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'subaction_2' , 5);
 | |
|       else
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'none' , 6);
 | |
|       END case;
 | |
|    END case;
 | |
| END//
 | |
| delimiter ;//
 | |
| 
 | |
| CALL sp10( 'action', 'subaction_1' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| CALL sp10( 'action', 'subaction_2' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| CALL sp10( 'temp', 'subaction_1' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| CALL sp10( 'temp', 'subaction_2' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| CALL sp10( 'action', 'temp' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| CALL sp10( 'temp', 'temp' );
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| # cleanup 3.1.3.8
 | |
| DROP PROCEDURE sp10;
 | |
| DROP TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| let $message= Testcase 3.1.3.9 + 3.1.3.15:;
 | |
| --source include/show_msg.inc
 | |
| let $message=
 | |
| 09. Ensure that the LOOP statement acts correctly for all variants, including
 | |
| .   cases where statements are nested.
 | |
| 15. Ensure that the LEAVE statement acts correctly for all variants, including
 | |
| .   cases where statements are nested.;
 | |
| --source include/show_msg80.inc
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| DROP PROCEDURE IF EXISTS sp11;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742( f1 CHAR(20), f2 VARCHAR(20), f3 SMALLINT);
 | |
| 
 | |
| delimiter //;
 | |
| CREATE PROCEDURE sp11( )
 | |
| BEGIN
 | |
|    declare count1 integer default 1;
 | |
|    declare count2 integer default 1;
 | |
|    label1: loop
 | |
|       if count2 > 3 then leave label1;
 | |
|       END if;
 | |
|       set count1 = 1;
 | |
|       label2: loop
 | |
|          if count1 > 4 then leave label2;
 | |
|          END if;
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'xyz' , 'pqr', count1);
 | |
|          set count1 = count1 + 1;
 | |
|          iterate label2;
 | |
|       END loop label2;
 | |
|       set count2 = count2 + 1;
 | |
|       iterate label1;
 | |
|    END loop label1;
 | |
| END//
 | |
| delimiter ;//
 | |
| 
 | |
| CALL sp11();
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| # cleanup 3.1.3.9
 | |
| DROP PROCEDURE sp11;
 | |
| DROP TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| let $message= Testcase 3.1.3.16:;
 | |
| --source include/show_msg.inc
 | |
| let $message=
 | |
| Ensure that the ITERATE statement acts correctly for all variants, including
 | |
| cases where statements are nested.
 | |
| (tests for this testcase are also included in other testcases);
 | |
| --source include/show_msg80.inc
 | |
| 
 | |
| --disable_warnings
 | |
| DROP PROCEDURE IF EXISTS sp31316;
 | |
| --enable_warnings
 | |
| 
 | |
| delimiter //;
 | |
| 
 | |
| # wrong label at iterate
 | |
| #Error: 1308 SQLSTATE: 42000 (ER_SP_LILABEL_MISMATCH) Message: %s with no matching label: %s
 | |
| --error 1308
 | |
| CREATE PROCEDURE sp31316( )
 | |
| BEGIN
 | |
|    declare count1 integer default 1;
 | |
|    declare count2 integer default 1;
 | |
|    label1: loop
 | |
|       if count2 > 3 then leave label1;
 | |
|       END if;
 | |
|       set count1 = 1;
 | |
|       label2: loop
 | |
|          if count1 > 4 then leave label2;
 | |
|          END if;
 | |
|          insert into temp values( count1, count2);
 | |
|          set count1 = count1 + 1;
 | |
|          iterate label3;
 | |
|       END loop label2;
 | |
|       set count2 = count2 + 1;
 | |
|       iterate label1;
 | |
|    END loop label1;
 | |
| END//
 | |
| delimiter ;//
 | |
| 
 | |
| # cleanup 3.1.3.16
 | |
| #DROP PROCEDURE sp31316;
 | |
| 
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| let $message= Testcase 3.1.3.18:;
 | |
| --source include/show_msg.inc
 | |
| let $message=
 | |
| Ensure that the REPEAT statement acts correctly for all variants, including
 | |
| cases where statements are nested.;
 | |
| --source include/show_msg80.inc
 | |
| 
 | |
| --disable_warnings
 | |
| DROP PROCEDURE IF EXISTS sp17;
 | |
| DROP TABLE IF EXISTS res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742( f1 CHAR(20), f2 VARCHAR(20), f3 SMALLINT);
 | |
| 
 | |
| delimiter //;
 | |
| CREATE PROCEDURE sp17( )
 | |
| BEGIN
 | |
|    declare count1 integer default 1;
 | |
|    declare count2 integer default 1;
 | |
|    repeat
 | |
|       set count1 = count1 + 1;
 | |
|       set count2 = 1;
 | |
|       label1: repeat
 | |
|          set count2 = count2 + 1;
 | |
|          insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'xyz' , 'pqr', count1);
 | |
|          until count2 > 3
 | |
|       END repeat label1;
 | |
|       until count1 > 3
 | |
|    END repeat;
 | |
| END//
 | |
| delimiter ;//
 | |
| 
 | |
| CALL sp17();
 | |
| SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| # cleanup 3.1.3.18
 | |
| DROP PROCEDURE sp17;
 | |
| DROP TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742;
 | |
| 
 | |
| 
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| let $message= Testcase 3.1.3.24:;
 | |
| --source include/show_msg.inc
 | |
| let $message=
 | |
| Ensure that the WHILE statement acts correctly for all variants, including cases
 | |
| where statements are nested.;
 | |
| --source include/show_msg80.inc
 | |
| 
 | |
| --disable_warnings
 | |
| drop table IF EXISTS res_t21;
 | |
| DROP PROCEDURE IF EXISTS sp21;
 | |
| --enable_warnings
 | |
| 
 | |
| create table res_t21(name text(10), surname blob(20), age_averylongfieldname_averylongname_1234569 smallint);
 | |
| insert into res_t21 values('ashwin', 'mokadam', 25);
 | |
| 
 | |
| delimiter //;
 | |
| CREATE PROCEDURE sp21( )
 | |
| BEGIN
 | |
|    declare count1 integer default 0;
 | |
|    declare count2 integer default 0;
 | |
|    while count1 < 3 do
 | |
|       BEGIN
 | |
|          declare ithisissamevariablename int default 100;
 | |
|          SELECT ithisissamevariablename;
 | |
|          BEGIN
 | |
|             declare ithisissamevariablename int default 200;
 | |
|             SELECT ithisissamevariablename;
 | |
|          END;
 | |
|          set count2 = 0;
 | |
|          label1: while count2 < 3 do
 | |
|             BEGIN
 | |
|                declare count1 integer default 7;
 | |
|                set count2 = count2 + 1;
 | |
|                insert into res_t21 values( 'xyz' , 'pqr', count2);
 | |
|                label2: while count1 < 10 do
 | |
|                   set count1 = count1 + 1;
 | |
|                   insert into res_t21 values( 'xyz' , 'pqr', count1);
 | |
|                END while label2;
 | |
|             END;
 | |
|          END while label1;
 | |
|          set count1 = count1 + 1;
 | |
|       END;
 | |
|    END while;
 | |
| END//
 | |
| delimiter ;//
 | |
| 
 | |
| CALL sp21();
 | |
| SELECT * from res_t21;
 | |
| 
 | |
| # cleanup 3.1.3.
 | |
| DROP PROCEDURE sp21;
 | |
| drop table res_t21;
 | |
| 
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| let $message= Testcase 3.1.3.30:;
 | |
| --source include/show_msg.inc
 | |
| let $message=
 | |
| Ensure that multiple cases of all possible combinations of the control flow
 | |
| statements, nested within multiple compound statements within a stored
 | |
| procedure, always act correctly and return the expected result.;
 | |
| --source include/show_msg80.inc
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS res_tbl;
 | |
| DROP PROCEDURE IF EXISTS sp31330;
 | |
| --enable_warnings
 | |
| 
 | |
| create table res_tbl (f1 int, f2 text, f3 blob, f4 date,
 | |
|       f5 set('one', 'two', 'three', 'four', 'five') default 'one');
 | |
| 
 | |
| delimiter //;
 | |
| #FIXME: can be enhanced more and more ...
 | |
| CREATE PROCEDURE sp31330 (path int)
 | |
| BEGIN
 | |
|    declare count int default 1;
 | |
|    declare var1 text;
 | |
|    declare var2 blob;
 | |
|    declare var3 date;
 | |
|    declare var4 set('one', 'two', 'three', 'four', 'five') DEFAULT 'five';
 | |
|    case
 | |
|       when path=1 then
 | |
|          set var3 = '2000-11-09';
 | |
|          set var1 = 'flowing through case 1';
 | |
|          label1: loop
 | |
|             if count > 5 then
 | |
|                if var4=1000 then
 | |
|                   set var2 = 'exiting out of case 1 - invalid SET';
 | |
|                END if;
 | |
|                if var4='two' then
 | |
|                   set var2 = 'exiting out of case 1';
 | |
|                END if;
 | |
|                insert into res_tbl values (1, var1, var2, var3, (count-2));
 | |
|                leave label1;
 | |
|             elseif count = 5 then
 | |
|                set count= count + 2;
 | |
|                set var4='two';
 | |
|                iterate label1;
 | |
|             else
 | |
|                set count= count + 1;
 | |
|             END if;
 | |
|             set var4='one';
 | |
|          END loop label1;
 | |
|       when path=2 then
 | |
|          set var3 = '1989-11-09';
 | |
|          set var1 = 'flowing through case 2';
 | |
|          set @count3=0;
 | |
|          label2: repeat
 | |
|             set count=count + 1;
 | |
|             set @count2=1;
 | |
|             while @count2 <= 5 do
 | |
|                set @count2 = @count2 + 1;
 | |
|             END while;
 | |
|             SELECT @count2;
 | |
|             set @count3=@count3 + @count2;
 | |
|             until count > 5
 | |
|          END repeat label2;
 | |
|          set var2 = 'exiting out of case 2';
 | |
|          set var4 = count-3;
 | |
|          SELECT @count3;
 | |
|          insert into res_tbl values (2, var1, var2, var3, var4);
 | |
|       ELSE BEGIN
 | |
|          set @error_opt='undefined path specified';
 | |
|          SELECT @error_opt;
 | |
|       END;
 | |
|    END case;
 | |
| END//
 | |
| delimiter ;//
 | |
| 
 | |
| #Error: 1318 SQLSTATE: 42000 (ER_SP_WRONG_NO_OF_ARGS) Message: Incorrect number of arguments for %s %s; expected %u, got %u
 | |
| --error 1318
 | |
| CALL sp31330();
 | |
| 
 | |
| CALL sp31330(1);
 | |
| SELECT * from res_tbl;
 | |
| 
 | |
| CALL sp31330(2);
 | |
| SELECT * from res_tbl;
 | |
| 
 | |
| CALL sp31330(4);
 | |
| 
 | |
| # cleanup 3.1.3.30
 | |
| DROP PROCEDURE sp31330;
 | |
| drop table res_tbl;
 | |
| 
 | |
| 
 | |
| 
 | |
| # ==============================================================================
 | |
| # USE the same .inc to cleanup before and after the test
 | |
| --source suite/funcs_1/storedproc/cleanup_sp_tb.inc
 | |
| 
 | |
| # ==============================================================================
 | |
| let $message= .                               +++ END OF SCRIPT +++;
 | |
| --source include/show_msg80.inc
 | |
| # ==============================================================================
 |