mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Disabled the GOTO feature. (It's non-standard and undocumented.)
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).
This commit is contained in:
@ -65,47 +65,6 @@ iterate foo;
|
|||||||
end|
|
end|
|
||||||
ERROR 42000: ITERATE with no matching label: foo
|
ERROR 42000: ITERATE with no matching label: foo
|
||||||
create procedure foo()
|
create procedure foo()
|
||||||
begin
|
|
||||||
goto foo;
|
|
||||||
end|
|
|
||||||
ERROR 42000: GOTO with no matching label: foo
|
|
||||||
create procedure foo()
|
|
||||||
begin
|
|
||||||
begin
|
|
||||||
label foo;
|
|
||||||
end;
|
|
||||||
goto foo;
|
|
||||||
end|
|
|
||||||
ERROR 42000: GOTO with no matching label: foo
|
|
||||||
create procedure foo()
|
|
||||||
begin
|
|
||||||
goto foo;
|
|
||||||
begin
|
|
||||||
label foo;
|
|
||||||
end;
|
|
||||||
end|
|
|
||||||
ERROR 42000: GOTO with no matching label: foo
|
|
||||||
create procedure foo()
|
|
||||||
begin
|
|
||||||
begin
|
|
||||||
goto foo;
|
|
||||||
end;
|
|
||||||
begin
|
|
||||||
label foo;
|
|
||||||
end;
|
|
||||||
end|
|
|
||||||
ERROR 42000: GOTO with no matching label: foo
|
|
||||||
create procedure foo()
|
|
||||||
begin
|
|
||||||
begin
|
|
||||||
label foo;
|
|
||||||
end;
|
|
||||||
begin
|
|
||||||
goto foo;
|
|
||||||
end;
|
|
||||||
end|
|
|
||||||
ERROR 42000: GOTO with no matching label: foo
|
|
||||||
create procedure foo()
|
|
||||||
foo: loop
|
foo: loop
|
||||||
foo: loop
|
foo: loop
|
||||||
set @x=2;
|
set @x=2;
|
||||||
@ -308,16 +267,6 @@ declare continue handler for sqlstate '42S99' set x = 1;
|
|||||||
declare c cursor for select * from t1;
|
declare c cursor for select * from t1;
|
||||||
end|
|
end|
|
||||||
ERROR 42000: Cursor declaration after handler declaration
|
ERROR 42000: Cursor declaration after handler declaration
|
||||||
create procedure p()
|
|
||||||
begin
|
|
||||||
declare continue handler for sqlexception
|
|
||||||
begin
|
|
||||||
goto L1;
|
|
||||||
end;
|
|
||||||
select field from t1;
|
|
||||||
label L1;
|
|
||||||
end|
|
|
||||||
ERROR HY000: GOTO is not allowed in a stored procedure handler
|
|
||||||
drop procedure if exists p|
|
drop procedure if exists p|
|
||||||
create procedure p(in x int, inout y int, out z int)
|
create procedure p(in x int, inout y int, out z int)
|
||||||
begin
|
begin
|
||||||
|
205
mysql-test/r/sp-goto.result
Normal file
205
mysql-test/r/sp-goto.result
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
drop table if exists t1;
|
||||||
|
create table t1 (
|
||||||
|
id char(16) not null default '',
|
||||||
|
data int not null
|
||||||
|
);
|
||||||
|
drop procedure if exists goto1//
|
||||||
|
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()//
|
||||||
|
id data
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
j 2
|
||||||
|
drop procedure goto1//
|
||||||
|
drop procedure if exists goto2//
|
||||||
|
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)//
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
j 2
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
j 2
|
||||||
|
call goto2(1)//
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
j 2
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
j 2
|
||||||
|
call goto2(2)//
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
j 2
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
j 2
|
||||||
|
id data
|
||||||
|
j 0
|
||||||
|
j 1
|
||||||
|
j 2
|
||||||
|
drop procedure goto2//
|
||||||
|
delete from t1//
|
||||||
|
drop procedure if exists goto3//
|
||||||
|
create procedure goto3()
|
||||||
|
begin
|
||||||
|
label L1;
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
goto L1;
|
||||||
|
end//
|
||||||
|
drop procedure goto3//
|
||||||
|
drop procedure if exists goto4//
|
||||||
|
create procedure goto4()
|
||||||
|
begin
|
||||||
|
begin
|
||||||
|
label lab1;
|
||||||
|
begin
|
||||||
|
goto lab1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end//
|
||||||
|
drop procedure goto4//
|
||||||
|
drop procedure if exists goto5//
|
||||||
|
create procedure goto5()
|
||||||
|
begin
|
||||||
|
begin
|
||||||
|
begin
|
||||||
|
goto lab1;
|
||||||
|
end;
|
||||||
|
label lab1;
|
||||||
|
end;
|
||||||
|
end//
|
||||||
|
drop procedure goto5//
|
||||||
|
drop procedure if exists goto6//
|
||||||
|
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//
|
||||||
|
create procedure foo()
|
||||||
|
begin
|
||||||
|
goto foo;
|
||||||
|
end//
|
||||||
|
ERROR 42000: GOTO with no matching label: foo
|
||||||
|
create procedure foo()
|
||||||
|
begin
|
||||||
|
begin
|
||||||
|
label foo;
|
||||||
|
end;
|
||||||
|
goto foo;
|
||||||
|
end//
|
||||||
|
ERROR 42000: GOTO with no matching label: foo
|
||||||
|
create procedure foo()
|
||||||
|
begin
|
||||||
|
goto foo;
|
||||||
|
begin
|
||||||
|
label foo;
|
||||||
|
end;
|
||||||
|
end//
|
||||||
|
ERROR 42000: GOTO with no matching label: foo
|
||||||
|
create procedure foo()
|
||||||
|
begin
|
||||||
|
begin
|
||||||
|
goto foo;
|
||||||
|
end;
|
||||||
|
begin
|
||||||
|
label foo;
|
||||||
|
end;
|
||||||
|
end//
|
||||||
|
ERROR 42000: GOTO with no matching label: foo
|
||||||
|
create procedure foo()
|
||||||
|
begin
|
||||||
|
begin
|
||||||
|
label foo;
|
||||||
|
end;
|
||||||
|
begin
|
||||||
|
goto foo;
|
||||||
|
end;
|
||||||
|
end//
|
||||||
|
ERROR 42000: GOTO with no matching label: foo
|
||||||
|
create procedure p()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlexception
|
||||||
|
begin
|
||||||
|
goto L1;
|
||||||
|
end;
|
||||||
|
select field from t1;
|
||||||
|
label L1;
|
||||||
|
end//
|
||||||
|
ERROR HY000: GOTO is not allowed in a stored procedure handler
|
||||||
|
drop procedure if exists bug6898//
|
||||||
|
create procedure bug6898()
|
||||||
|
begin
|
||||||
|
goto label1;
|
||||||
|
label label1;
|
||||||
|
begin end;
|
||||||
|
goto label1;
|
||||||
|
end//
|
||||||
|
drop procedure bug6898//
|
||||||
|
drop table t1;
|
@ -438,145 +438,6 @@ id data
|
|||||||
i 3
|
i 3
|
||||||
delete from t1|
|
delete from t1|
|
||||||
drop procedure i|
|
drop procedure i|
|
||||||
drop procedure if exists goto1|
|
|
||||||
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()|
|
|
||||||
id data
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
j 2
|
|
||||||
drop procedure goto1|
|
|
||||||
drop procedure if exists goto2|
|
|
||||||
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)|
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
j 2
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
j 2
|
|
||||||
call goto2(1)|
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
j 2
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
j 2
|
|
||||||
call goto2(2)|
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
j 2
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
j 2
|
|
||||||
id data
|
|
||||||
j 0
|
|
||||||
j 1
|
|
||||||
j 2
|
|
||||||
drop procedure goto2|
|
|
||||||
delete from t1|
|
|
||||||
drop procedure if exists goto3|
|
|
||||||
create procedure goto3()
|
|
||||||
begin
|
|
||||||
label L1;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
goto L1;
|
|
||||||
end|
|
|
||||||
drop procedure goto3|
|
|
||||||
drop procedure if exists goto4|
|
|
||||||
create procedure goto4()
|
|
||||||
begin
|
|
||||||
begin
|
|
||||||
label lab1;
|
|
||||||
begin
|
|
||||||
goto lab1;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end|
|
|
||||||
drop procedure goto4|
|
|
||||||
drop procedure if exists goto5|
|
|
||||||
create procedure goto5()
|
|
||||||
begin
|
|
||||||
begin
|
|
||||||
begin
|
|
||||||
goto lab1;
|
|
||||||
end;
|
|
||||||
label lab1;
|
|
||||||
end;
|
|
||||||
end|
|
|
||||||
drop procedure goto5|
|
|
||||||
drop procedure if exists goto6|
|
|
||||||
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|
|
|
||||||
insert into t1 values ("foo", 3), ("bar", 19)|
|
insert into t1 values ("foo", 3), ("bar", 19)|
|
||||||
insert into t2 values ("x", 9, 4.1), ("y", -1, 19.2), ("z", 3, 2.2)|
|
insert into t2 values ("x", 9, 4.1), ("y", -1, 19.2), ("z", 3, 2.2)|
|
||||||
drop procedure if exists sel1|
|
drop procedure if exists sel1|
|
||||||
@ -2971,15 +2832,6 @@ select @x|
|
|||||||
set global query_cache_size = @qcs1|
|
set global query_cache_size = @qcs1|
|
||||||
delete from t1|
|
delete from t1|
|
||||||
drop function bug9902|
|
drop function bug9902|
|
||||||
drop procedure if exists bug6898|
|
|
||||||
create procedure bug6898()
|
|
||||||
begin
|
|
||||||
goto label1;
|
|
||||||
label label1;
|
|
||||||
begin end;
|
|
||||||
goto label1;
|
|
||||||
end|
|
|
||||||
drop procedure bug6898|
|
|
||||||
drop function if exists bug9102|
|
drop function if exists bug9102|
|
||||||
create function bug9102() returns blob return 'a'|
|
create function bug9102() returns blob return 'a'|
|
||||||
select bug9102()|
|
select bug9102()|
|
||||||
|
@ -10,3 +10,4 @@
|
|||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
sp-goto:GOTO is currently is disabled - will be fixed in the future
|
||||||
|
@ -84,7 +84,7 @@ show create procedure foo|
|
|||||||
--error 1305
|
--error 1305
|
||||||
show create function foo|
|
show create function foo|
|
||||||
|
|
||||||
# LEAVE/ITERATE/GOTO with no match
|
# LEAVE/ITERATE with no match
|
||||||
--error 1308
|
--error 1308
|
||||||
create procedure foo()
|
create procedure foo()
|
||||||
foo: loop
|
foo: loop
|
||||||
@ -100,47 +100,6 @@ create procedure foo()
|
|||||||
foo: begin
|
foo: begin
|
||||||
iterate foo;
|
iterate foo;
|
||||||
end|
|
end|
|
||||||
--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|
|
|
||||||
|
|
||||||
# Redefining label
|
# Redefining label
|
||||||
--error 1309
|
--error 1309
|
||||||
@ -398,18 +357,6 @@ begin
|
|||||||
declare c cursor for select * from t1;
|
declare c cursor for select * from t1;
|
||||||
end|
|
end|
|
||||||
|
|
||||||
--error 1358
|
|
||||||
create procedure p()
|
|
||||||
begin
|
|
||||||
declare continue handler for sqlexception
|
|
||||||
begin
|
|
||||||
goto L1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
select field from t1;
|
|
||||||
label L1;
|
|
||||||
end|
|
|
||||||
|
|
||||||
# Check in and inout arguments.
|
# Check in and inout arguments.
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop procedure if exists p|
|
drop procedure if exists p|
|
||||||
|
238
mysql-test/t/sp-goto.test
Normal file
238
mysql-test/t/sp-goto.test
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
#
|
||||||
|
# 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;
|
@ -12,6 +12,7 @@
|
|||||||
# Tests that check privilege and security issues go to sp-security.test.
|
# Tests that check privilege and security issues go to sp-security.test.
|
||||||
# Tests that require multiple connections, except security/privilege tests,
|
# Tests that require multiple connections, except security/privilege tests,
|
||||||
# go to sp-thread.
|
# go to sp-thread.
|
||||||
|
# Tests that uses 'goto' to into sp-goto.test (currently disabled)
|
||||||
|
|
||||||
use test;
|
use test;
|
||||||
|
|
||||||
@ -585,139 +586,6 @@ delete from t1|
|
|||||||
drop procedure i|
|
drop procedure i|
|
||||||
|
|
||||||
|
|
||||||
# The non-standard GOTO, for compatibility
|
|
||||||
#
|
|
||||||
# QQQ The "label" syntax is temporary, it will (hopefully)
|
|
||||||
# change to the more common "L:" syntax soon.
|
|
||||||
#
|
|
||||||
--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|
|
|
||||||
|
|
||||||
# SELECT with one of more result set sent back to the clinet
|
# SELECT with one of more result set sent back to the clinet
|
||||||
insert into t1 values ("foo", 3), ("bar", 19)|
|
insert into t1 values ("foo", 3), ("bar", 19)|
|
||||||
insert into t2 values ("x", 9, 4.1), ("y", -1, 19.2), ("z", 3, 2.2)|
|
insert into t2 values ("x", 9, 4.1), ("y", -1, 19.2), ("z", 3, 2.2)|
|
||||||
@ -3634,22 +3502,6 @@ delete from t1|
|
|||||||
drop function bug9902|
|
drop function bug9902|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# 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#9102: Stored proccedures: function which returns blob causes crash
|
# BUG#9102: Stored proccedures: function which returns blob causes crash
|
||||||
#
|
#
|
||||||
|
@ -214,7 +214,9 @@ static SYMBOL symbols[] = {
|
|||||||
{ "GEOMETRYCOLLECTION",SYM(GEOMETRYCOLLECTION)},
|
{ "GEOMETRYCOLLECTION",SYM(GEOMETRYCOLLECTION)},
|
||||||
{ "GET_FORMAT", SYM(GET_FORMAT)},
|
{ "GET_FORMAT", SYM(GET_FORMAT)},
|
||||||
{ "GLOBAL", SYM(GLOBAL_SYM)},
|
{ "GLOBAL", SYM(GLOBAL_SYM)},
|
||||||
|
#ifdef SP_GOTO
|
||||||
{ "GOTO", SYM(GOTO_SYM)},
|
{ "GOTO", SYM(GOTO_SYM)},
|
||||||
|
#endif
|
||||||
{ "GRANT", SYM(GRANT)},
|
{ "GRANT", SYM(GRANT)},
|
||||||
{ "GRANTS", SYM(GRANTS)},
|
{ "GRANTS", SYM(GRANTS)},
|
||||||
{ "GROUP", SYM(GROUP)},
|
{ "GROUP", SYM(GROUP)},
|
||||||
@ -262,7 +264,10 @@ static SYMBOL symbols[] = {
|
|||||||
{ "KEY", SYM(KEY_SYM)},
|
{ "KEY", SYM(KEY_SYM)},
|
||||||
{ "KEYS", SYM(KEYS)},
|
{ "KEYS", SYM(KEYS)},
|
||||||
{ "KILL", SYM(KILL_SYM)},
|
{ "KILL", SYM(KILL_SYM)},
|
||||||
|
#ifdef SP_GOTO
|
||||||
|
/* QQ This will go away when the GOTO label syntax is fixed */
|
||||||
{ "LABEL", SYM(LABEL_SYM)},
|
{ "LABEL", SYM(LABEL_SYM)},
|
||||||
|
#endif
|
||||||
{ "LANGUAGE", SYM(LANGUAGE_SYM)},
|
{ "LANGUAGE", SYM(LANGUAGE_SYM)},
|
||||||
{ "LAST", SYM(LAST_SYM)},
|
{ "LAST", SYM(LAST_SYM)},
|
||||||
{ "LEADING", SYM(LEADING)},
|
{ "LEADING", SYM(LEADING)},
|
||||||
|
@ -2113,6 +2113,7 @@ sp_proc_stmt:
|
|||||||
}
|
}
|
||||||
| LABEL_SYM IDENT
|
| LABEL_SYM IDENT
|
||||||
{
|
{
|
||||||
|
#ifdef SP_GOTO
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
sp_head *sp= lex->sphead;
|
sp_head *sp= lex->sphead;
|
||||||
sp_pcontext *ctx= lex->spcont;
|
sp_pcontext *ctx= lex->spcont;
|
||||||
@ -2130,9 +2131,14 @@ sp_proc_stmt:
|
|||||||
lab->ctx= ctx;
|
lab->ctx= ctx;
|
||||||
sp->backpatch(lab);
|
sp->backpatch(lab);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
yyerror(ER(ER_SYNTAX_ERROR));
|
||||||
|
YYABORT;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
| GOTO_SYM IDENT
|
| GOTO_SYM IDENT
|
||||||
{
|
{
|
||||||
|
#ifdef SP_GOTO
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
sp_head *sp= lex->sphead;
|
sp_head *sp= lex->sphead;
|
||||||
sp_pcontext *ctx= lex->spcont;
|
sp_pcontext *ctx= lex->spcont;
|
||||||
@ -2185,6 +2191,10 @@ sp_proc_stmt:
|
|||||||
i= new sp_instr_jump(ip, ctx, lab->ip); /* Jump back */
|
i= new sp_instr_jump(ip, ctx, lab->ip); /* Jump back */
|
||||||
sp->add_instr(i);
|
sp->add_instr(i);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
yyerror(ER(ER_SYNTAX_ERROR));
|
||||||
|
YYABORT;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
| OPEN_SYM ident
|
| OPEN_SYM ident
|
||||||
{
|
{
|
||||||
@ -7437,7 +7447,6 @@ keyword:
|
|||||||
| INNOBASE_SYM {}
|
| INNOBASE_SYM {}
|
||||||
| INSERT_METHOD {}
|
| INSERT_METHOD {}
|
||||||
| RELAY_THREAD {}
|
| RELAY_THREAD {}
|
||||||
| LABEL_SYM {}
|
|
||||||
| LANGUAGE_SYM {}
|
| LANGUAGE_SYM {}
|
||||||
| LAST_SYM {}
|
| LAST_SYM {}
|
||||||
| LEAVES {}
|
| LEAVES {}
|
||||||
|
Reference in New Issue
Block a user