mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	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...
mysql-test/r/sp-error.result:
  Moved all goto tests to sp-goto.test.
mysql-test/r/sp.result:
  Moved all goto tests to sp-goto.test.
mysql-test/t/disabled.def:
  Disabled GOTO/LABEL (until the label syntax and some bugs can be fixed).
  We keep the tests in sp-goto.test for the future, but disable for now.
mysql-test/t/sp-error.test:
  Moved all goto tests to sp-goto.test.
mysql-test/t/sp.test:
  Moved all goto tests to sp-goto.test.
sql/lex.h:
  Disabled GOTO/LABEL (until the label syntax and some bugs can be fixed).
sql/sql_yacc.yy:
  Disabled GOTO/LABEL (until the label syntax and some bugs can be fixed).
		
	
		
			
				
	
	
		
			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;
 |