mirror of
https://github.com/MariaDB/server.git
synced 2025-05-20 13:13:59 +03:00

and BUG#1654: Stored Procedure Crash if contains subquery and set function Disallowed subselects in RETURN (for FUNCTIONs) and SET of local variables. The latter should work, but turned out to be difficult to fix, so we just disallow it for the time being.
385 lines
6.1 KiB
Plaintext
385 lines
6.1 KiB
Plaintext
#
|
|
# Stored PROCEDURE error tests
|
|
#
|
|
|
|
# Make sure we don't have any procedures left.
|
|
delete from mysql.proc;
|
|
|
|
delimiter |;
|
|
|
|
# This should give three syntax errors (sometimes crashed; bug #643)
|
|
# (Unfortunately, this is not a 100% test, on some platforms this
|
|
# passed despite the bug.)
|
|
--error 1064
|
|
create procedure syntaxerror(t int)|
|
|
--error 1064
|
|
create procedure syntaxerror(t int)|
|
|
--error 1064
|
|
create procedure syntaxerror(t int)|
|
|
|
|
# Check that we get the right error, i.e. UDF declaration parses correctly,
|
|
# but foo.so doesn't exist.
|
|
# QQ This generates an error message containing a misleading errno which
|
|
# might vary between systems (it usually doesn't have anything to do with
|
|
# the actual failing dlopen()).
|
|
#--error 1126
|
|
#create function foo returns real soname "foo.so"|
|
|
|
|
create procedure proc1()
|
|
set @x = 42|
|
|
|
|
create function func1() returns int
|
|
return 42|
|
|
|
|
# Can't create recursively
|
|
--error 1285
|
|
create procedure foo()
|
|
create procedure bar() set @x=3|
|
|
--error 1285
|
|
create procedure foo()
|
|
create function bar() returns double return 2.3|
|
|
|
|
# Already exists
|
|
--error 1286
|
|
create procedure proc1()
|
|
set @x = 42|
|
|
--error 1286
|
|
create function func1() returns int
|
|
return 42|
|
|
|
|
drop procedure proc1|
|
|
drop function func1|
|
|
|
|
# Does not exist
|
|
--error 1287
|
|
alter procedure foo|
|
|
--error 1287
|
|
alter function foo|
|
|
--error 1287
|
|
drop procedure foo|
|
|
--error 1287
|
|
drop function foo|
|
|
--error 1287
|
|
call foo()|
|
|
drop procedure if exists foo|
|
|
--error 1287
|
|
show create procedure foo|
|
|
|
|
# LEAVE/ITERATE with no match
|
|
--error 1290
|
|
create procedure foo()
|
|
foo: loop
|
|
leave bar;
|
|
end loop|
|
|
--error 1290
|
|
create procedure foo()
|
|
foo: loop
|
|
iterate bar;
|
|
end loop|
|
|
--error 1290
|
|
create procedure foo()
|
|
foo: begin
|
|
iterate foo;
|
|
end|
|
|
|
|
# Redefining label
|
|
--error 1291
|
|
create procedure foo()
|
|
foo: loop
|
|
foo: loop
|
|
set @x=2;
|
|
end loop foo;
|
|
end loop foo|
|
|
|
|
# End label mismatch
|
|
--error 1292
|
|
create procedure foo()
|
|
foo: loop
|
|
set @x=2;
|
|
end loop bar|
|
|
|
|
# Referring to undef variable
|
|
create procedure foo(out x int)
|
|
begin
|
|
declare y int;
|
|
set x = y;
|
|
end|
|
|
drop procedure foo|
|
|
|
|
# We require INTO in SELECTs for some older clients (as mysql and mysqltest,
|
|
# for now).
|
|
create procedure foo()
|
|
begin
|
|
select name from mysql.proc;
|
|
select type from mysql.proc;
|
|
end|
|
|
--error 1294
|
|
call foo()|
|
|
drop procedure foo|
|
|
|
|
# RETURN in FUNCTION only
|
|
--error 1295
|
|
create procedure foo()
|
|
return 42|
|
|
|
|
# Doesn't allow queries in FUNCTIONs (for now :-( )
|
|
--error 1296
|
|
create function foo() returns int
|
|
begin
|
|
declare x int;
|
|
select max(c) into x from test.t;
|
|
return x;
|
|
end|
|
|
|
|
# Wrong number of arguments
|
|
create procedure p(x int)
|
|
insert into test.t1 values (x)|
|
|
create function f(x int) returns int
|
|
return x+42|
|
|
|
|
--error 1300
|
|
call p()|
|
|
--error 1300
|
|
call p(1, 2)|
|
|
--error 1300
|
|
select f()|
|
|
--error 1300
|
|
select f(1, 2)|
|
|
|
|
drop procedure p|
|
|
drop function f|
|
|
|
|
--error 1301
|
|
create procedure p(val int, out res int)
|
|
begin
|
|
declare x int default 0;
|
|
declare continue handler for foo set x = 1;
|
|
|
|
insert into test.t1 values (val);
|
|
if (x) then
|
|
set res = 0;
|
|
else
|
|
set res = 1;
|
|
end if;
|
|
end|
|
|
|
|
--error 1301
|
|
create procedure p(val int, out res int)
|
|
begin
|
|
declare x int default 0;
|
|
declare foo condition for 1146;
|
|
declare continue handler for bar set x = 1;
|
|
|
|
insert into test.t1 values (val);
|
|
if (x) then
|
|
set res = 0;
|
|
else
|
|
set res = 1;
|
|
end if;
|
|
end|
|
|
|
|
--error 1302
|
|
create function f(val int) returns int
|
|
begin
|
|
declare x int;
|
|
|
|
set x = val+3;
|
|
end|
|
|
|
|
create function f(val int) returns int
|
|
begin
|
|
declare x int;
|
|
|
|
set x = val+3;
|
|
if x < 4 then
|
|
return x;
|
|
end if;
|
|
end|
|
|
|
|
--error 1303
|
|
select f(10)|
|
|
|
|
drop function f|
|
|
|
|
--error 1304
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for insert into test.t1 values ("foo", 42);
|
|
|
|
open c;
|
|
close c;
|
|
end|
|
|
|
|
--error 1305
|
|
create procedure p()
|
|
begin
|
|
declare x int;
|
|
declare c cursor for select * into x from test.t limit 1;
|
|
|
|
open c;
|
|
close c;
|
|
end|
|
|
|
|
--error 1306
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from test.t;
|
|
|
|
open cc;
|
|
close c;
|
|
end|
|
|
|
|
--disable_warnings
|
|
drop table if exists t1|
|
|
--enable_warnings
|
|
create table t1 (val int)|
|
|
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from test.t1;
|
|
|
|
open c;
|
|
open c;
|
|
close c;
|
|
end|
|
|
--error 1307
|
|
call p()|
|
|
drop procedure p|
|
|
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from test.t1;
|
|
|
|
open c;
|
|
close c;
|
|
close c;
|
|
end|
|
|
--error 1308
|
|
call p()|
|
|
drop procedure p|
|
|
|
|
--error 1287
|
|
alter procedure bar3 sql security invoker|
|
|
--error 1059
|
|
alter procedure bar3 name
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|
|
|
|
|
drop table t1|
|
|
|
|
--disable_warnings
|
|
drop table if exists t1|
|
|
--enable_warnings
|
|
create table t1 (val int, x float)|
|
|
insert into t1 values (42, 3.1), (19, 1.2)|
|
|
|
|
--error 1309
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from t1;
|
|
declare x int;
|
|
|
|
open c;
|
|
fetch c into x, y;
|
|
close c;
|
|
end|
|
|
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from t1;
|
|
declare x int;
|
|
|
|
open c;
|
|
fetch c into x;
|
|
close c;
|
|
end|
|
|
--error 1310
|
|
call p()|
|
|
drop procedure p|
|
|
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from t1;
|
|
declare x int;
|
|
declare y float;
|
|
declare z int;
|
|
|
|
open c;
|
|
fetch c into x, y, z;
|
|
close c;
|
|
end|
|
|
--error 1310
|
|
call p()|
|
|
drop procedure p|
|
|
|
|
--error 1312
|
|
create procedure p(in x int, x char(10))
|
|
begin
|
|
end|
|
|
--error 1312
|
|
create function p(x int, x char(10))
|
|
begin
|
|
end|
|
|
|
|
--error 1313
|
|
create procedure p()
|
|
begin
|
|
declare x float;
|
|
declare x int;
|
|
end|
|
|
|
|
--error 1314
|
|
create procedure p()
|
|
begin
|
|
declare c condition for 1064;
|
|
declare c condition for 1065;
|
|
end|
|
|
|
|
--error 1315
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from t1;
|
|
declare c cursor for select field from t1;
|
|
end|
|
|
|
|
#
|
|
# BUG#1965
|
|
#
|
|
create procedure bug1965()
|
|
begin
|
|
declare c cursor for select val from t1 order by valname;
|
|
open c;
|
|
close c;
|
|
end|
|
|
|
|
--error 1054
|
|
call bug1965()|
|
|
drop procedure bug1965|
|
|
|
|
#
|
|
# BUG#1966
|
|
#
|
|
--error 1309
|
|
select 1 into a|
|
|
|
|
#
|
|
# BUG#336
|
|
#
|
|
--error 1317
|
|
create procedure bug336(id char(16))
|
|
begin
|
|
declare x int;
|
|
set x = (select sum(t.data) from test.t2 t);
|
|
end|
|
|
|
|
#
|
|
# BUG#1654
|
|
#
|
|
--error 1296
|
|
create function bug1654()
|
|
returns int
|
|
return (select sum(t.data) from test.t2 t)|
|
|
|
|
drop table t1|
|
|
|
|
delimiter ;|
|