#
# 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;