mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 04:26:45 +03:00 
			
		
		
		
	 481bb717d7
			
		
	
	481bb717d7
	
	
	
		
			
			We want to have the defacto standard syntax for labels ("L:" instead of "label L;"),
and fix some known bugs, before we enable this again.
The code is left intact (#ifdef'ed SP_GOTO) and the test cases are kept in
sp-goto.test, for the future...
		
	
		
			
				
	
	
		
			239 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #
 | |
| # The non-standard GOTO, for compatibility
 | |
| #
 | |
| # QQQ The "label" syntax is temporary, it will (hopefully)
 | |
| #     change to the more common "L:" syntax soon.
 | |
| #     For the time being, this feature is disabled, until
 | |
| #     the syntax (and some other known bugs) can be fixed.
 | |
| #
 | |
| # Test cases for bugs are added at the end. See template there.
 | |
| #
 | |
| 
 | |
| --disable_warnings
 | |
| drop table if exists t1;
 | |
| --enable_warnings
 | |
| create table t1 (
 | |
| 	id   char(16) not null default '',
 | |
|         data int not null
 | |
| );
 | |
| 
 | |
| delimiter //;
 | |
| 
 | |
| --disable_warnings
 | |
| drop procedure if exists goto1//
 | |
| --enable_warnings
 | |
| create procedure goto1()
 | |
| begin
 | |
|   declare y int;
 | |
| 
 | |
| label a;
 | |
|   select * from t1;
 | |
|   select count(*) into y from t1;
 | |
|   if y > 2 then
 | |
|     goto b;
 | |
|   end if;
 | |
|   insert into t1 values ("j", y);
 | |
|   goto a;
 | |
| label b;
 | |
| end//
 | |
| 
 | |
| call goto1()//
 | |
| drop procedure goto1//
 | |
| 
 | |
| # With dummy handlers, just to test restore of contexts with jumps
 | |
| --disable_warnings
 | |
| drop procedure if exists goto2//
 | |
| --enable_warnings
 | |
| create procedure goto2(a int)
 | |
| begin
 | |
|   declare x int default 0;
 | |
|   declare continue handler for sqlstate '42S98' set x = 1;
 | |
| 
 | |
| label a;
 | |
|   select * from t1;
 | |
| b:
 | |
|   while x < 2 do
 | |
|     begin
 | |
|       declare continue handler for sqlstate '42S99' set x = 2;
 | |
| 
 | |
|       if a = 0 then
 | |
|         set x = x + 1;
 | |
|         iterate b;
 | |
|       elseif a = 1 then
 | |
|         leave b;
 | |
|       elseif a = 2 then
 | |
|         set a = 1;
 | |
|         goto a;
 | |
|       end if;
 | |
|     end;
 | |
|   end while b;
 | |
| 
 | |
|   select * from t1;
 | |
| end//
 | |
| 
 | |
| call goto2(0)//
 | |
| call goto2(1)//
 | |
| call goto2(2)//
 | |
| 
 | |
| drop procedure goto2//
 | |
| delete from t1//
 | |
| 
 | |
| # Check label visibility for some more cases. We don't call these.
 | |
| --disable_warnings
 | |
| drop procedure if exists goto3//
 | |
| --enable_warnings
 | |
| create procedure goto3()
 | |
| begin
 | |
|  label L1;
 | |
|    begin
 | |
|    end;
 | |
|  goto L1;
 | |
| end//
 | |
| drop procedure goto3//
 | |
| 
 | |
| --disable_warnings
 | |
| drop procedure if exists goto4//
 | |
| --enable_warnings
 | |
| create procedure goto4()
 | |
| begin
 | |
|   begin
 | |
|    label lab1;
 | |
|     begin
 | |
|       goto lab1;
 | |
|     end;
 | |
|   end;
 | |
| end//
 | |
| drop procedure goto4//
 | |
| 
 | |
| --disable_warnings
 | |
| drop procedure if exists goto5//
 | |
| --enable_warnings
 | |
| create procedure goto5()
 | |
| begin
 | |
|   begin
 | |
|     begin
 | |
|       goto lab1;
 | |
|     end;
 | |
|    label lab1;
 | |
|   end;
 | |
| end//
 | |
| drop procedure goto5//
 | |
| 
 | |
| --disable_warnings
 | |
| drop procedure if exists goto6//
 | |
| --enable_warnings
 | |
| create procedure goto6()
 | |
| begin
 | |
|   label L1;
 | |
|   goto L5;
 | |
|   begin
 | |
|     label L2;
 | |
|     goto L1;
 | |
|     goto L5;
 | |
|     begin
 | |
|       label L3;
 | |
|       goto L1;
 | |
|       goto L2;
 | |
|       goto L3;
 | |
|       goto L4;
 | |
|       goto L5;
 | |
|     end;
 | |
|     goto L2;
 | |
|     goto L4;
 | |
|     label L4;
 | |
|   end;
 | |
|   label L5;
 | |
|   goto L1;
 | |
| end//
 | |
| drop procedure goto6//
 | |
| 
 | |
| # Mismatching labels
 | |
| --error 1308
 | |
| create procedure foo()
 | |
| begin
 | |
|   goto foo;
 | |
| end//
 | |
| --error 1308
 | |
| create procedure foo()
 | |
| begin
 | |
|   begin
 | |
|     label foo;
 | |
|   end;
 | |
|   goto foo;
 | |
| end//
 | |
| --error 1308
 | |
| create procedure foo()
 | |
| begin
 | |
|   goto foo;
 | |
|   begin
 | |
|     label foo;
 | |
|   end;
 | |
| end//
 | |
| --error 1308
 | |
| create procedure foo()
 | |
| begin
 | |
|   begin
 | |
|     goto foo;
 | |
|   end;
 | |
|   begin
 | |
|     label foo;
 | |
|   end;
 | |
| end//
 | |
| --error 1308
 | |
| create procedure foo()
 | |
| begin
 | |
|   begin
 | |
|     label foo;
 | |
|   end;
 | |
|   begin
 | |
|     goto foo;
 | |
|   end;
 | |
| end//
 | |
| 
 | |
| # No goto in a handler
 | |
| --error 1358
 | |
| create procedure p()
 | |
| begin
 | |
|   declare continue handler for sqlexception
 | |
|     begin
 | |
|       goto L1;
 | |
|     end;
 | |
| 
 | |
|   select field from t1;
 | |
|   label L1;
 | |
| end//
 | |
| 
 | |
| 
 | |
| #
 | |
| # Test cases for old bugs
 | |
| #
 | |
| 
 | |
| #
 | |
| # BUG#6898: Stored procedure crash if GOTO statements exist
 | |
| #
 | |
| --disable_warnings
 | |
| drop procedure if exists bug6898//
 | |
| --enable_warnings
 | |
| create procedure bug6898()
 | |
| begin
 | |
|   goto label1;
 | |
|   label label1;
 | |
|   begin end;
 | |
|   goto label1;
 | |
| end//
 | |
| drop procedure bug6898//
 | |
| 
 | |
| #
 | |
| # BUG#NNNN: New bug synopsis
 | |
| #
 | |
| #--disable_warnings
 | |
| #drop procedure if exists bugNNNN//
 | |
| #--enable_warnings
 | |
| #create procedure bugNNNN...
 | |
| 
 | |
| 
 | |
| # Add bugs above this line. Use existing tables t1 and t2 when
 | |
| # practical, or create table t3, t4 etc temporarily (and drop them).
 | |
| delimiter ;//
 | |
| drop table t1;
 |