2003-03-05 19:45:17 +01:00
|
|
|
#
|
|
|
|
# Stored PROCEDURE error tests
|
|
|
|
#
|
|
|
|
|
2005-07-05 01:00:23 +02:00
|
|
|
--disable_warnings
|
|
|
|
drop table if exists t1, t2;
|
|
|
|
--enable_warnings
|
|
|
|
|
2003-03-05 19:45:17 +01:00
|
|
|
# Make sure we don't have any procedures left.
|
|
|
|
delete from mysql.proc;
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
2003-06-12 15:31:20 +02:00
|
|
|
# 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)|
|
|
|
|
|
2003-03-05 19:45:17 +01:00
|
|
|
# Check that we get the right error, i.e. UDF declaration parses correctly,
|
|
|
|
# but foo.so doesn't exist.
|
2004-11-03 11:39:38 +01:00
|
|
|
# This generates an error message containing a misleading errno which
|
2003-03-05 19:45:17 +01:00
|
|
|
# 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"|
|
|
|
|
|
2004-06-09 18:50:03 +02:00
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop table if exists t3|
|
|
|
|
--enable_warnings
|
|
|
|
create table t3 ( x int )|
|
|
|
|
insert into t3 values (2), (3)|
|
|
|
|
|
|
|
|
create procedure bad_into(out param int)
|
|
|
|
select x from t3 into param|
|
|
|
|
|
|
|
|
--error 1172
|
|
|
|
call bad_into(@x)|
|
|
|
|
|
|
|
|
drop procedure bad_into|
|
|
|
|
drop table t3|
|
|
|
|
|
|
|
|
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure proc1()
|
|
|
|
set @x = 42|
|
|
|
|
|
|
|
|
create function func1() returns int
|
|
|
|
return 42|
|
|
|
|
|
|
|
|
# Can't create recursively
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1303
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure foo()
|
|
|
|
create procedure bar() set @x=3|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1303
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure foo()
|
|
|
|
create function bar() returns double return 2.3|
|
|
|
|
|
|
|
|
# Already exists
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1304
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure proc1()
|
|
|
|
set @x = 42|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1304
|
2003-03-05 19:45:17 +01:00
|
|
|
create function func1() returns int
|
|
|
|
return 42|
|
|
|
|
|
2003-04-17 13:20:02 +02:00
|
|
|
drop procedure proc1|
|
|
|
|
drop function func1|
|
|
|
|
|
2003-03-05 19:45:17 +01:00
|
|
|
# Does not exist
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1305
|
2003-03-05 19:45:17 +01:00
|
|
|
alter procedure foo|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1305
|
2003-03-05 19:45:17 +01:00
|
|
|
alter function foo|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1305
|
2003-03-05 19:45:17 +01:00
|
|
|
drop procedure foo|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1305
|
2003-03-05 19:45:17 +01:00
|
|
|
drop function foo|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1305
|
2003-03-05 19:45:17 +01:00
|
|
|
call foo()|
|
2003-03-26 12:29:58 +01:00
|
|
|
drop procedure if exists foo|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1305
|
2003-11-20 15:07:22 +01:00
|
|
|
show create procedure foo|
|
2005-01-03 19:53:54 +01:00
|
|
|
--error 1305
|
|
|
|
show create function foo|
|
2003-03-05 19:45:17 +01:00
|
|
|
|
2005-07-01 15:25:51 +02:00
|
|
|
# LEAVE/ITERATE with no match
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1308
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure foo()
|
|
|
|
foo: loop
|
|
|
|
leave bar;
|
|
|
|
end loop|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1308
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure foo()
|
|
|
|
foo: loop
|
|
|
|
iterate bar;
|
|
|
|
end loop|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1308
|
2003-11-13 19:34:56 +01:00
|
|
|
create procedure foo()
|
|
|
|
foo: begin
|
|
|
|
iterate foo;
|
|
|
|
end|
|
2003-03-05 19:45:17 +01:00
|
|
|
|
|
|
|
# Redefining label
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1309
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure foo()
|
|
|
|
foo: loop
|
|
|
|
foo: loop
|
|
|
|
set @x=2;
|
|
|
|
end loop foo;
|
|
|
|
end loop foo|
|
|
|
|
|
|
|
|
# End label mismatch
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1310
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure foo()
|
|
|
|
foo: loop
|
|
|
|
set @x=2;
|
|
|
|
end loop bar|
|
|
|
|
|
|
|
|
# RETURN in FUNCTION only
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1313
|
2003-03-05 19:45:17 +01:00
|
|
|
create procedure foo()
|
|
|
|
return 42|
|
|
|
|
|
2003-04-17 13:20:02 +02:00
|
|
|
# Wrong number of arguments
|
|
|
|
create procedure p(x int)
|
2005-02-08 20:52:50 +01:00
|
|
|
set @x = x|
|
2003-04-17 13:20:02 +02:00
|
|
|
create function f(x int) returns int
|
|
|
|
return x+42|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1318
|
2003-04-17 13:20:02 +02:00
|
|
|
call p()|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1318
|
2003-04-17 13:20:02 +02:00
|
|
|
call p(1, 2)|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1318
|
2003-04-17 13:20:02 +02:00
|
|
|
select f()|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1318
|
2003-04-17 13:20:02 +02:00
|
|
|
select f(1, 2)|
|
|
|
|
|
|
|
|
drop procedure p|
|
|
|
|
drop function f|
|
2003-03-05 19:45:17 +01:00
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1319
|
2003-09-16 14:26:08 +02:00
|
|
|
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|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1319
|
2003-09-16 14:26:08 +02:00
|
|
|
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|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1320
|
2003-10-03 17:38:12 +02:00
|
|
|
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|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1321
|
2003-10-03 17:38:12 +02:00
|
|
|
select f(10)|
|
|
|
|
|
|
|
|
drop function f|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1322
|
2003-10-10 16:57:21 +02:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare c cursor for insert into test.t1 values ("foo", 42);
|
|
|
|
|
|
|
|
open c;
|
|
|
|
close c;
|
|
|
|
end|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1323
|
2003-10-10 16:57:21 +02:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare x int;
|
|
|
|
declare c cursor for select * into x from test.t limit 1;
|
|
|
|
|
|
|
|
open c;
|
|
|
|
close c;
|
|
|
|
end|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1324
|
2003-10-10 16:57:21 +02:00
|
|
|
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|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1325
|
2003-10-10 16:57:21 +02:00
|
|
|
call p()|
|
|
|
|
drop procedure p|
|
|
|
|
|
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare c cursor for select * from test.t1;
|
|
|
|
|
|
|
|
open c;
|
|
|
|
close c;
|
|
|
|
close c;
|
|
|
|
end|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1326
|
2003-10-10 16:57:21 +02:00
|
|
|
call p()|
|
|
|
|
drop procedure p|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1305
|
2003-11-19 11:26:18 +01:00
|
|
|
alter procedure bar3 sql security invoker|
|
2003-11-17 18:21:36 +01:00
|
|
|
|
2003-10-10 16:57:21 +02:00
|
|
|
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)|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1327
|
2003-10-10 16:57:21 +02:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare x int;
|
2004-03-29 11:16:45 +02:00
|
|
|
declare c cursor for select * from t1;
|
2003-10-10 16:57:21 +02:00
|
|
|
|
|
|
|
open c;
|
|
|
|
fetch c into x, y;
|
|
|
|
close c;
|
|
|
|
end|
|
|
|
|
|
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare x int;
|
2004-03-29 11:16:45 +02:00
|
|
|
declare c cursor for select * from t1;
|
2003-10-10 16:57:21 +02:00
|
|
|
|
|
|
|
open c;
|
|
|
|
fetch c into x;
|
|
|
|
close c;
|
|
|
|
end|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1328
|
2003-10-10 16:57:21 +02:00
|
|
|
call p()|
|
|
|
|
drop procedure p|
|
|
|
|
|
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare x int;
|
|
|
|
declare y float;
|
|
|
|
declare z int;
|
2004-03-29 11:16:45 +02:00
|
|
|
declare c cursor for select * from t1;
|
2003-10-10 16:57:21 +02:00
|
|
|
|
|
|
|
open c;
|
|
|
|
fetch c into x, y, z;
|
|
|
|
close c;
|
|
|
|
end|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1328
|
2003-10-10 16:57:21 +02:00
|
|
|
call p()|
|
|
|
|
drop procedure p|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1330
|
2003-11-13 19:34:56 +01:00
|
|
|
create procedure p(in x int, x char(10))
|
|
|
|
begin
|
|
|
|
end|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1330
|
2003-11-13 19:34:56 +01:00
|
|
|
create function p(x int, x char(10))
|
|
|
|
begin
|
|
|
|
end|
|
2003-11-14 13:46:50 +01:00
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1331
|
2003-11-13 19:34:56 +01:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare x float;
|
|
|
|
declare x int;
|
|
|
|
end|
|
2003-11-14 13:46:50 +01:00
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1332
|
2003-11-13 19:34:56 +01:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare c condition for 1064;
|
|
|
|
declare c condition for 1065;
|
|
|
|
end|
|
2003-11-14 13:46:50 +01:00
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1333
|
2003-11-13 19:34:56 +01:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare c cursor for select * from t1;
|
|
|
|
declare c cursor for select field from t1;
|
|
|
|
end|
|
|
|
|
|
2004-03-11 17:18:59 +01:00
|
|
|
# USE is not allowed
|
2005-08-10 08:31:32 +02:00
|
|
|
--error ER_SP_BADSTATEMENT
|
2004-03-11 17:18:59 +01:00
|
|
|
create procedure u()
|
2004-03-29 11:16:45 +02:00
|
|
|
use sptmp|
|
2004-03-11 17:18:59 +01:00
|
|
|
|
2004-03-29 11:16:45 +02:00
|
|
|
# Enforced standard order of declarations
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1337
|
2004-03-29 11:16:45 +02:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare c cursor for select * from t1;
|
|
|
|
declare x int;
|
|
|
|
end|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1337
|
2004-03-29 11:16:45 +02:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare x int;
|
|
|
|
declare continue handler for sqlstate '42S99' set x = 1;
|
|
|
|
declare foo condition for sqlstate '42S99';
|
|
|
|
end|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1338
|
2004-03-29 11:16:45 +02:00
|
|
|
create procedure p()
|
|
|
|
begin
|
|
|
|
declare x int;
|
|
|
|
declare continue handler for sqlstate '42S99' set x = 1;
|
|
|
|
declare c cursor for select * from t1;
|
|
|
|
end|
|
2004-03-11 17:18:59 +01:00
|
|
|
|
2005-04-14 14:52:35 +02:00
|
|
|
# Check in and inout arguments.
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists p|
|
|
|
|
--enable_warnings
|
|
|
|
create procedure p(in x int, inout y int, out z int)
|
|
|
|
begin
|
|
|
|
set y = x+y;
|
|
|
|
set z = x+y;
|
|
|
|
end|
|
|
|
|
|
|
|
|
set @tmp_x = 42|
|
|
|
|
set @tmp_y = 3|
|
|
|
|
set @tmp_z = 0|
|
|
|
|
# For reference: this is ok
|
|
|
|
call p(@tmp_x, @tmp_y, @tmp_z)|
|
|
|
|
select @tmp_x, @tmp_y, @tmp_z|
|
|
|
|
|
|
|
|
--error ER_SP_NOT_VAR_ARG
|
|
|
|
call p(42, 43, @tmp_z)|
|
|
|
|
--error ER_SP_NOT_VAR_ARG
|
|
|
|
call p(42, @tmp_y, 43)|
|
|
|
|
|
|
|
|
drop procedure p|
|
|
|
|
|
|
|
|
|
2005-07-13 11:48:13 +02:00
|
|
|
#
|
|
|
|
# Let us test that we can access mysql.proc table for routines
|
|
|
|
# definitions lookup without locking it explicitly.
|
|
|
|
#
|
|
|
|
create procedure p() begin end|
|
|
|
|
lock table t1 read|
|
|
|
|
# This should succeed
|
|
|
|
call p()|
|
|
|
|
unlock tables|
|
|
|
|
drop procedure p|
|
|
|
|
# Let us check restrictions which this ability puts on mysql.proc locking.
|
|
|
|
--error ER_WRONG_LOCK_OF_SYSTEM_TABLE
|
|
|
|
lock tables t1 read, mysql.proc write|
|
|
|
|
--error ER_WRONG_LOCK_OF_SYSTEM_TABLE
|
|
|
|
lock tables mysql.proc write, mysql.user write|
|
|
|
|
# Locking for read should be OK
|
|
|
|
lock tables t1 read, mysql.proc read|
|
|
|
|
unlock tables|
|
|
|
|
# You also should be able lock only mysql.proc for write
|
|
|
|
lock tables mysql.proc write|
|
|
|
|
unlock tables|
|
|
|
|
|
|
|
|
|
2005-08-18 17:07:23 +02:00
|
|
|
#
|
|
|
|
# Check that in functions we don't allow to update tables which
|
|
|
|
# are used by statements which invoke these functions.
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists f1|
|
|
|
|
--enable_warnings
|
|
|
|
create function f1(i int) returns int
|
|
|
|
begin
|
|
|
|
insert into t1 (val) values (i);
|
|
|
|
return 0;
|
|
|
|
end|
|
|
|
|
--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
|
|
|
|
select val, f1(val) from t1|
|
|
|
|
# Table alias should not matter
|
|
|
|
--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
|
|
|
|
select val, f1(val) from t1 as tab|
|
|
|
|
select * from t1|
|
|
|
|
--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
|
|
|
|
update t1 set val= f1(val)|
|
|
|
|
select * from t1|
|
|
|
|
# But this should be OK
|
|
|
|
select f1(17)|
|
|
|
|
select * from t1|
|
|
|
|
# Cleanup
|
|
|
|
delete from t1 where val= 17|
|
|
|
|
drop function f1|
|
|
|
|
|
|
|
|
|
2003-11-27 16:48:21 +01:00
|
|
|
#
|
|
|
|
# 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
|
|
|
|
#
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1327
|
2003-11-27 16:48:21 +01:00
|
|
|
select 1 into a|
|
|
|
|
|
2003-12-13 16:40:52 +01:00
|
|
|
#
|
|
|
|
# BUG#1653
|
|
|
|
#
|
|
|
|
--disable_warnings
|
2004-04-05 17:01:19 +02:00
|
|
|
drop table if exists t3|
|
2003-12-13 16:40:52 +01:00
|
|
|
--enable_warnings
|
|
|
|
create table t3 (column_1_0 int)|
|
|
|
|
|
|
|
|
create procedure bug1653()
|
|
|
|
update t3 set column_1 = 0|
|
|
|
|
|
|
|
|
--error 1054
|
|
|
|
call bug1653()|
|
|
|
|
drop table t3|
|
|
|
|
create table t3 (column_1 int)|
|
|
|
|
call bug1653()|
|
|
|
|
|
|
|
|
drop procedure bug1653|
|
|
|
|
drop table t3|
|
|
|
|
|
2004-01-08 10:37:31 +01:00
|
|
|
#
|
|
|
|
# BUG#2259
|
|
|
|
#
|
|
|
|
# Note: When this bug existed, it did not necessarily cause a crash
|
|
|
|
# in all builds, but valgrind did give warnings.
|
|
|
|
create procedure bug2259()
|
|
|
|
begin
|
|
|
|
declare v1 int;
|
2005-02-08 20:52:50 +01:00
|
|
|
declare c1 cursor for select s1 from t1;
|
2004-01-08 10:37:31 +01:00
|
|
|
|
|
|
|
fetch c1 into v1;
|
|
|
|
end|
|
|
|
|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1326
|
2004-01-08 10:37:31 +01:00
|
|
|
call bug2259()|
|
|
|
|
drop procedure bug2259|
|
|
|
|
|
2004-01-08 09:27:29 +01:00
|
|
|
#
|
|
|
|
# BUG#2272
|
|
|
|
#
|
|
|
|
create procedure bug2272()
|
|
|
|
begin
|
|
|
|
declare v int;
|
|
|
|
|
|
|
|
update t1 set v = 42;
|
|
|
|
end|
|
|
|
|
|
|
|
|
insert into t1 values (666, 51.3)|
|
|
|
|
--error 1054
|
|
|
|
call bug2272()|
|
|
|
|
delete from t1|
|
2004-01-08 10:37:31 +01:00
|
|
|
drop procedure bug2272|
|
2003-12-13 16:40:52 +01:00
|
|
|
|
2004-01-14 12:47:03 +01:00
|
|
|
#
|
|
|
|
# BUG#2329
|
|
|
|
#
|
|
|
|
create procedure bug2329_1()
|
|
|
|
begin
|
|
|
|
declare v int;
|
|
|
|
|
|
|
|
insert into t1 (v) values (5);
|
|
|
|
end|
|
|
|
|
|
|
|
|
create procedure bug2329_2()
|
|
|
|
begin
|
|
|
|
declare v int;
|
|
|
|
|
|
|
|
replace t1 set v = 5;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error 1054
|
|
|
|
call bug2329_1()|
|
|
|
|
--error 1054
|
|
|
|
call bug2329_2()|
|
|
|
|
drop procedure bug2329_1|
|
|
|
|
drop procedure bug2329_2|
|
|
|
|
|
2004-03-29 12:29:06 +02:00
|
|
|
#
|
|
|
|
# BUG#3287
|
|
|
|
#
|
|
|
|
create function bug3287() returns int
|
|
|
|
begin
|
|
|
|
declare v int default null;
|
|
|
|
|
|
|
|
case
|
|
|
|
when v is not null then return 1;
|
|
|
|
end case;
|
|
|
|
return 2;
|
|
|
|
end|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1339
|
2004-03-29 12:29:06 +02:00
|
|
|
select bug3287()|
|
|
|
|
drop function bug3287|
|
|
|
|
|
|
|
|
create procedure bug3287(x int)
|
|
|
|
case x
|
|
|
|
when 0 then
|
|
|
|
insert into test.t1 values (x, 0.1);
|
|
|
|
when 1 then
|
|
|
|
insert into test.t1 values (x, 1.1);
|
|
|
|
end case|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1339
|
2004-03-29 12:29:06 +02:00
|
|
|
call bug3287(2)|
|
|
|
|
drop procedure bug3287|
|
|
|
|
|
2004-04-05 17:01:19 +02:00
|
|
|
#
|
|
|
|
# BUG#3297
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop table if exists t3|
|
|
|
|
--enable_warnings
|
|
|
|
create table t3 (s1 int, primary key (s1))|
|
|
|
|
insert into t3 values (5),(6)|
|
|
|
|
|
|
|
|
create procedure bug3279(out y int)
|
|
|
|
begin
|
|
|
|
declare x int default 0;
|
|
|
|
begin
|
|
|
|
declare exit handler for sqlexception set x = x+1;
|
|
|
|
insert into t3 values (5);
|
|
|
|
end;
|
|
|
|
if x < 2 then
|
|
|
|
set x = x+1;
|
|
|
|
insert into t3 values (6);
|
|
|
|
end if;
|
|
|
|
set y = x;
|
|
|
|
end|
|
|
|
|
|
|
|
|
set @x = 0|
|
|
|
|
--error 1062
|
|
|
|
call bug3279(@x)|
|
|
|
|
select @x|
|
|
|
|
drop procedure bug3279|
|
|
|
|
drop table t3|
|
|
|
|
|
2004-06-15 15:42:28 +02:00
|
|
|
#
|
|
|
|
# BUG#3339
|
|
|
|
#
|
|
|
|
--error 1049
|
|
|
|
create procedure nodb.bug3339() begin end|
|
|
|
|
|
2004-07-21 14:53:09 +02:00
|
|
|
#
|
|
|
|
# BUG#2653
|
|
|
|
#
|
|
|
|
create procedure bug2653_1(a int, out b int)
|
|
|
|
set b = aa|
|
|
|
|
|
|
|
|
create procedure bug2653_2(a int, out b int)
|
|
|
|
begin
|
|
|
|
if aa < 0 then
|
|
|
|
set b = - a;
|
|
|
|
else
|
|
|
|
set b = a;
|
|
|
|
end if;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error 1054
|
|
|
|
call bug2653_1(1, @b)|
|
|
|
|
--error 1054
|
|
|
|
call bug2653_2(2, @b)|
|
|
|
|
|
|
|
|
drop procedure bug2653_1|
|
|
|
|
drop procedure bug2653_2|
|
2004-06-15 15:42:28 +02:00
|
|
|
|
2004-07-29 17:33:45 +02:00
|
|
|
#
|
|
|
|
# BUG#4344
|
|
|
|
#
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1357
|
2004-07-29 17:33:45 +02:00
|
|
|
create procedure bug4344() drop procedure bug4344|
|
2004-09-09 05:59:26 +02:00
|
|
|
--error 1357
|
2004-07-29 17:33:45 +02:00
|
|
|
create procedure bug4344() drop function bug4344|
|
|
|
|
|
2004-09-10 11:11:52 +02:00
|
|
|
#
|
|
|
|
# BUG#3294: Stored procedure crash if table dropped before use
|
|
|
|
# (Actually, when an error occurs within an error handler.)
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug3294|
|
|
|
|
--enable_warnings
|
|
|
|
create procedure bug3294()
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlexception drop table t5;
|
|
|
|
drop table t5;
|
2005-02-08 20:52:50 +01:00
|
|
|
drop table t5;
|
2004-09-10 11:11:52 +02:00
|
|
|
end|
|
|
|
|
|
2005-02-08 20:52:50 +01:00
|
|
|
create table t5 (x int)|
|
2004-09-10 11:11:52 +02:00
|
|
|
--error 1051
|
|
|
|
call bug3294()|
|
|
|
|
drop procedure bug3294|
|
|
|
|
|
2004-11-25 16:13:06 +01:00
|
|
|
#
|
|
|
|
# BUG#6807: Stored procedure crash if CREATE PROCEDURE ... KILL QUERY
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug6807|
|
|
|
|
--enable_warnings
|
|
|
|
create procedure bug6807()
|
|
|
|
begin
|
|
|
|
declare id int;
|
|
|
|
|
|
|
|
set id = connection_id();
|
|
|
|
kill query id;
|
|
|
|
select 'Not reached';
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error 1317
|
|
|
|
call bug6807()|
|
|
|
|
--error 1317
|
|
|
|
call bug6807()|
|
|
|
|
|
|
|
|
drop procedure bug6807|
|
|
|
|
|
2005-02-28 18:07:06 +01:00
|
|
|
#
|
|
|
|
# BUG#876: Stored Procedures: Invalid SQLSTATE is allowed in
|
|
|
|
# a DECLARE ? HANDLER FOR stmt.
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug8776_1|
|
|
|
|
drop procedure if exists bug8776_2|
|
|
|
|
drop procedure if exists bug8776_3|
|
|
|
|
drop procedure if exists bug8776_4|
|
|
|
|
--enable_warnings
|
|
|
|
--error ER_SP_BAD_SQLSTATE
|
|
|
|
create procedure bug8776_1()
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlstate '42S0200test' begin end;
|
|
|
|
begin end;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error ER_SP_BAD_SQLSTATE
|
|
|
|
create procedure bug8776_2()
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlstate '4200' begin end;
|
|
|
|
begin end;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error ER_SP_BAD_SQLSTATE
|
|
|
|
create procedure bug8776_3()
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlstate '420000' begin end;
|
|
|
|
begin end;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error ER_SP_BAD_SQLSTATE
|
|
|
|
create procedure bug8776_4()
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlstate '42x00' begin end;
|
|
|
|
begin end;
|
|
|
|
end|
|
|
|
|
|
2004-07-29 17:33:45 +02:00
|
|
|
|
2005-03-30 17:43:52 +02:00
|
|
|
#
|
|
|
|
# BUG#6600: Stored procedure crash after repeated calls with check table
|
|
|
|
#
|
|
|
|
--error ER_SP_BADSTATEMENT
|
|
|
|
create procedure bug6600()
|
|
|
|
check table t1|
|
|
|
|
|
|
|
|
# Check these two as well, while we're at it. (Although it isn't really
|
|
|
|
# related to the bug report, but to the fix.)
|
|
|
|
--error ER_SP_BADSTATEMENT
|
|
|
|
create procedure bug6600()
|
|
|
|
lock table t1 read|
|
|
|
|
--error ER_SP_BADSTATEMENT
|
|
|
|
create procedure bug6600()
|
|
|
|
unlock table t1|
|
|
|
|
|
2005-04-07 09:57:47 +02:00
|
|
|
#
|
|
|
|
# BUG#9566: explicit LOCK TABLE and store procedures result in illegal state
|
|
|
|
#
|
|
|
|
# We should not think that mysql.proc table does not exist if we are unable
|
2005-07-13 11:48:13 +02:00
|
|
|
# to open it under LOCK TABLE or in prelocked mode.
|
2005-04-07 09:57:47 +02:00
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug9566|
|
|
|
|
--enable_warnings
|
|
|
|
create procedure bug9566()
|
|
|
|
begin
|
|
|
|
select * from t1;
|
|
|
|
end|
|
|
|
|
lock table t1 read|
|
2005-07-13 11:48:13 +02:00
|
|
|
# This should fail since we forgot to lock mysql.proc for writing
|
|
|
|
# explicitly, and we can't open mysql.proc for _writing_ if there
|
|
|
|
# are locked tables.
|
2005-04-07 09:57:47 +02:00
|
|
|
--error 1100
|
2005-07-13 11:48:13 +02:00
|
|
|
alter procedure bug9566 comment 'Some comment'|
|
2005-04-07 09:57:47 +02:00
|
|
|
unlock tables|
|
|
|
|
# This should succeed
|
|
|
|
drop procedure bug9566|
|
|
|
|
|
2005-03-30 17:43:52 +02:00
|
|
|
|
2005-04-08 16:05:16 +02:00
|
|
|
#
|
|
|
|
# BUG#7299: Stored procedures: exception handler catches not-found conditions
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug7299|
|
|
|
|
--enable_warnings
|
|
|
|
create procedure bug7299()
|
|
|
|
begin
|
|
|
|
declare v int;
|
|
|
|
declare c cursor for select val from t1;
|
|
|
|
declare exit handler for sqlexception select 'Error!';
|
|
|
|
|
|
|
|
open c;
|
|
|
|
fetch c into v;
|
|
|
|
end|
|
|
|
|
|
|
|
|
delete from t1|
|
|
|
|
--error ER_SP_FETCH_NO_DATA
|
|
|
|
call bug7299()|
|
|
|
|
drop procedure bug7299|
|
|
|
|
|
|
|
|
|
2005-04-08 19:58:04 +02:00
|
|
|
#
|
|
|
|
# BUG#9073: Able to declare two handlers for same condition in same scope
|
|
|
|
#
|
|
|
|
--error ER_SP_DUP_HANDLER
|
|
|
|
create procedure bug9073()
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlexception select 1;
|
|
|
|
declare continue handler for sqlexception select 2;
|
|
|
|
end|
|
|
|
|
--error ER_SP_DUP_HANDLER
|
|
|
|
create procedure bug9073()
|
|
|
|
begin
|
|
|
|
declare condname1 condition for 1234;
|
|
|
|
declare continue handler for condname1 select 1;
|
|
|
|
declare exit handler for condname1 select 2;
|
|
|
|
end|
|
|
|
|
--error ER_SP_DUP_HANDLER
|
|
|
|
create procedure bug9073()
|
|
|
|
begin
|
|
|
|
declare condname1 condition for sqlstate '42000';
|
|
|
|
declare condname2 condition for sqlstate '42000';
|
|
|
|
declare exit handler for condname1 select 1;
|
|
|
|
declare continue handler for condname2 select 2;
|
|
|
|
end|
|
|
|
|
--error ER_SP_DUP_HANDLER
|
|
|
|
create procedure bug9073()
|
|
|
|
begin
|
|
|
|
declare condname1 condition for sqlstate '42000';
|
|
|
|
declare exit handler for condname1 select 1;
|
|
|
|
declare exit handler for sqlstate '42000' select 2;
|
|
|
|
end|
|
|
|
|
|
|
|
|
# This should still work.
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug9073|
|
|
|
|
--enable_warnings
|
|
|
|
create procedure bug9073()
|
|
|
|
begin
|
|
|
|
declare condname1 condition for sqlstate '42000';
|
|
|
|
declare continue handler for condname1 select 1;
|
|
|
|
begin
|
|
|
|
declare exit handler for sqlstate '42000' select 2;
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlstate '42000' select 3;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end|
|
|
|
|
drop procedure bug9073|
|
|
|
|
|
|
|
|
|
2005-04-20 17:59:28 +02:00
|
|
|
#
|
|
|
|
# BUG#7047: Stored procedure crash if alter procedure
|
|
|
|
#
|
|
|
|
--error ER_SP_NO_DROP_SP
|
|
|
|
create procedure bug7047()
|
|
|
|
alter procedure bug7047|
|
|
|
|
--error ER_SP_NO_DROP_SP
|
|
|
|
create function bug7047() returns int
|
|
|
|
begin
|
|
|
|
alter function bug7047;
|
|
|
|
return 0;
|
|
|
|
end|
|
|
|
|
|
|
|
|
|
2005-04-26 17:31:59 +02:00
|
|
|
#
|
|
|
|
# BUG#8408: Stored procedure crash if function contains SHOW
|
|
|
|
# BUG#9058: Stored Procedures: Crash if function included SELECT
|
|
|
|
#
|
|
|
|
|
|
|
|
# Some things are caught when parsing
|
2005-08-15 17:15:12 +02:00
|
|
|
--error ER_SP_NO_RETSET
|
2005-04-26 17:31:59 +02:00
|
|
|
create function bug8408() returns int
|
|
|
|
begin
|
|
|
|
select * from t1;
|
|
|
|
return 0;
|
|
|
|
end|
|
2005-08-15 17:15:12 +02:00
|
|
|
--error ER_SP_NO_RETSET
|
2005-04-26 17:31:59 +02:00
|
|
|
create function bug8408() returns int
|
|
|
|
begin
|
|
|
|
show warnings;
|
|
|
|
return 0;
|
|
|
|
end|
|
2005-08-15 17:15:12 +02:00
|
|
|
--error ER_SP_NO_RETSET
|
2005-04-26 17:31:59 +02:00
|
|
|
create function bug8408(a int) returns int
|
|
|
|
begin
|
|
|
|
declare b int;
|
|
|
|
select b;
|
|
|
|
return b;
|
|
|
|
end|
|
|
|
|
|
2005-04-27 16:35:49 +02:00
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug8408_f|
|
|
|
|
drop procedure if exists bug8408_p|
|
|
|
|
--enable_warnings
|
|
|
|
|
2005-04-26 17:31:59 +02:00
|
|
|
# Some things must be caught at invokation time
|
2005-04-27 16:35:49 +02:00
|
|
|
create function bug8408_f() returns int
|
2005-04-26 17:31:59 +02:00
|
|
|
begin
|
2005-04-27 16:35:49 +02:00
|
|
|
call bug8408_p();
|
2005-04-26 17:31:59 +02:00
|
|
|
return 0;
|
|
|
|
end|
|
2005-04-27 16:35:49 +02:00
|
|
|
create procedure bug8408_p()
|
2005-04-26 17:31:59 +02:00
|
|
|
select * from t1|
|
|
|
|
|
2005-04-27 16:35:49 +02:00
|
|
|
call bug8408_p()|
|
Implement WL#2661 "Prepared Statements: Dynamic SQL in Stored Procedures".
The idea of the patch is to separate statement processing logic,
such as parsing, validation of the parsed tree, execution and cleanup,
from global query processing logic, such as logging, resetting
priorities of a thread, resetting stored procedure cache, resetting
thread count of errors and warnings.
This makes PREPARE and EXECUTE behave similarly to the rest of SQL
statements and allows their use in stored procedures.
This patch contains a change in behaviour:
until recently for each SQL prepared statement command, 2 queries
were written to the general log, e.g.
[Query] prepare stmt from @stmt_text;
[Prepare] select * from t1 <-- contents of @stmt_text
The chagne was necessary to prevent [Prepare] commands from being written
to the general log when executing a stored procedure with Dynamic SQL.
We should consider whether the old behavior is preferrable and probably
restore it.
This patch refixes Bug#7115, Bug#10975 (partially), Bug#10605 (various bugs
in Dynamic SQL reported before it was disabled).
2005-09-03 01:13:18 +02:00
|
|
|
--error ER_SP_NO_RETSET
|
2005-04-27 16:35:49 +02:00
|
|
|
select bug8408_f()|
|
2005-04-26 17:31:59 +02:00
|
|
|
|
2005-04-27 16:35:49 +02:00
|
|
|
drop procedure bug8408_p|
|
|
|
|
drop function bug8408_f|
|
2005-04-26 17:31:59 +02:00
|
|
|
|
|
|
|
# But this is ok
|
|
|
|
create function bug8408() returns int
|
|
|
|
begin
|
|
|
|
declare n int default 0;
|
|
|
|
select count(*) into n from t1;
|
|
|
|
return n;
|
|
|
|
end|
|
|
|
|
|
|
|
|
insert into t1 value (2, 2.7), (3, 3.14), (7, 7.0)|
|
|
|
|
select *,bug8408() from t1|
|
|
|
|
|
|
|
|
drop function bug8408|
|
|
|
|
delete from t1|
|
|
|
|
|
|
|
|
|
2005-05-20 17:47:08 +02:00
|
|
|
#
|
|
|
|
# BUG#10537: Server crashes while loading data file into table through
|
|
|
|
# procedure.
|
|
|
|
# Disable load until it's PS and SP safe
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug10537|
|
|
|
|
--enable_warnings
|
|
|
|
--error ER_SP_BADSTATEMENT
|
|
|
|
create procedure bug10537()
|
|
|
|
load data local infile '/tmp/somefile' into table t1|
|
|
|
|
|
|
|
|
|
2005-05-27 16:19:25 +02:00
|
|
|
#
|
|
|
|
# BUG#8409: Stored procedure crash if function contains FLUSH
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug8409|
|
|
|
|
--enable_warnings
|
2005-08-10 08:31:32 +02:00
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
2005-05-27 16:19:25 +02:00
|
|
|
create function bug8409()
|
|
|
|
returns int
|
|
|
|
begin
|
|
|
|
flush tables;
|
|
|
|
return 5;
|
|
|
|
end|
|
|
|
|
|
|
|
|
|
2005-05-31 18:36:32 +02:00
|
|
|
#
|
|
|
|
# BUG#9529: Stored Procedures: No Warning on truncation of procedure name
|
|
|
|
# during creation.
|
2005-07-08 16:33:15 +02:00
|
|
|
# Note: When using utf8 for mysql.proc, this limit is much higher than before
|
2005-05-31 18:36:32 +02:00
|
|
|
--error ER_TOO_LONG_IDENT
|
2005-07-08 16:33:15 +02:00
|
|
|
create procedure bug9529_90123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123()
|
2005-05-31 18:36:32 +02:00
|
|
|
begin
|
|
|
|
end|
|
|
|
|
|
|
|
|
|
2005-06-01 15:42:40 +02:00
|
|
|
#
|
|
|
|
# BUG#10969: Stored procedures: crash if default() function
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug10969|
|
|
|
|
--enable_warnings
|
|
|
|
--error ER_WRONG_COLUMN_NAME
|
|
|
|
create procedure bug10969()
|
|
|
|
begin
|
|
|
|
declare s1 int default 0;
|
|
|
|
select default(s1) from t30;
|
|
|
|
end|
|
|
|
|
|
|
|
|
# This should work
|
|
|
|
create procedure bug10969()
|
|
|
|
begin
|
|
|
|
declare s1 int default 0;
|
|
|
|
select default(t30.s1) from t30;
|
|
|
|
end|
|
|
|
|
|
|
|
|
drop procedure bug10969|
|
|
|
|
|
|
|
|
|
2003-10-10 16:57:21 +02:00
|
|
|
drop table t1|
|
|
|
|
|
2003-03-05 19:45:17 +01:00
|
|
|
delimiter ;|
|
2005-06-08 23:46:30 +02:00
|
|
|
|
2005-07-05 01:00:23 +02:00
|
|
|
# BUG#9814: Closing a cursor that is not open
|
|
|
|
create table t1(f1 int);
|
|
|
|
create table t2(f1 int);
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
CREATE PROCEDURE SP001()
|
|
|
|
P1: BEGIN
|
|
|
|
DECLARE ENDTABLE INT DEFAULT 0;
|
|
|
|
DECLARE TEMP_NUM INT;
|
|
|
|
DECLARE TEMP_SUM INT;
|
|
|
|
DECLARE C1 CURSOR FOR SELECT F1 FROM t1;
|
|
|
|
DECLARE C2 CURSOR FOR SELECT F1 FROM t2;
|
|
|
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ENDTABLE = 1;
|
|
|
|
|
|
|
|
SET ENDTABLE=0;
|
|
|
|
SET TEMP_SUM=0;
|
|
|
|
SET TEMP_NUM=0;
|
|
|
|
|
|
|
|
OPEN C1;
|
|
|
|
|
|
|
|
FETCH C1 INTO TEMP_NUM;
|
|
|
|
WHILE ENDTABLE = 0 DO
|
|
|
|
SET TEMP_SUM=TEMP_NUM+TEMP_SUM;
|
|
|
|
FETCH C1 INTO TEMP_NUM;
|
|
|
|
END WHILE;
|
|
|
|
SELECT TEMP_SUM;
|
|
|
|
CLOSE C1;
|
|
|
|
CLOSE C1;
|
|
|
|
SELECT 'end of proc';
|
|
|
|
END P1|
|
|
|
|
delimiter ;|
|
|
|
|
call SP001();
|
|
|
|
drop procedure SP001;
|
|
|
|
drop table t1, t2;
|
2005-07-06 08:21:27 +02:00
|
|
|
|
2005-07-01 11:01:46 +02:00
|
|
|
# Bug #11394 "Recursion in SP crash server" and bug #11600 "Stored
|
|
|
|
# procedures: crash with function calling itself".
|
|
|
|
# We have to disable recursion since in many cases LEX and many
|
|
|
|
# Item's can't be used in reentrant way nowdays.
|
|
|
|
delimiter |;
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug11394|
|
|
|
|
drop function if exists bug11394_1|
|
|
|
|
drop function if exists bug11394_2|
|
|
|
|
drop procedure if exists bug11394|
|
|
|
|
--enable_warnings
|
|
|
|
create function bug11394(i int) returns int
|
|
|
|
begin
|
|
|
|
if i <= 0 then
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return (i in (100, 200, bug11394(i-1), 400));
|
|
|
|
end if;
|
|
|
|
end|
|
|
|
|
# If we allow recursive functions without additional modifications
|
|
|
|
# this will crash server since Item for "IN" is not reenterable.
|
2005-07-06 09:34:53 +02:00
|
|
|
--error 1424
|
2005-07-01 11:01:46 +02:00
|
|
|
select bug11394(2)|
|
|
|
|
drop function bug11394|
|
|
|
|
create function bug11394_1(i int) returns int
|
|
|
|
begin
|
|
|
|
if i <= 0 then
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return (select bug11394_1(i-1));
|
|
|
|
end if;
|
|
|
|
end|
|
|
|
|
# The following statement will crash because some LEX members responsible
|
|
|
|
# for selects cannot be used in reentrant fashion.
|
2005-07-06 09:34:53 +02:00
|
|
|
--error 1424
|
2005-07-01 11:01:46 +02:00
|
|
|
select bug11394_1(2)|
|
|
|
|
drop function bug11394_1|
|
|
|
|
# Note that the following should be allowed since it does not contains
|
|
|
|
# recursion
|
|
|
|
create function bug11394_2(i int) returns int return i|
|
|
|
|
select bug11394_2(bug11394_2(10))|
|
|
|
|
drop function bug11394_2|
|
|
|
|
create procedure bug11394(i int, j int)
|
|
|
|
begin
|
|
|
|
if i > 0 then
|
|
|
|
call bug11394(i - 1,(select 1));
|
|
|
|
end if;
|
|
|
|
end|
|
|
|
|
# Again if we allow recursion for stored procedures (without
|
|
|
|
# additional efforts) the following statement will crash the server.
|
2005-07-06 09:34:53 +02:00
|
|
|
--error 1424
|
2005-07-01 11:01:46 +02:00
|
|
|
call bug11394(2, 1)|
|
|
|
|
drop procedure bug11394|
|
2005-07-09 21:11:17 +02:00
|
|
|
delimiter ;|
|
2005-07-09 20:04:18 +02:00
|
|
|
|
2005-08-29 12:19:08 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# BUG 12490 (Packets out of order if calling HELP CONTENTS from Stored Procedure)
|
|
|
|
#
|
|
|
|
--error 1314
|
|
|
|
CREATE PROCEDURE BUG_12490() HELP CONTENTS;
|
|
|
|
--error 1314
|
|
|
|
CREATE FUNCTION BUG_12490() RETURNS INT HELP CONTENTS;
|
|
|
|
CREATE TABLE t_bug_12490(a int);
|
|
|
|
--error 1314
|
|
|
|
CREATE TRIGGER BUG_12490 BEFORE UPDATE ON t_bug_12490 FOR EACH ROW HELP CONTENTS;
|
|
|
|
DROP TABLE t_bug_12490;
|
|
|
|
|
2005-07-09 19:51:59 +02:00
|
|
|
#
|
|
|
|
# Bug#11834 "Re-execution of prepared statement with dropped function
|
|
|
|
# crashes server". Also tests handling of prepared stmts which use
|
|
|
|
# stored functions but does not require prelocking.
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug11834_1;
|
|
|
|
drop function if exists bug11834_2;
|
|
|
|
--enable_warnings
|
|
|
|
create function bug11834_1() returns int return 10;
|
|
|
|
create function bug11834_2() returns int return bug11834_1();
|
|
|
|
prepare stmt from "select bug11834_2()";
|
|
|
|
execute stmt;
|
|
|
|
# Re-execution of statement should not crash server.
|
|
|
|
execute stmt;
|
|
|
|
drop function bug11834_1;
|
|
|
|
# Attempt to execute statement should return proper error and
|
|
|
|
# should not crash server.
|
|
|
|
--error ER_SP_DOES_NOT_EXIST
|
|
|
|
execute stmt;
|
|
|
|
deallocate prepare stmt;
|
|
|
|
drop function bug11834_2;
|
2005-09-06 19:43:06 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# Bug#12953 "Stored procedures: crash if OPTIMIZE TABLE in function"
|
|
|
|
#
|
|
|
|
delimiter |;
|
|
|
|
--disable_warnings
|
|
|
|
DROP FUNCTION IF EXISTS bug12953|
|
|
|
|
--enable_warnings
|
|
|
|
--error ER_SP_BADSTATEMENT
|
|
|
|
CREATE FUNCTION bug12953() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
OPTIMIZE TABLE t1;
|
|
|
|
RETURN 1;
|
|
|
|
END|
|
2005-09-07 21:03:56 +02:00
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
#
|
|
|
|
# Bug##12995 "Inside function "Table 't4' was not locked with LOCK TABLES"
|
|
|
|
#
|
|
|
|
delimiter |;
|
|
|
|
--disable_warnings
|
|
|
|
DROP FUNCTION IF EXISTS bug12995|
|
|
|
|
--enable_warnings
|
|
|
|
--error ER_SP_BADSTATEMENT
|
|
|
|
CREATE FUNCTION bug12995() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
HANDLER t1 OPEN;
|
|
|
|
RETURN 1;
|
|
|
|
END|
|
|
|
|
--error ER_SP_BADSTATEMENT
|
|
|
|
CREATE FUNCTION bug12995() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
HANDLER t1 READ FIRST;
|
|
|
|
RETURN 1;
|
|
|
|
END|
|
|
|
|
--error ER_SP_BADSTATEMENT
|
|
|
|
CREATE FUNCTION bug12995() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
HANDLER t1 CLOSE;
|
|
|
|
RETURN 1;
|
|
|
|
END|
|
|
|
|
--error 1305
|
|
|
|
SELECT bug12995()|
|
|
|
|
delimiter ;|
|
2005-09-06 19:43:06 +02:00
|
|
|
|
2005-09-13 17:16:12 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# BUG#12712: SET AUTOCOMMIT should fail within SP/functions/triggers
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug12712;
|
|
|
|
drop function if exists bug12712;
|
|
|
|
--enable_warnings
|
|
|
|
# Can...
|
|
|
|
create procedure bug12712()
|
|
|
|
set session autocommit = 0;
|
|
|
|
|
|
|
|
select @@autocommit;
|
|
|
|
set @au = @@autocommit;
|
|
|
|
call bug12712();
|
|
|
|
select @@autocommit;
|
|
|
|
set session autocommit = @au;
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
create function bug12712()
|
|
|
|
returns int
|
|
|
|
begin
|
|
|
|
call bug12712();
|
|
|
|
return 0;
|
|
|
|
end|
|
|
|
|
|
|
|
|
# Can't...
|
|
|
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
|
|
|
set @x = bug12712()|
|
|
|
|
drop procedure bug12712|
|
|
|
|
drop function bug12712|
|
|
|
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
|
|
|
create function bug12712()
|
|
|
|
returns int
|
|
|
|
begin
|
|
|
|
set session autocommit = 0;
|
|
|
|
return 0;
|
|
|
|
end|
|
|
|
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
|
|
|
create function bug12712()
|
|
|
|
returns int
|
|
|
|
begin
|
|
|
|
set @@autocommit = 0;
|
|
|
|
return 0;
|
|
|
|
end|
|
|
|
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
|
|
|
create function bug12712()
|
|
|
|
returns int
|
|
|
|
begin
|
|
|
|
set local autocommit = 0;
|
|
|
|
return 0;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
|
|
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
|
|
|
create trigger bug12712
|
|
|
|
before insert on t1 for each row set session autocommit = 0;
|
|
|
|
|
|
|
|
|
Implement WL#2661 "Prepared Statements: Dynamic SQL in Stored Procedures".
The idea of the patch is to separate statement processing logic,
such as parsing, validation of the parsed tree, execution and cleanup,
from global query processing logic, such as logging, resetting
priorities of a thread, resetting stored procedure cache, resetting
thread count of errors and warnings.
This makes PREPARE and EXECUTE behave similarly to the rest of SQL
statements and allows their use in stored procedures.
This patch contains a change in behaviour:
until recently for each SQL prepared statement command, 2 queries
were written to the general log, e.g.
[Query] prepare stmt from @stmt_text;
[Prepare] select * from t1 <-- contents of @stmt_text
The chagne was necessary to prevent [Prepare] commands from being written
to the general log when executing a stored procedure with Dynamic SQL.
We should consider whether the old behavior is preferrable and probably
restore it.
This patch refixes Bug#7115, Bug#10975 (partially), Bug#10605 (various bugs
in Dynamic SQL reported before it was disabled).
2005-09-03 01:13:18 +02:00
|
|
|
#
|
|
|
|
# BUG#NNNN: New bug synopsis
|
|
|
|
#
|
|
|
|
#--disable_warnings
|
|
|
|
#drop procedure if exists bugNNNN|
|
|
|
|
#--enable_warnings
|
|
|
|
#create procedure bugNNNN...
|