2003-03-05 19:45:17 +01:00
|
|
|
#
|
|
|
|
# Stored PROCEDURE error tests
|
|
|
|
#
|
|
|
|
|
2019-08-30 15:06:54 +02:00
|
|
|
--source include/default_charset.inc
|
|
|
|
|
2005-07-05 01:00:23 +02:00
|
|
|
--disable_warnings
|
|
|
|
drop table if exists t1, t2;
|
|
|
|
--enable_warnings
|
|
|
|
|
2008-04-08 16:51:26 +02:00
|
|
|
# Backup the mysql.proc table
|
|
|
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
|
|
eval SELECT * FROM mysql.proc INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/proc.txt';
|
|
|
|
|
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
|
Various bug fixes:
- Duplicate parameters/variables, conditions and cursors (not allowed).
- ITERATE in labelled BEGIN-END (not allowed).
- Missing SQLSTATE [VALUE] keywords in CONDITION/HANDLER declaration (added).
- Empty BEGIN-END (now allowed).
- End label (now optional).
include/mysqld_error.h:
New error code for duplicate things (vars et al) in SPs.
mysql-test/r/sp-error.result:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/r/sp.result:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
mysql-test/t/sp-error.test:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/t/sp.test:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
sql/lex.h:
New SQLSTATE keyword.
sql/share/czech/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/danish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/dutch/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/english/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/estonian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/french/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/german/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/greek/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/hungarian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/italian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/japanese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/korean/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian-ny/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/polish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/portuguese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/romanian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/russian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/serbian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/slovak/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/spanish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/swedish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/ukrainian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/sp_pcontext.cc:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
sql/sp_pcontext.h:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
Also need to flag BEGIN labels to check for illegal ITERATEs.
sql/sql_yacc.yy:
End-labels in SPs loop and begin-end blocks are now optional.
SQLSTATE [VALUE] added to syntax for sqlstates.
Check for duplicate variable, condition and cursor declarations, but
only in the same scope.
Empty BEGIN-END statements now allowed.
Check if ITERATE is referring to a BEGIN label.
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)
|
WL#2130: Table locking for stored FUNCTIONs
Collect all tables and SPs refered by a statement, and open all tables
with an implicit LOCK TABLES. Do find things refered by triggers and views,
we open them first (and then repeat this until nothing new is found), before
doing the actual lock tables.
mysql-test/r/information_schema.result:
Updated result for WL#2130.
mysql-test/r/lock.result:
Updated result for WL#2130.
mysql-test/r/sp-error.result:
Updated result for WL#2130.
mysql-test/r/sp.result:
Updated result for WL#2130.
mysql-test/r/view.result:
Updated result for WL#2130.
mysql-test/t/information_schema.test:
Disabled one test case due to a bug involving LOCK TABLES,
which shows up with WL#2130.
mysql-test/t/lock.test:
New error message with WL#2130. This change is under debate and might change
in the future, but will do for now.
mysql-test/t/sp-error.test:
Updated for WL#2130. Some tests are voided when table access does work from
functions.
mysql-test/t/sp.test:
Updated for WL#2130.
mysql-test/t/view.test:
Updated for WL#2130.
sql/item_func.cc:
We now have to set net.no_send_ok for functions too, with WL#2130.
sql/share/errmsg.txt:
Reused an error code since the old use was voided by WL#2130, but a new
one was needed instead (similar, but more specific restriction).
sql/sp.cc:
Fixed error handling and collection of used tables for WL#2130.
sql/sp.h:
Fixed error handling and collection of used tables for WL#2130.
sql/sp_head.cc:
Added support functions for collecting and merging hash tables and lists
of used tables from SPs and substatements, for WL#2130.
sql/sp_head.h:
Added support functions for collecting and merging hash tables and lists
of used tables from SPs and substatements, for WL#2130.
sql/sql_base.cc:
Changed the way table->query_id is tested and set during with locked tables
in effect. This makes some SP test cases work with WL#2130, but has a side
effect on some error cases with explicit LOCK TABLES. It's still debated if
this is the correct way, so it might change.
sql/sql_class.h:
Added flags for circumventing some interference between WL#2130 and mysql_make_view().
sql/sql_derived.cc:
Added some missing initializations. (Potential bugs.)
sql/sql_lex.cc:
Clear the new hash tables for WL#2130.
sql/sql_lex.h:
Added hash tables for procedures and tables too (as for functions), for WL#2130.
sql/sql_parse.cc:
WL#2130: Make table accesses from stored functions work by adding an implicit
LOCK TABLES around (most) executed statements. To do this, we have to go through
a loop where we collect all SPs and tables in mysql_execute_statement.
sql/sql_prepare.cc:
Cache both functions and procedures for WL#2130.
sql/sql_show.cc:
Added some missing initializations. (Potential bugs.)
sql/sql_view.cc:
Shortcut mysql_make_view() if thd->shortcut_make_view is true during
the pre-open phase for collecting tables in WL#2130. Otherwise, the
similar mechanism here causes interference.
sql/sql_yacc.yy:
For WL#2130, added caching of procedures and disallowed LOCK/UNLOCK TABLES in SPs.
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|
|
|
|
|
|
2007-10-11 22:38:40 +02:00
|
|
|
--error ER_PARSE_ERROR
|
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
|
Fixed BUG#1862 (flush table in SPs didn't work).
Fixed various bugs: setting local variables to NULL, SELECT INTO var now actually
might work, SELECT INTO with not row now gives a "no data" warning (instead of
the "empty query" error), etc.
Updated test cases accordingly.
mysql-test/r/sp-error.result:
Corrected security syntax for alter/create procedure.
mysql-test/r/sp.result:
Corrected security syntax for alter/create procedure.
New tests for setting local variables to null,
bug fixes for SELECT INTO var, FLUSH TABLES calls (BUG#1862),
and corrected "no data" warning for SELECT INTO with no rows.
mysql-test/t/sp-error.test:
Corrected security syntax for alter/create procedure.
mysql-test/t/sp.test:
Corrected security syntax for alter/create procedure.
New tests for setting local variables to null,
bug fixes for SELECT INTO var, FLUSH TABLES calls (BUG#1862),
and corrected "no data" warning for SELECT INTO with no rows.
sql/lex.h:
Added SQL_SYM (and added a few _SYM suffixes for new symbols).
sql/sp_head.cc:
Fixed bug in the item_list copying for "with_wild" cases (list nodes ended
up in the wrong memroot).
Catch errors and warnings even if return values is 0 from sub-statements.
Restore table_list which is zapped by SQLCOM_CREATE_TABLE and INSERT_SELECT.
Set old table pointers to NULL after sub-statement call (since all tables are
closed).
sql/sql_class.cc:
Corrected error message when no rows return by a SELECT INTO var; should
be a "no data" warning.
sql/sql_lex.h:
Have to store the original table_list first pointer for some
sub-statements in SPs.
sql/sql_yacc.yy:
Corrected SECURITY INVOKER/DEFINER syntax ("SQL" missing), added some _SYM
suffixes, and fixed valgrind complaints for SP COMMENTs.
(Also removed some now irrelevant comments.)
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
|
Various bug fixes:
- Duplicate parameters/variables, conditions and cursors (not allowed).
- ITERATE in labelled BEGIN-END (not allowed).
- Missing SQLSTATE [VALUE] keywords in CONDITION/HANDLER declaration (added).
- Empty BEGIN-END (now allowed).
- End label (now optional).
include/mysqld_error.h:
New error code for duplicate things (vars et al) in SPs.
mysql-test/r/sp-error.result:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/r/sp.result:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
mysql-test/t/sp-error.test:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/t/sp.test:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
sql/lex.h:
New SQLSTATE keyword.
sql/share/czech/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/danish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/dutch/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/english/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/estonian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/french/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/german/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/greek/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/hungarian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/italian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/japanese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/korean/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian-ny/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/polish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/portuguese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/romanian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/russian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/serbian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/slovak/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/spanish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/swedish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/ukrainian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/sp_pcontext.cc:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
sql/sp_pcontext.h:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
Also need to flag BEGIN labels to check for illegal ITERATEs.
sql/sql_yacc.yy:
End-labels in SPs loop and begin-end blocks are now optional.
SQLSTATE [VALUE] added to syntax for sqlstates.
Check for duplicate variable, condition and cursor declarations, but
only in the same scope.
Empty BEGIN-END statements now allowed.
Check if ITERATE is referring to a BEGIN label.
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
|
Various bug fixes:
- Duplicate parameters/variables, conditions and cursors (not allowed).
- ITERATE in labelled BEGIN-END (not allowed).
- Missing SQLSTATE [VALUE] keywords in CONDITION/HANDLER declaration (added).
- Empty BEGIN-END (now allowed).
- End label (now optional).
include/mysqld_error.h:
New error code for duplicate things (vars et al) in SPs.
mysql-test/r/sp-error.result:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/r/sp.result:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
mysql-test/t/sp-error.test:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/t/sp.test:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
sql/lex.h:
New SQLSTATE keyword.
sql/share/czech/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/danish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/dutch/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/english/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/estonian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/french/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/german/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/greek/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/hungarian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/italian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/japanese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/korean/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian-ny/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/polish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/portuguese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/romanian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/russian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/serbian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/slovak/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/spanish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/swedish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/ukrainian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/sp_pcontext.cc:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
sql/sp_pcontext.h:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
Also need to flag BEGIN labels to check for illegal ITERATEs.
sql/sql_yacc.yy:
End-labels in SPs loop and begin-end blocks are now optional.
SQLSTATE [VALUE] added to syntax for sqlstates.
Check for duplicate variable, condition and cursor declarations, but
only in the same scope.
Empty BEGIN-END statements now allowed.
Check if ITERATE is referring to a BEGIN label.
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
|
Various bug fixes:
- Duplicate parameters/variables, conditions and cursors (not allowed).
- ITERATE in labelled BEGIN-END (not allowed).
- Missing SQLSTATE [VALUE] keywords in CONDITION/HANDLER declaration (added).
- Empty BEGIN-END (now allowed).
- End label (now optional).
include/mysqld_error.h:
New error code for duplicate things (vars et al) in SPs.
mysql-test/r/sp-error.result:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/r/sp.result:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
mysql-test/t/sp-error.test:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/t/sp.test:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
sql/lex.h:
New SQLSTATE keyword.
sql/share/czech/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/danish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/dutch/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/english/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/estonian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/french/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/german/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/greek/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/hungarian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/italian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/japanese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/korean/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian-ny/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/polish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/portuguese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/romanian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/russian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/serbian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/slovak/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/spanish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/swedish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/ukrainian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/sp_pcontext.cc:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
sql/sp_pcontext.h:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
Also need to flag BEGIN labels to check for illegal ITERATEs.
sql/sql_yacc.yy:
End-labels in SPs loop and begin-end blocks are now optional.
SQLSTATE [VALUE] added to syntax for sqlstates.
Check for duplicate variable, condition and cursor declarations, but
only in the same scope.
Empty BEGIN-END statements now allowed.
Check if ITERATE is referring to a BEGIN label.
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
|
|
|
|
Update tests and result files after running with new mysqltest that better detects problems with test files
mysql-test/r/csv.result:
Update after add of missing semicolon
mysql-test/r/drop.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/flush.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/flush_block_commit.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/flush_read_lock_kill.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/grant2.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/handler.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/innodb_notembedded.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/kill.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/lock_multi.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/multi_update.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/mysqltest.result:
Update result
mysql-test/r/query_cache.result:
Update after add of missing semicolon
mysql-test/r/query_cache_notembedded.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/sp-threads.result:
Update result file, no space before commands that has been "sent"
mysql-test/r/sp_notembedded.result:
Update after add of missing semicolon
mysql-test/r/type_blob.result:
Remove extra drop table
mysql-test/t/csv.test:
Add missing semicolon
mysql-test/t/query_cache.test:
Add missing semicolon
mysql-test/t/sp-error.test:
Remove "tab" from end of error declaration
mysql-test/t/sp.test:
Wrong delimiter, used ; instead of |
mysql-test/t/sp_notembedded.test:
Wrong delimiter, used ; instead of |
mysql-test/t/view_grant.test:
An incomplete error name specification was used.
2006-10-04 13:09:37 +02:00
|
|
|
--error 1332
|
Various bug fixes:
- Duplicate parameters/variables, conditions and cursors (not allowed).
- ITERATE in labelled BEGIN-END (not allowed).
- Missing SQLSTATE [VALUE] keywords in CONDITION/HANDLER declaration (added).
- Empty BEGIN-END (now allowed).
- End label (now optional).
include/mysqld_error.h:
New error code for duplicate things (vars et al) in SPs.
mysql-test/r/sp-error.result:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/r/sp.result:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
mysql-test/t/sp-error.test:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/t/sp.test:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
sql/lex.h:
New SQLSTATE keyword.
sql/share/czech/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/danish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/dutch/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/english/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/estonian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/french/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/german/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/greek/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/hungarian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/italian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/japanese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/korean/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian-ny/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/polish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/portuguese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/romanian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/russian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/serbian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/slovak/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/spanish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/swedish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/ukrainian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/sp_pcontext.cc:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
sql/sp_pcontext.h:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
Also need to flag BEGIN labels to check for illegal ITERATEs.
sql/sql_yacc.yy:
End-labels in SPs loop and begin-end blocks are now optional.
SQLSTATE [VALUE] added to syntax for sqlstates.
Check for duplicate variable, condition and cursor declarations, but
only in the same scope.
Empty BEGIN-END statements now allowed.
Check if ITERATE is referring to a BEGIN label.
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
|
Various bug fixes:
- Duplicate parameters/variables, conditions and cursors (not allowed).
- ITERATE in labelled BEGIN-END (not allowed).
- Missing SQLSTATE [VALUE] keywords in CONDITION/HANDLER declaration (added).
- Empty BEGIN-END (now allowed).
- End label (now optional).
include/mysqld_error.h:
New error code for duplicate things (vars et al) in SPs.
mysql-test/r/sp-error.result:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/r/sp.result:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
mysql-test/t/sp-error.test:
New error tests for ITERATE in begin-end block and duplicate variables,
conditions and cursors.
mysql-test/t/sp.test:
New tests for empty begin-end blocks, overriding local variables outside scope
only, leave a begin-end block, and SQLSTATE [VALUE] words for CONDITION/HANDLER
declarations.
sql/lex.h:
New SQLSTATE keyword.
sql/share/czech/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/danish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/dutch/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/english/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/estonian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/french/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/german/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/greek/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/hungarian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/italian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/japanese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/korean/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian-ny/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/norwegian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/polish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/portuguese/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/romanian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/russian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/serbian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/slovak/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/spanish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/swedish/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/share/ukrainian/errmsg.txt:
New error message for duplicate things (vars et al) in SPs.
sql/sp_pcontext.cc:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
sql/sp_pcontext.h:
Keep track on scope limits for error checking of duplicate variables,
conditions and cursors.
Also need to flag BEGIN labels to check for illegal ITERATEs.
sql/sql_yacc.yy:
End-labels in SPs loop and begin-end blocks are now optional.
SQLSTATE [VALUE] added to syntax for sqlstates.
Check for duplicate variable, condition and cursor declarations, but
only in the same scope.
Empty BEGIN-END statements now allowed.
Check if ITERATE is referring to a BEGIN label.
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;
|
WL#2130: Table locking for stored FUNCTIONs
Collect all tables and SPs refered by a statement, and open all tables
with an implicit LOCK TABLES. Do find things refered by triggers and views,
we open them first (and then repeat this until nothing new is found), before
doing the actual lock tables.
mysql-test/r/information_schema.result:
Updated result for WL#2130.
mysql-test/r/lock.result:
Updated result for WL#2130.
mysql-test/r/sp-error.result:
Updated result for WL#2130.
mysql-test/r/sp.result:
Updated result for WL#2130.
mysql-test/r/view.result:
Updated result for WL#2130.
mysql-test/t/information_schema.test:
Disabled one test case due to a bug involving LOCK TABLES,
which shows up with WL#2130.
mysql-test/t/lock.test:
New error message with WL#2130. This change is under debate and might change
in the future, but will do for now.
mysql-test/t/sp-error.test:
Updated for WL#2130. Some tests are voided when table access does work from
functions.
mysql-test/t/sp.test:
Updated for WL#2130.
mysql-test/t/view.test:
Updated for WL#2130.
sql/item_func.cc:
We now have to set net.no_send_ok for functions too, with WL#2130.
sql/share/errmsg.txt:
Reused an error code since the old use was voided by WL#2130, but a new
one was needed instead (similar, but more specific restriction).
sql/sp.cc:
Fixed error handling and collection of used tables for WL#2130.
sql/sp.h:
Fixed error handling and collection of used tables for WL#2130.
sql/sp_head.cc:
Added support functions for collecting and merging hash tables and lists
of used tables from SPs and substatements, for WL#2130.
sql/sp_head.h:
Added support functions for collecting and merging hash tables and lists
of used tables from SPs and substatements, for WL#2130.
sql/sql_base.cc:
Changed the way table->query_id is tested and set during with locked tables
in effect. This makes some SP test cases work with WL#2130, but has a side
effect on some error cases with explicit LOCK TABLES. It's still debated if
this is the correct way, so it might change.
sql/sql_class.h:
Added flags for circumventing some interference between WL#2130 and mysql_make_view().
sql/sql_derived.cc:
Added some missing initializations. (Potential bugs.)
sql/sql_lex.cc:
Clear the new hash tables for WL#2130.
sql/sql_lex.h:
Added hash tables for procedures and tables too (as for functions), for WL#2130.
sql/sql_parse.cc:
WL#2130: Make table accesses from stored functions work by adding an implicit
LOCK TABLES around (most) executed statements. To do this, we have to go through
a loop where we collect all SPs and tables in mysql_execute_statement.
sql/sql_prepare.cc:
Cache both functions and procedures for WL#2130.
sql/sql_show.cc:
Added some missing initializations. (Potential bugs.)
sql/sql_view.cc:
Shortcut mysql_make_view() if thd->shortcut_make_view is true during
the pre-open phase for collecting tables in WL#2130. Otherwise, the
similar mechanism here causes interference.
sql/sql_yacc.yy:
For WL#2130, added caching of procedures and disallowed LOCK/UNLOCK TABLES in SPs.
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()|
|
2006-06-01 11:53:27 +02:00
|
|
|
truncate table 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|
|
2007-06-06 19:57:07 +02:00
|
|
|
--error ER_DUP_ENTRY
|
2004-04-05 17:01:19 +02:00
|
|
|
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;
|
WL#2130: Table locking for stored FUNCTIONs
Collect all tables and SPs refered by a statement, and open all tables
with an implicit LOCK TABLES. Do find things refered by triggers and views,
we open them first (and then repeat this until nothing new is found), before
doing the actual lock tables.
mysql-test/r/information_schema.result:
Updated result for WL#2130.
mysql-test/r/lock.result:
Updated result for WL#2130.
mysql-test/r/sp-error.result:
Updated result for WL#2130.
mysql-test/r/sp.result:
Updated result for WL#2130.
mysql-test/r/view.result:
Updated result for WL#2130.
mysql-test/t/information_schema.test:
Disabled one test case due to a bug involving LOCK TABLES,
which shows up with WL#2130.
mysql-test/t/lock.test:
New error message with WL#2130. This change is under debate and might change
in the future, but will do for now.
mysql-test/t/sp-error.test:
Updated for WL#2130. Some tests are voided when table access does work from
functions.
mysql-test/t/sp.test:
Updated for WL#2130.
mysql-test/t/view.test:
Updated for WL#2130.
sql/item_func.cc:
We now have to set net.no_send_ok for functions too, with WL#2130.
sql/share/errmsg.txt:
Reused an error code since the old use was voided by WL#2130, but a new
one was needed instead (similar, but more specific restriction).
sql/sp.cc:
Fixed error handling and collection of used tables for WL#2130.
sql/sp.h:
Fixed error handling and collection of used tables for WL#2130.
sql/sp_head.cc:
Added support functions for collecting and merging hash tables and lists
of used tables from SPs and substatements, for WL#2130.
sql/sp_head.h:
Added support functions for collecting and merging hash tables and lists
of used tables from SPs and substatements, for WL#2130.
sql/sql_base.cc:
Changed the way table->query_id is tested and set during with locked tables
in effect. This makes some SP test cases work with WL#2130, but has a side
effect on some error cases with explicit LOCK TABLES. It's still debated if
this is the correct way, so it might change.
sql/sql_class.h:
Added flags for circumventing some interference between WL#2130 and mysql_make_view().
sql/sql_derived.cc:
Added some missing initializations. (Potential bugs.)
sql/sql_lex.cc:
Clear the new hash tables for WL#2130.
sql/sql_lex.h:
Added hash tables for procedures and tables too (as for functions), for WL#2130.
sql/sql_parse.cc:
WL#2130: Make table accesses from stored functions work by adding an implicit
LOCK TABLES around (most) executed statements. To do this, we have to go through
a loop where we collect all SPs and tables in mysql_execute_statement.
sql/sql_prepare.cc:
Cache both functions and procedures for WL#2130.
sql/sql_show.cc:
Added some missing initializations. (Potential bugs.)
sql/sql_view.cc:
Shortcut mysql_make_view() if thd->shortcut_make_view is true during
the pre-open phase for collecting tables in WL#2130. Otherwise, the
similar mechanism here causes interference.
sql/sql_yacc.yy:
For WL#2130, added caching of procedures and disallowed LOCK/UNLOCK TABLES in SPs.
2005-02-08 20:52:50 +01:00
|
|
|
drop table t5;
|
2004-09-10 11:11:52 +02:00
|
|
|
end|
|
|
|
|
|
WL#2130: Table locking for stored FUNCTIONs
Collect all tables and SPs refered by a statement, and open all tables
with an implicit LOCK TABLES. Do find things refered by triggers and views,
we open them first (and then repeat this until nothing new is found), before
doing the actual lock tables.
mysql-test/r/information_schema.result:
Updated result for WL#2130.
mysql-test/r/lock.result:
Updated result for WL#2130.
mysql-test/r/sp-error.result:
Updated result for WL#2130.
mysql-test/r/sp.result:
Updated result for WL#2130.
mysql-test/r/view.result:
Updated result for WL#2130.
mysql-test/t/information_schema.test:
Disabled one test case due to a bug involving LOCK TABLES,
which shows up with WL#2130.
mysql-test/t/lock.test:
New error message with WL#2130. This change is under debate and might change
in the future, but will do for now.
mysql-test/t/sp-error.test:
Updated for WL#2130. Some tests are voided when table access does work from
functions.
mysql-test/t/sp.test:
Updated for WL#2130.
mysql-test/t/view.test:
Updated for WL#2130.
sql/item_func.cc:
We now have to set net.no_send_ok for functions too, with WL#2130.
sql/share/errmsg.txt:
Reused an error code since the old use was voided by WL#2130, but a new
one was needed instead (similar, but more specific restriction).
sql/sp.cc:
Fixed error handling and collection of used tables for WL#2130.
sql/sp.h:
Fixed error handling and collection of used tables for WL#2130.
sql/sp_head.cc:
Added support functions for collecting and merging hash tables and lists
of used tables from SPs and substatements, for WL#2130.
sql/sp_head.h:
Added support functions for collecting and merging hash tables and lists
of used tables from SPs and substatements, for WL#2130.
sql/sql_base.cc:
Changed the way table->query_id is tested and set during with locked tables
in effect. This makes some SP test cases work with WL#2130, but has a side
effect on some error cases with explicit LOCK TABLES. It's still debated if
this is the correct way, so it might change.
sql/sql_class.h:
Added flags for circumventing some interference between WL#2130 and mysql_make_view().
sql/sql_derived.cc:
Added some missing initializations. (Potential bugs.)
sql/sql_lex.cc:
Clear the new hash tables for WL#2130.
sql/sql_lex.h:
Added hash tables for procedures and tables too (as for functions), for WL#2130.
sql/sql_parse.cc:
WL#2130: Make table accesses from stored functions work by adding an implicit
LOCK TABLES around (most) executed statements. To do this, we have to go through
a loop where we collect all SPs and tables in mysql_execute_statement.
sql/sql_prepare.cc:
Cache both functions and procedures for WL#2130.
sql/sql_show.cc:
Added some missing initializations. (Potential bugs.)
sql/sql_view.cc:
Shortcut mysql_make_view() if thd->shortcut_make_view is true during
the pre-open phase for collecting tables in WL#2130. Otherwise, the
similar mechanism here causes interference.
sql/sql_yacc.yy:
For WL#2130, added caching of procedures and disallowed LOCK/UNLOCK TABLES in SPs.
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|
|
|
|
|
|
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.
|
Apply and review:
3655 Jon Olav Hauglid 2009-10-19
Bug #30977 Concurrent statement using stored function and DROP FUNCTION
breaks SBR
Bug #48246 assert in close_thread_table
Implement a fix for:
Bug #41804 purge stored procedure cache causes mysterious hang for many
minutes
Bug #49972 Crash in prepared statements
The problem was that concurrent execution of DML statements that
use stored functions and DDL statements that drop/modify the same
function might result in incorrect binary log in statement (and
mixed) mode and therefore break replication.
This patch fixes the problem by introducing metadata locking for
stored procedures and functions. This is similar to what is done
in Bug#25144 for views. Procedures and functions now are
locked using metadata locks until the transaction is either
committed or rolled back. This prevents other statements from
modifying the procedure/function while it is being executed. This
provides commit ordering - guaranteeing serializability across
multiple transactions and thus fixes the reported binlog problem.
Note that we do not take locks for top-level CALLs. This means
that procedures called directly are not protected from changes by
simultaneous DDL operations so they are executed at the state they
had at the time of the CALL. By not taking locks for top-level
CALLs, we still allow transactions to be started inside
procedures.
This patch also changes stored procedure cache invalidation.
Upon a change of cache version, we no longer invalidate the entire
cache, but only those routines which we use, only when a statement
is executed that uses them.
This patch also changes the logic of prepared statement validation.
A stored procedure used by a prepared statement is now validated
only once a metadata lock has been acquired. A version mismatch
causes a flush of the obsolete routine from the cache and
statement reprepare.
Incompatible changes:
1) ER_LOCK_DEADLOCK is reported for a transaction trying to access
a procedure/function that is locked by a DDL operation in
another connection.
2) Procedure/function DDL operations are now prohibited in LOCK
TABLES mode as exclusive locks must be taken all at once and
LOCK TABLES provides no way to specifiy procedures/functions to
be locked.
Test cases have been added to sp-lock.test and rpl_sp.test.
Work on this bug has very much been a team effort and this patch
includes and is based on contributions from Davi Arnaut, Dmitry
Lenev, Magne Mæhre and Konstantin Osipov.
mysql-test/r/ps_ddl.result:
Update results (Bug#30977).
mysql-test/r/ps_ddl1.result:
Update results (Bug#30977).
mysql-test/r/sp-error.result:
Update results (Bug#30977).
mysql-test/r/sp-lock.result:
Update results (Bug#30977).
mysql-test/suite/rpl/r/rpl_sp.result:
Update results (Bug#30977).
mysql-test/suite/rpl/t/rpl_sp.test:
Add a test case for Bug#30977.
mysql-test/t/ps_ddl.test:
Update comments. We no longer re-prepare a prepared statement
when a stored procedure used in top-level CALL is changed.
mysql-test/t/ps_ddl1.test:
Modifying stored procedure p1 no longer invalidates prepared
statement "call p1" -- we can re-use the prepared statement
without invalidation.
mysql-test/t/sp-error.test:
Use a constant for an error value.
mysql-test/t/sp-lock.test:
Add test coverage for Bug#30977.
sql/lock.cc:
Implement lock_routine_name() - a way to acquire an
exclusive metadata lock (ex- name-lock) on
stored procedure/function.
sql/sp.cc:
Change semantics of sp_cache_routine() -- now it has an option
to make sure that the routine that is cached is up to date (has
the latest sp cache version).
Add sp_cache_invalidate() to sp_drop_routine(), where it was
missing (a bug!).
Acquire metadata locks for SP DDL (ALTER/CREATE/DROP). This is
the core of the fix for Bug#30977.
Since caching and cache invalidation scheme was changed, make
sure we don't invalidate the SP cache in the middle of a stored
routine execution. At the same time, make sure we don't access
stale data due to lack of invalidation.
For that, change ALTER FUNCTION/PROCEDURE to not use the cache,
and SHOW PROCEDURE CODE/SHOW CREATE PROCEDURE/FUNCTION to always
read an up to date version of the routine from the cache.
sql/sp.h:
Add a helper wrapper around sp_cache_routine().
sql/sp_cache.cc:
Implement new sp_cache_version() and sp_cache_flush_obsolete().
Now we flush stale routines individually, rather than all at once.
sql/sp_cache.h:
Update signatures of sp_cache_version() and sp_cache_flush_obsolete().
sql/sp_head.cc:
Add a default initialization of sp_head::m_sp_cache_version.
Remove a redundant sp_head::create().
sql/sp_head.h:
Add m_sp_cache_version to sp_head class - we now
keep track of every routine in the stored procedure cache, rather than
of the entire cache.
sql/sql_base.cc:
Implement prelocking for stored routines. Validate stored
routines after they were locked.
Flush obsolete routines upon next access, one by one, not all at once
(Bug#41804).
Style fixes.
sql/sql_class.h:
Rename a Open_table_context method.
sql/sql_parse.cc:
Make sure stored procedures DDL commits the active transaction
(issues an implicit commit before and after).
Remove sp_head::create(), a pure redundancy.
Move the semantical check during alter routine inside sp_update_routine() code in order to:
- avoid using SP cache during update, it may be obsolete.
- speed up and simplify the update procedure.
Remove sp_cache_flush_obsolete() calls, we no longer flush the entire
cache, ever, stale routines are flushed before next use, one at a time.
sql/sql_prepare.cc:
Move routine metadata validation to open_and_process_routine().
Fix Bug#49972 (don't swap flags at reprepare).
Reset Sroutine_hash_entries in reinit_stmt_before_use().
Remove SP cache invalidation, it's now done by open_tables().
sql/sql_show.cc:
Fix a warning: remove an unused label.
sql/sql_table.cc:
Reset mdl_request.ticket for tickets acquired for routines inlined
through a view, in CHECK TABLE statement, to satisfy an MDL assert.
sql/sql_update.cc:
Move the cleanup of "translation items" to close_tables_for_reopen(),
since it's needed in all cases when we back off, not just
the back-off in multi-update. This fixes a bug when the server
would crash on attempt to back off when opening tables
for a statement that uses information_schema tables.
2009-12-29 13:19:05 +01:00
|
|
|
--error ER_LOCK_OR_ACTIVE_TRANSACTION
|
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|
|
|
|
|
|
2006-06-01 11:53:27 +02:00
|
|
|
truncate table t1|
|
2005-04-08 16:05:16 +02:00
|
|
|
--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).
mysql-test/r/not_embedded_server.result:
Since we don't want to log Dynamic SQL in stored procedures,
now the general log gets only one log entry per SQL statement.
mysql-test/r/sp-error.result:
- remove obsolete tests
- a better error message for the case when a stored procedure that
returns a result set is called from a function
mysql-test/r/trigger.result:
- a better error message for the case when a stored procedure that
returns a result set is called from a trigger
mysql-test/t/sp-error.test:
- a better error message for the case when a stored procedure that
returns a result set is called from a function.
- move the comment to its place (end of file).
mysql-test/t/trigger.test:
- a better error message for the case when a stored procedure that
returns a result set is called from a trigger
sql/item_func.cc:
- we need to pass sql_command explicitly to get_var_with_binlog, because
when creating a query for SQL prepared statement thd->lex->sql_command
points at SQLCOM_EXECUTE, which is not listed in the list of update
queries.
sql/log_event.h:
- remove an extra copy of the previous sentence
sql/mysql_priv.h:
- fix declarations of sql_prepare.cc API
sql/share/errmsg.txt:
- a new error message, when one attempts to execute a prepared statement
which is currently being executed (this can happen only in Dynamic SQL
at the moment).
sql/sp_head.cc:
- extend sp_multi_results_command to return different flags for a
command (and rename it)
- add support for SQLCOM_PREPARE,SQLCOM_EXECUTE, SQLCOM_DEALLOCATE
to sp_get_flags_for_command
- replace multiple boolean sp_head members with uint m_flags
- a fix for a crash when user variables are used in a stored procedure
and binlog is on. A temporary fix for Bug#12637 "SP crashes the server
if it has update query with user var & binlog is enabled", which actually
stands for stored functions: now instead of a crash we break
replication if a user variable is used in a stored function which
is executed in prelocked mode.
sql/sp_head.h:
- replace multiple boolean flags of sp_head with uint m_flags;
- add flag CONTAINS_DYNAMIC_SQL
- use this flag to error if a stored procedure with Dynamic SQL is
called from a function or trigger.
sql/sql_class.cc:
- Statement_map::insert should not delete a statement if it exists,
now it's done externally to be able to handle the case when the
statement being deleted is in use.
- remove extra code (free_list is already reset in free_items)
sql/sql_lex.cc:
- add lex->stmt_prepare_mode; we can't rely on thd->command any more,
because we don't reset it any more (Dynamic SQL requirement is that
PS are as little intrusive as possible).
sql/sql_lex.h:
- declare bool LEX::stmt_prepare_mode
sql/sql_parse.cc:
- move prepared statement code to sql_prepare.cc
- change declarations (refactored code)
- better error message when one attempts to use Dynamic SQL or a
stored procedure that returns a result set in a function or trigger.
sql/sql_prepare.cc:
- major refactoring to ensure PREPARE/EXECUTE commands do not reset global THD
state and allow their use in stored procedures.
- add Prepared_statement::flags and use it to ensure no recursive execution
of a prepared statement is possible
- better comments
sql/sql_yacc.yy:
- enable PREPARE/EXECUTE/DEALLOCATE in stored procedures
- produce an error message on attempt to use PREPARE/EXECUTE/DEALLOCATE
in a stored function or trigger
mysql-test/r/sp-dynamic.result:
- sp-dynamic.test results
mysql-test/t/sp-dynamic.test:
- a new test for PREPARE/EXECUTE/DEALLOCATE in stored procedures.
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|
|
2006-06-01 11:53:27 +02:00
|
|
|
truncate table t1|
|
2005-04-26 17:31:59 +02:00
|
|
|
|
|
|
|
|
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|
|
2006-08-25 15:51:29 +02:00
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin reset query cache;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin reset master;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin reset slave;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush hosts;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush privileges;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush tables with read lock;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush tables;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush logs;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush status;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush slave;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush master;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush des_key_file;
|
|
|
|
return 1; end|
|
|
|
|
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
create function bug8409() returns int begin flush user_resources;
|
|
|
|
return 1; end|
|
2005-05-27 16:19:25 +02:00
|
|
|
|
|
|
|
|
2005-05-31 18:36:32 +02:00
|
|
|
#
|
|
|
|
# BUG#9529: Stored Procedures: No Warning on truncation of procedure name
|
|
|
|
# during creation.
|
2006-02-16 13:40:37 +01:00
|
|
|
# BUG#17015: Routine name truncation not an error
|
|
|
|
# When we started using utf8 for mysql.proc, this limit appeared
|
|
|
|
# to be higher, but in reality the names were truncated.
|
2005-05-31 18:36:32 +02:00
|
|
|
--error ER_TOO_LONG_IDENT
|
2006-02-16 13:40:37 +01:00
|
|
|
create procedure bug9529_901234567890123456789012345678901234567890123456789012345()
|
2005-05-31 18:36:32 +02:00
|
|
|
begin
|
|
|
|
end|
|
|
|
|
|
2006-02-16 13:40:37 +01:00
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug17015_0123456789012345678901234567890123456789012345678901234|
|
|
|
|
--enable_warnings
|
|
|
|
# Check the upper limit, just to make sure.
|
|
|
|
create procedure bug17015_0123456789012345678901234567890123456789012345678901234()
|
|
|
|
begin
|
|
|
|
end|
|
|
|
|
|
|
|
|
--replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
|
|
|
|
show procedure status like 'bug17015%'|
|
|
|
|
drop procedure bug17015_0123456789012345678901234567890123456789012345678901234|
|
|
|
|
|
2005-05-31 18:36:32 +02:00
|
|
|
|
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 ;|
|
2005-09-21 15:28:28 +02:00
|
|
|
--error 1326
|
2005-07-05 01:00:23 +02:00
|
|
|
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|
|
2005-11-23 00:11:19 +01:00
|
|
|
--error ER_SP_RECURSION_LIMIT
|
|
|
|
call bug11394(2, 1)|
|
|
|
|
set @@max_sp_recursion_depth=10|
|
2005-07-01 11:01:46 +02:00
|
|
|
call bug11394(2, 1)|
|
2005-11-23 00:11:19 +01:00
|
|
|
set @@max_sp_recursion_depth=default|
|
2005-07-01 11:01:46 +02:00
|
|
|
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)
|
|
|
|
#
|
2007-06-22 11:55:48 +02:00
|
|
|
--error ER_SP_BADSTATEMENT
|
2005-08-29 12:19:08 +02:00
|
|
|
CREATE PROCEDURE BUG_12490() HELP CONTENTS;
|
2015-11-23 11:49:23 +01:00
|
|
|
--error ER_PARSE_ERROR
|
2005-08-29 12:19:08 +02:00
|
|
|
CREATE FUNCTION BUG_12490() RETURNS INT HELP CONTENTS;
|
|
|
|
CREATE TABLE t_bug_12490(a int);
|
2007-06-22 11:55:48 +02:00
|
|
|
--error ER_SP_BADSTATEMENT
|
2005-08-29 12:19:08 +02:00
|
|
|
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.
|
2006-07-26 12:40:26 +02:00
|
|
|
|
|
|
|
# NOTE! The error we get from the below query indicates that the sp bug11834_2
|
|
|
|
# does not exist(this is wrong but can be accepted)
|
|
|
|
# This behaviour has been reported as bug#21294
|
2005-07-09 19:51:59 +02:00
|
|
|
--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
|
2005-12-03 15:02:09 +01:00
|
|
|
--error ER_SP_NO_RETSET
|
2005-09-06 19:43:06 +02:00
|
|
|
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;
|
|
|
|
|
2005-09-21 15:28:28 +02:00
|
|
|
#
|
|
|
|
# BUG#9367: Stored procedures: client hang after "show warnings"
|
|
|
|
#
|
|
|
|
--disable_parsing
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug9367;
|
|
|
|
--enable_warnings
|
|
|
|
create table t1 (s1 int);
|
|
|
|
select s1 from t1;
|
|
|
|
delimiter |;
|
|
|
|
create procedure bug9367()
|
|
|
|
begin
|
|
|
|
declare v int;
|
|
|
|
declare c cursor for select s1 from t1;
|
|
|
|
open c;
|
|
|
|
show warnings;
|
|
|
|
fetch c into v;
|
|
|
|
select v;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
|
|
|
call bug9367();
|
|
|
|
drop procedure bug9367;
|
|
|
|
drop table t1;
|
|
|
|
--enable_parsing
|
2005-10-11 15:01:38 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# BUG#13510: Setting password local variable changes current password
|
|
|
|
#
|
|
|
|
delimiter |;
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug13510_1|
|
|
|
|
drop procedure if exists bug13510_2|
|
|
|
|
drop procedure if exists bug13510_3|
|
|
|
|
drop procedure if exists bug13510_4|
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
--error ER_SP_BAD_VAR_SHADOW
|
|
|
|
create procedure bug13510_1()
|
|
|
|
begin
|
|
|
|
declare password varchar(10);
|
|
|
|
|
|
|
|
set password = 'foo1';
|
|
|
|
select password;
|
|
|
|
end|
|
|
|
|
|
2005-11-18 23:22:12 +01:00
|
|
|
# Check that an error message is sent
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
set names='foo2'|
|
|
|
|
|
2005-10-11 15:01:38 +02:00
|
|
|
--error ER_SP_BAD_VAR_SHADOW
|
|
|
|
create procedure bug13510_2()
|
|
|
|
begin
|
|
|
|
declare names varchar(10);
|
|
|
|
|
|
|
|
set names = 'foo2';
|
|
|
|
select names;
|
|
|
|
end|
|
|
|
|
|
|
|
|
create procedure bug13510_3()
|
|
|
|
begin
|
|
|
|
declare password varchar(10);
|
|
|
|
|
|
|
|
set `password` = 'foo3';
|
|
|
|
select password;
|
|
|
|
end|
|
|
|
|
|
|
|
|
create procedure bug13510_4()
|
|
|
|
begin
|
|
|
|
declare names varchar(10);
|
|
|
|
|
|
|
|
set `names` = 'foo4';
|
|
|
|
select names;
|
|
|
|
end|
|
|
|
|
|
|
|
|
call bug13510_3()|
|
|
|
|
call bug13510_4()|
|
|
|
|
|
|
|
|
drop procedure bug13510_3|
|
|
|
|
drop procedure bug13510_4|
|
2005-11-16 13:09:06 +01:00
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# Test that statements which implicitly commit transaction are prohibited
|
|
|
|
# in stored function and triggers. Attempt to create function or trigger
|
|
|
|
# containing such statement should produce error (includes test for
|
|
|
|
# bug #13627).
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug_13627_f|
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
CREATE TABLE t1 (a int)|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN DROP TRIGGER test1; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN DROP TRIGGER test1; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create table t2 (a int); END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN create table t2 (a int); return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create index t1_i on t1 (a); END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN create index t1_i on t1 (a); return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter table t1 add column b int; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN alter table t1 add column b int; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN rename table t1 to t2; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN rename table t1 to t2; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN truncate table t1; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN truncate table t1; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop table t1; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN drop table t1; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop index t1_i on t1; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN drop index t1_i on t1; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_SP_BADSTATEMENT
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN unlock tables; END |
|
|
|
|
-- error ER_SP_BADSTATEMENT
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN unlock tables; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_SP_BADSTATEMENT
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN LOCK TABLE t1 READ; END |
|
|
|
|
-- error ER_SP_BADSTATEMENT
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN LOCK TABLE t1 READ; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create database mysqltest; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN create database mysqltest; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop database mysqltest; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN drop database mysqltest; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create user 'mysqltest_1'; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN create user 'mysqltest_1'; return 1; END |
|
|
|
|
|
Bug#21975 Grant and revoke statements are non-transactional
Bug#21422 GRANT/REVOKE possible inside stored function, probably in a trigger
Bug#17244 GRANT gives strange error message when used in a stored function
GRANT/REVOKE statements are non-transactional (no explicit transaction
boundaries) in nature and hence are forbidden inside stored functions and
triggers, but they weren't being effectively forbidden. Furthermore, the
absence of implict commits makes changes made by GRANT/REVOKE statements to
not be rolled back.
The implemented fix is to issue a implicit commit with every GRANT/REVOKE
statement, effectively prohibiting these statements in stored functions
and triggers. The implicit commit also fixes the replication bug, and looks
like being in concert with the behavior of DDL and administrative statements.
Since this is a incompatible change, the following sentence should be
added to the Manual in the very end of the 3rd paragraph, subclause
13.4.3 "Statements That Cause an Implicit Commit": "Beginning with
MySQL 5.0.??, the GRANT and REVOKE statements cause an implicit commit."
Patch contributed by Vladimir Shebordaev
mysql-test/r/sp-error.result:
Test case result for Bug#17244
mysql-test/t/sp-error.test:
Test case for Bug#17244
sql/sp_head.cc:
Set that a procedure with GRANT/REVOKE command has a (implicit or explicit)
commit.
sql/sql_parse.cc:
End active transaction in SQLCOM_GRANT and SQLCOM_REVOKE, and thus effectively
prohibit these statements in stored functions and triggers. An implicit commit
also fixes a bug in replication, when GRANT or REVOKE would disappear from the
binary log in case of a subsequent ROLLBACK, since they were considered
transactional statements.
mysql-test/suite/rpl/r/rpl_binlog_grant.result:
Add test case result for Bug#21975
mysql-test/suite/rpl/t/rpl_binlog_grant.test:
Add test case for Bug#21975
2007-08-29 21:59:38 +02:00
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER bug21975 BEFORE INSERT ON t1 FOR EACH ROW BEGIN grant select on t1 to 'mysqltest_1'; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug21975() returns int BEGIN grant select on t1 to 'mysqltest_1'; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER bug21975 BEFORE INSERT ON t1 FOR EACH ROW BEGIN revoke select on t1 from 'mysqltest_1'; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug21975() returns int BEGIN revoke select on t1 from 'mysqltest_1'; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER bug21975 BEFORE INSERT ON t1 FOR EACH ROW BEGIN revoke all privileges on *.* from 'mysqltest_1'; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug21975() returns int BEGIN revoke all privileges on *.* from 'mysqltest_1'; return 1; END |
|
|
|
|
|
2005-11-16 13:09:06 +01:00
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop user 'mysqltest_1'; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN drop user 'mysqltest_1'; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN rename user 'mysqltest_2' to 'mysqltest_1'; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN rename user 'mysqltest_2' to 'mysqltest_1'; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create view v1 as select 1; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN create view v1 as select 1; return 1; END |
|
|
|
|
|
2007-06-22 11:55:48 +02:00
|
|
|
-- error ER_SP_BADSTATEMENT
|
2005-11-16 13:09:06 +01:00
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter view v1 as select 1; END |
|
2007-06-22 11:55:48 +02:00
|
|
|
-- error ER_SP_BADSTATEMENT
|
2005-11-16 13:09:06 +01:00
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN alter view v1 as select 1; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop view v1; END |
|
|
|
|
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN drop view v1; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_SP_NO_RECURSIVE_CREATE
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create trigger tr2 before insert on t1 for each row do select 1; END |
|
|
|
|
-- error ER_SP_NO_RECURSIVE_CREATE
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN create trigger tr2 before insert on t1 for each row do select 1; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_SP_NO_DROP_SP
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop function bug_13627_f; END |
|
|
|
|
-- error ER_SP_NO_DROP_SP
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN drop function bug_13627_f; return 1; END |
|
|
|
|
|
|
|
|
-- error ER_SP_NO_RECURSIVE_CREATE
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create function f2 () returns int return 1; END |
|
|
|
|
-- error ER_SP_NO_RECURSIVE_CREATE
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int BEGIN create function f2 () returns int return 1; return 1; END |
|
|
|
|
|
|
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW
|
|
|
|
BEGIN
|
|
|
|
CREATE TEMPORARY TABLE t2 (a int);
|
|
|
|
DROP TEMPORARY TABLE t2;
|
|
|
|
END |
|
|
|
|
CREATE FUNCTION bug_13627_f() returns int
|
|
|
|
BEGIN
|
|
|
|
CREATE TEMPORARY TABLE t2 (a int);
|
|
|
|
DROP TEMPORARY TABLE t2;
|
|
|
|
return 1;
|
|
|
|
END |
|
|
|
|
|
|
|
|
drop table t1|
|
|
|
|
drop function bug_13627_f|
|
|
|
|
|
2005-10-11 15:01:38 +02:00
|
|
|
delimiter ;|
|
|
|
|
|
2005-11-17 01:51:14 +01:00
|
|
|
# BUG#12329: "Bogus error msg when executing PS with stored procedure after
|
|
|
|
# SP was re-created". See also test for related bug#13399 in trigger.test
|
|
|
|
drop function if exists bug12329;
|
|
|
|
--enable_warnings
|
|
|
|
create table t1 as select 1 a;
|
|
|
|
create table t2 as select 1 a;
|
|
|
|
create function bug12329() returns int return (select a from t1);
|
|
|
|
prepare stmt1 from 'select bug12329()';
|
|
|
|
execute stmt1;
|
|
|
|
drop function bug12329;
|
|
|
|
create function bug12329() returns int return (select a+100 from t2);
|
|
|
|
select bug12329();
|
|
|
|
execute stmt1;
|
|
|
|
deallocate prepare stmt1;
|
|
|
|
drop function bug12329;
|
|
|
|
drop table t1, t2;
|
|
|
|
|
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).
mysql-test/r/not_embedded_server.result:
Since we don't want to log Dynamic SQL in stored procedures,
now the general log gets only one log entry per SQL statement.
mysql-test/r/sp-error.result:
- remove obsolete tests
- a better error message for the case when a stored procedure that
returns a result set is called from a function
mysql-test/r/trigger.result:
- a better error message for the case when a stored procedure that
returns a result set is called from a trigger
mysql-test/t/sp-error.test:
- a better error message for the case when a stored procedure that
returns a result set is called from a function.
- move the comment to its place (end of file).
mysql-test/t/trigger.test:
- a better error message for the case when a stored procedure that
returns a result set is called from a trigger
sql/item_func.cc:
- we need to pass sql_command explicitly to get_var_with_binlog, because
when creating a query for SQL prepared statement thd->lex->sql_command
points at SQLCOM_EXECUTE, which is not listed in the list of update
queries.
sql/log_event.h:
- remove an extra copy of the previous sentence
sql/mysql_priv.h:
- fix declarations of sql_prepare.cc API
sql/share/errmsg.txt:
- a new error message, when one attempts to execute a prepared statement
which is currently being executed (this can happen only in Dynamic SQL
at the moment).
sql/sp_head.cc:
- extend sp_multi_results_command to return different flags for a
command (and rename it)
- add support for SQLCOM_PREPARE,SQLCOM_EXECUTE, SQLCOM_DEALLOCATE
to sp_get_flags_for_command
- replace multiple boolean sp_head members with uint m_flags
- a fix for a crash when user variables are used in a stored procedure
and binlog is on. A temporary fix for Bug#12637 "SP crashes the server
if it has update query with user var & binlog is enabled", which actually
stands for stored functions: now instead of a crash we break
replication if a user variable is used in a stored function which
is executed in prelocked mode.
sql/sp_head.h:
- replace multiple boolean flags of sp_head with uint m_flags;
- add flag CONTAINS_DYNAMIC_SQL
- use this flag to error if a stored procedure with Dynamic SQL is
called from a function or trigger.
sql/sql_class.cc:
- Statement_map::insert should not delete a statement if it exists,
now it's done externally to be able to handle the case when the
statement being deleted is in use.
- remove extra code (free_list is already reset in free_items)
sql/sql_lex.cc:
- add lex->stmt_prepare_mode; we can't rely on thd->command any more,
because we don't reset it any more (Dynamic SQL requirement is that
PS are as little intrusive as possible).
sql/sql_lex.h:
- declare bool LEX::stmt_prepare_mode
sql/sql_parse.cc:
- move prepared statement code to sql_prepare.cc
- change declarations (refactored code)
- better error message when one attempts to use Dynamic SQL or a
stored procedure that returns a result set in a function or trigger.
sql/sql_prepare.cc:
- major refactoring to ensure PREPARE/EXECUTE commands do not reset global THD
state and allow their use in stored procedures.
- add Prepared_statement::flags and use it to ensure no recursive execution
of a prepared statement is possible
- better comments
sql/sql_yacc.yy:
- enable PREPARE/EXECUTE/DEALLOCATE in stored procedures
- produce an error message on attempt to use PREPARE/EXECUTE/DEALLOCATE
in a stored function or trigger
mysql-test/r/sp-dynamic.result:
- sp-dynamic.test results
mysql-test/t/sp-dynamic.test:
- a new test for PREPARE/EXECUTE/DEALLOCATE in stored procedures.
2005-09-03 01:13:18 +02:00
|
|
|
#
|
2005-10-19 12:46:32 +02:00
|
|
|
# Bug#13514 "server crash when create a stored procedure before choose a
|
|
|
|
# database" and
|
|
|
|
# Bug#13587 "Server crash when SP is created without database
|
|
|
|
# selected"
|
|
|
|
#
|
|
|
|
create database mysqltest1;
|
|
|
|
use mysqltest1;
|
|
|
|
drop database mysqltest1;
|
|
|
|
--error ER_NO_DB_ERROR
|
|
|
|
create function f1() returns int return 1;
|
|
|
|
delimiter |;
|
|
|
|
--error ER_NO_DB_ERROR
|
|
|
|
create procedure p1(out param1 int)
|
|
|
|
begin
|
|
|
|
select count(*) into param1 from t3;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
|
|
|
use test;
|
2005-10-25 11:02:48 +02:00
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# BUG#13037: undefined variable in IF cause erroneous error-message
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP PROCEDURE IF EXISTS bug13037_p1;
|
|
|
|
DROP PROCEDURE IF EXISTS bug13037_p2;
|
|
|
|
DROP PROCEDURE IF EXISTS bug13037_p3;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE PROCEDURE bug13037_p1()
|
|
|
|
BEGIN
|
|
|
|
IF bug13037_foo THEN
|
|
|
|
SELECT 1;
|
|
|
|
END IF;
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE bug13037_p2()
|
|
|
|
BEGIN
|
|
|
|
SET @bug13037_foo = bug13037_bar;
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE bug13037_p3()
|
|
|
|
BEGIN
|
|
|
|
SELECT bug13037_foo;
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
|
|
|
|
--error 1054
|
|
|
|
CALL bug13037_p1();
|
|
|
|
--error 1054
|
|
|
|
CALL bug13037_p2();
|
|
|
|
--error 1054
|
|
|
|
CALL bug13037_p3();
|
|
|
|
|
|
|
|
--error 1054
|
|
|
|
CALL bug13037_p1();
|
|
|
|
--error 1054
|
|
|
|
CALL bug13037_p2();
|
|
|
|
--error 1054
|
|
|
|
CALL bug13037_p3();
|
|
|
|
|
|
|
|
DROP PROCEDURE bug13037_p1;
|
|
|
|
DROP PROCEDURE bug13037_p2;
|
|
|
|
DROP PROCEDURE bug13037_p3;
|
|
|
|
|
2005-11-11 19:01:48 +01:00
|
|
|
#
|
|
|
|
# Bug#14569 "editing a stored procedure kills mysqld-nt"
|
|
|
|
#
|
|
|
|
create database mysqltest1;
|
|
|
|
create database mysqltest2;
|
|
|
|
use mysqltest1;
|
|
|
|
drop database mysqltest1;
|
|
|
|
create procedure mysqltest2.p1() select version();
|
|
|
|
--error ER_NO_DB_ERROR
|
|
|
|
create procedure p2() select version();
|
|
|
|
use mysqltest2;
|
|
|
|
--replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
|
|
|
|
show procedure status;
|
|
|
|
drop database mysqltest2;
|
|
|
|
use test;
|
|
|
|
|
2005-12-02 22:59:45 +01:00
|
|
|
#
|
|
|
|
# Bug#13012 "SP: REPAIR/BACKUP/RESTORE TABLE crashes the server"
|
|
|
|
#
|
|
|
|
delimiter |;
|
|
|
|
--disable_warnings
|
|
|
|
DROP FUNCTION IF EXISTS bug13012|
|
|
|
|
--enable_warnings
|
|
|
|
--error ER_SP_NO_RETSET
|
|
|
|
CREATE FUNCTION bug13012() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
REPAIR TABLE t1;
|
|
|
|
RETURN 1;
|
|
|
|
END|
|
|
|
|
create table t1 (a int)|
|
|
|
|
CREATE PROCEDURE bug13012_1() REPAIR TABLE t1|
|
|
|
|
CREATE FUNCTION bug13012_2() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
CALL bug13012_1();
|
|
|
|
RETURN 1;
|
|
|
|
END|
|
|
|
|
--error ER_SP_NO_RETSET
|
|
|
|
SELECT bug13012_2()|
|
|
|
|
drop table t1|
|
|
|
|
drop procedure bug13012_1|
|
|
|
|
drop function bug13012_2|
|
|
|
|
delimiter ;|
|
2005-10-25 11:02:48 +02:00
|
|
|
|
2006-01-11 15:11:05 +01:00
|
|
|
#
|
2005-12-07 10:27:17 +01:00
|
|
|
# BUG#11555 "Stored procedures: current SP tables locking make
|
|
|
|
# impossible view security". We should not expose names of tables
|
|
|
|
# which are implicitly used by view (via stored routines/triggers).
|
|
|
|
#
|
|
|
|
# Note that SQL standard assumes that you simply won't be able drop table
|
|
|
|
# and leave some objects (routines/views/triggers) which were depending on
|
|
|
|
# it. Such objects should be dropped in advance (by default) or will be
|
|
|
|
# dropped simultaneously with table (DROP TABLE with CASCADE clause).
|
|
|
|
# So these tests probably should go away once we will implement standard
|
|
|
|
# behavior.
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug11555_1;
|
|
|
|
drop function if exists bug11555_2;
|
|
|
|
drop view if exists v1, v2, v3, v4;
|
|
|
|
--enable_warnings
|
|
|
|
create function bug11555_1() returns int return (select max(i) from t1);
|
|
|
|
create function bug11555_2() returns int return bug11555_1();
|
|
|
|
# It is OK to report name of implicitly used table which is missing
|
|
|
|
# when we create view.
|
2007-03-06 21:46:33 +01:00
|
|
|
# For stored functions however, because of exceptions handlers, there is
|
|
|
|
# no easy way to find out if a missing table makes the view invalid.
|
2005-12-07 10:27:17 +01:00
|
|
|
create view v1 as select bug11555_1();
|
2007-03-06 21:46:33 +01:00
|
|
|
drop view v1;
|
2005-12-07 10:27:17 +01:00
|
|
|
create view v2 as select bug11555_2();
|
2007-03-06 21:46:33 +01:00
|
|
|
drop view v2;
|
2005-12-07 10:27:17 +01:00
|
|
|
# But we should hide name of missing implicitly used table when we use view
|
|
|
|
create table t1 (i int);
|
|
|
|
create view v1 as select bug11555_1();
|
|
|
|
create view v2 as select bug11555_2();
|
|
|
|
create view v3 as select * from v1;
|
|
|
|
drop table t1;
|
|
|
|
--error ER_VIEW_INVALID
|
|
|
|
select * from v1;
|
|
|
|
--error ER_VIEW_INVALID
|
|
|
|
select * from v2;
|
|
|
|
--error ER_VIEW_INVALID
|
|
|
|
select * from v3;
|
|
|
|
# Note that creation of view which depends on broken view is yet
|
|
|
|
# another form of view usage.
|
|
|
|
create view v4 as select * from v1;
|
2007-03-06 21:46:33 +01:00
|
|
|
drop view v1, v2, v3, v4;
|
2005-12-07 10:27:17 +01:00
|
|
|
# We also should hide details about broken triggers which are
|
|
|
|
# invoked for view.
|
|
|
|
drop function bug11555_1;
|
|
|
|
drop function bug11555_2;
|
|
|
|
create table t1 (i int);
|
|
|
|
create table t2 (i int);
|
|
|
|
create trigger t1_ai after insert on t1 for each row insert into t2 values (new.i);
|
|
|
|
create view v1 as select * from t1;
|
|
|
|
drop table t2;
|
2007-03-06 21:46:33 +01:00
|
|
|
# Limitation, the desired error is ER_VIEW_INVALID
|
2007-05-18 10:29:06 +02:00
|
|
|
--error ER_NO_SUCH_TABLE
|
2005-12-07 10:27:17 +01:00
|
|
|
insert into v1 values (1);
|
|
|
|
drop trigger t1_ai;
|
|
|
|
create function bug11555_1() returns int return (select max(i) from t2);
|
|
|
|
create trigger t1_ai after insert on t1 for each row set @a:=bug11555_1();
|
2007-03-06 21:46:33 +01:00
|
|
|
# Limitation, the desired error is ER_VIEW_INVALID
|
2007-05-18 10:29:06 +02:00
|
|
|
--error ER_NO_SUCH_TABLE
|
2005-12-07 10:27:17 +01:00
|
|
|
insert into v1 values (2);
|
|
|
|
drop function bug11555_1;
|
|
|
|
drop table t1;
|
|
|
|
drop view v1;
|
|
|
|
|
2006-01-11 15:11:05 +01:00
|
|
|
#
|
|
|
|
# BUG#15658: Server crashes after creating function as empty string
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists ` bug15658`;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
--error ER_SP_WRONG_NAME
|
|
|
|
create procedure ``() select 1;
|
|
|
|
--error ER_SP_WRONG_NAME
|
|
|
|
create procedure ` `() select 1;
|
|
|
|
--error ER_SP_WRONG_NAME
|
|
|
|
create procedure `bug15658 `() select 1;
|
|
|
|
--error ER_WRONG_DB_NAME
|
|
|
|
create procedure ``.bug15658() select 1;
|
|
|
|
--error ER_WRONG_DB_NAME
|
|
|
|
create procedure `x `.bug15658() select 1;
|
2005-12-07 10:27:17 +01:00
|
|
|
|
2006-01-11 15:11:05 +01:00
|
|
|
# This should work
|
|
|
|
create procedure ` bug15658`() select 1;
|
|
|
|
call ` bug15658`();
|
|
|
|
--replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
|
|
|
|
show procedure status;
|
|
|
|
drop procedure ` bug15658`;
|
|
|
|
|
|
|
|
|
2006-01-31 16:27:57 +01:00
|
|
|
#
|
|
|
|
# BUG#14270: Stored procedures: crash if load index
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug14270;
|
|
|
|
drop table if exists t1;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
create table t1 (s1 int primary key);
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
--error ER_SP_NO_RETSET
|
|
|
|
create function bug14270() returns int
|
|
|
|
begin
|
|
|
|
load index into cache t1;
|
|
|
|
return 1;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error ER_SP_NO_RETSET
|
|
|
|
create function bug14270() returns int
|
|
|
|
begin
|
|
|
|
cache index t1 key (`primary`) in keycache1;
|
|
|
|
return 1;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
|
2006-01-31 17:00:50 +01:00
|
|
|
#
|
|
|
|
# BUG#15091: Sp Returns Unknown error in order clause....and
|
|
|
|
# there is no order by clause
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists bug15091;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
create procedure bug15091()
|
|
|
|
begin
|
|
|
|
declare selectstr varchar(6000) default ' ';
|
|
|
|
declare conditionstr varchar(5000) default '';
|
|
|
|
|
|
|
|
set selectstr = concat(selectstr,
|
|
|
|
' and ',
|
|
|
|
c.operatorid,
|
|
|
|
'in (',conditionstr, ')');
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
# The error message used to be:
|
|
|
|
# ERROR 1109 (42S02): Unknown table 'c' in order clause
|
|
|
|
# but is now rephrased to something less misleading:
|
|
|
|
# ERROR 1109 (42S02): Unknown table 'c' in field list
|
|
|
|
--error ER_UNKNOWN_TABLE
|
|
|
|
call bug15091();
|
|
|
|
|
|
|
|
drop procedure bug15091;
|
|
|
|
|
|
|
|
|
2006-02-09 13:00:32 +01:00
|
|
|
#
|
|
|
|
# BUG#16896: Stored function: unused AGGREGATE-clause in CREATE FUNCTION
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug16896;
|
|
|
|
--enable_warnings
|
|
|
|
|
Bug#28318 (CREATE FUNCTION (UDF) requires a schema) -- part II
The root cause of the issue was that the CREATE FUNCTION grammar,
for User Defined Functions, was using the sp_name rule.
The sp_name rule is intended for fully qualified stored procedure names,
like either ident.ident, or just ident but with a default database
implicitly selected.
A UDF does not have a fully qualified name, only a name (ident), and should
not use the sp_name grammar fragment during parsing.
The fix is to re-organize the CREATE FUNCTION grammar, to better separate:
- creating UDF (no definer, can have AGGREGATE, simple ident)
- creating Stored Functions (definer, no AGGREGATE, fully qualified name)
With the test case provided, another issue was exposed which is also fixed:
the DROP FUNCTION statement was using sp_name and also failing when no database
is implicitly selected, when droping UDF functions.
The fix is also to change the grammar so that DROP FUNCTION works with
both the ident.ident syntax (to drop a stored function), or just the ident
syntax (to drop either a UDF or a Stored Function, in the current database)
mysql-test/r/sp-error.result:
Adjust test results
mysql-test/r/udf.result:
Adjust test results
mysql-test/t/sp-error.test:
Adjust test results
mysql-test/t/udf.test:
Adjust test results
sql/sql_parse.cc:
CREATE UDF FUNCTION does not use a fully qualified name.
sql/sql_yacc.yy:
Fix grammar for CREATE / DROP FUNCTION, FOR udf
Improve error messages for select no_such_function()
2007-10-16 03:15:38 +02:00
|
|
|
--error ER_PARSE_ERROR
|
2006-02-09 13:00:32 +01:00
|
|
|
create aggregate function bug16896() returns int return 1;
|
|
|
|
|
2006-10-23 10:35:56 +02:00
|
|
|
#
|
2006-10-12 17:36:43 +02:00
|
|
|
#
|
2006-07-24 13:10:50 +02:00
|
|
|
# BUG#14702: misleading error message when syntax error in CREATE
|
|
|
|
# PROCEDURE
|
|
|
|
#
|
|
|
|
# Misleading error message was given when IF NOT EXISTS was used in
|
|
|
|
# CREATE PROCEDURE.
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
DROP PROCEDURE IF EXISTS bug14702;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
CREATE IF NOT EXISTS PROCEDURE bug14702()
|
|
|
|
BEGIN
|
|
|
|
END;
|
|
|
|
|
|
|
|
CREATE PROCEDURE IF NOT EXISTS bug14702()
|
|
|
|
BEGIN
|
|
|
|
END;
|
2014-12-15 14:41:15 +01:00
|
|
|
DROP PROCEDURE IF EXISTS bug14702;
|
2006-07-24 13:10:50 +02:00
|
|
|
|
2006-10-12 16:02:57 +02:00
|
|
|
#
|
|
|
|
# BUG#20953: create proc with a create view that uses local
|
|
|
|
# vars/params should fail to create
|
|
|
|
#
|
|
|
|
# See test case for what syntax is forbidden in a view.
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
CREATE TABLE t1 (i INT);
|
|
|
|
|
|
|
|
# We do not have to drop this procedure and view because they won't be
|
|
|
|
# created.
|
2016-05-23 14:25:51 +02:00
|
|
|
--error ER_PARSE_ERROR
|
2006-10-12 16:02:57 +02:00
|
|
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO @a;
|
2016-05-23 14:25:51 +02:00
|
|
|
--error ER_PARSE_ERROR
|
2006-10-12 16:02:57 +02:00
|
|
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO DUMPFILE "file";
|
2016-05-23 14:25:51 +02:00
|
|
|
--error ER_PARSE_ERROR
|
2006-10-12 16:02:57 +02:00
|
|
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO OUTFILE "file";
|
2016-05-23 14:25:51 +02:00
|
|
|
--error ER_PARSE_ERROR
|
2006-10-12 16:02:57 +02:00
|
|
|
CREATE PROCEDURE bug20953()
|
|
|
|
CREATE VIEW v AS SELECT i FROM t1 PROCEDURE ANALYSE();
|
2016-02-25 14:55:04 +01:00
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 FROM (SELECT 1) AS d1 into @w;
|
2006-10-12 16:02:57 +02:00
|
|
|
--error ER_VIEW_SELECT_VARIABLE
|
|
|
|
CREATE PROCEDURE bug20953(i INT) CREATE VIEW v AS SELECT i;
|
|
|
|
delimiter |;
|
|
|
|
--error ER_VIEW_SELECT_VARIABLE
|
|
|
|
CREATE PROCEDURE bug20953()
|
|
|
|
BEGIN
|
|
|
|
DECLARE i INT;
|
|
|
|
CREATE VIEW v AS SELECT i;
|
|
|
|
END |
|
|
|
|
delimiter ;|
|
|
|
|
--error ER_VIEW_SELECT_VARIABLE
|
|
|
|
PREPARE stmt FROM "CREATE VIEW v AS SELECT ?";
|
|
|
|
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
|
|
|
|
2007-01-24 08:46:25 +01:00
|
|
|
#
|
|
|
|
# BUG#24491 "using alias from source table in insert ... on duplicate key"
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop tables if exists t1;
|
|
|
|
drop procedure if exists bug24491;
|
|
|
|
--enable_warnings
|
|
|
|
create table t1 (id int primary key auto_increment, value varchar(10));
|
|
|
|
insert into t1 (id, value) values (1, 'FIRST'), (2, 'SECOND'), (3, 'THIRD');
|
|
|
|
# Let us create routine with INSERT ... SELECT ... ON DUPLICATE KEY UPDATE
|
|
|
|
# statement which in its ON DUPLICATE KEY clause erroneously tries to assign
|
|
|
|
# value to a column which is mentioned only in SELECT part.
|
|
|
|
create procedure bug24491()
|
|
|
|
insert into t1 (id, value) select * from (select 4 as i, 'FOURTH' as v) as y on duplicate key update v = 'DUP';
|
|
|
|
# Both first and second calls to it should fail
|
|
|
|
--error ER_BAD_FIELD_ERROR
|
|
|
|
call bug24491();
|
|
|
|
--error ER_BAD_FIELD_ERROR
|
|
|
|
call bug24491();
|
|
|
|
drop procedure bug24491;
|
|
|
|
# And now the same test for more complex case which is more close
|
|
|
|
# to the one that was reported originally.
|
|
|
|
create procedure bug24491()
|
|
|
|
insert into t1 (id, value) select * from (select 4 as id, 'FOURTH' as value) as y on duplicate key update y.value = 'DUP';
|
|
|
|
--error ER_BAD_FIELD_ERROR
|
|
|
|
call bug24491();
|
|
|
|
--error ER_BAD_FIELD_ERROR
|
|
|
|
call bug24491();
|
|
|
|
drop procedure bug24491;
|
|
|
|
drop tables t1;
|
|
|
|
|
2007-03-06 21:46:33 +01:00
|
|
|
#
|
|
|
|
# BUG#18914: Calling certain SPs from triggers fail
|
|
|
|
#
|
|
|
|
# Failing to call a procedure that does implicit commit from a trigger
|
|
|
|
# is a correct behaviour, however the error message was misleading.
|
|
|
|
#
|
|
|
|
# DROP TABLE IF EXISTS is also fixed to give correct error instead of
|
|
|
|
# "Table doesn't exist".
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
DROP FUNCTION IF EXISTS bug18914_f1;
|
|
|
|
DROP FUNCTION IF EXISTS bug18914_f2;
|
|
|
|
DROP PROCEDURE IF EXISTS bug18914_p1;
|
|
|
|
DROP PROCEDURE IF EXISTS bug18914_p2;
|
|
|
|
DROP TABLE IF EXISTS t1, t2;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
CREATE TABLE t1 (i INT);
|
|
|
|
|
|
|
|
CREATE PROCEDURE bug18914_p1() CREATE TABLE t2 (i INT);
|
|
|
|
CREATE PROCEDURE bug18914_p2() DROP TABLE IF EXISTS no_such_table;
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
CREATE FUNCTION bug18914_f1() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
CALL bug18914_p1();
|
|
|
|
RETURN 1;
|
|
|
|
END |
|
|
|
|
|
|
|
|
CREATE FUNCTION bug18914_f2() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
CALL bug18914_p2();
|
|
|
|
RETURN 1;
|
|
|
|
END |
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
|
|
|
|
CALL bug18914_p1();
|
|
|
|
|
|
|
|
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
INSERT INTO t1 VALUES (1);
|
|
|
|
|
|
|
|
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
SELECT bug18914_f1();
|
|
|
|
|
|
|
|
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
|
|
|
SELECT bug18914_f2();
|
|
|
|
|
|
|
|
--error ER_NO_SUCH_TABLE
|
|
|
|
SELECT * FROM t2;
|
|
|
|
|
|
|
|
DROP FUNCTION bug18914_f1;
|
|
|
|
DROP FUNCTION bug18914_f2;
|
|
|
|
DROP PROCEDURE bug18914_p1;
|
|
|
|
DROP PROCEDURE bug18914_p2;
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
|
|
|
#
|
|
|
|
# Bug#20713 (Functions will not not continue for SQLSTATE VALUE '42S02')
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop table if exists bogus_table_20713;
|
|
|
|
drop function if exists func_20713_a;
|
|
|
|
drop function if exists func_20713_b;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
create table bogus_table_20713( id int(10) not null primary key);
|
|
|
|
insert into bogus_table_20713 values (1), (2), (3);
|
|
|
|
|
|
|
|
delimiter //;
|
|
|
|
|
|
|
|
create function func_20713_a() returns int(11)
|
|
|
|
begin
|
|
|
|
declare id int;
|
|
|
|
|
|
|
|
declare continue handler for sqlexception set id=null;
|
|
|
|
|
|
|
|
set @in_func := 1;
|
|
|
|
set id = (select id from bogus_table_20713 where id = 3);
|
|
|
|
set @in_func := 2;
|
|
|
|
|
|
|
|
return id;
|
|
|
|
end//
|
|
|
|
|
|
|
|
create function func_20713_b() returns int(11)
|
|
|
|
begin
|
|
|
|
declare id int;
|
|
|
|
|
|
|
|
declare continue handler for sqlstate value '42S02' set id=null;
|
|
|
|
|
|
|
|
set @in_func := 1;
|
|
|
|
set id = (select id from bogus_table_20713 where id = 3);
|
|
|
|
set @in_func := 2;
|
|
|
|
|
|
|
|
return id;
|
|
|
|
end//
|
|
|
|
|
|
|
|
delimiter ;//
|
|
|
|
|
|
|
|
set @in_func := 0;
|
|
|
|
select func_20713_a();
|
|
|
|
select @in_func;
|
|
|
|
|
|
|
|
set @in_func := 0;
|
|
|
|
select func_20713_b();
|
|
|
|
select @in_func;
|
|
|
|
|
|
|
|
drop table bogus_table_20713;
|
|
|
|
|
|
|
|
set @in_func := 0;
|
|
|
|
select func_20713_a();
|
|
|
|
select @in_func;
|
|
|
|
|
|
|
|
set @in_func := 0;
|
|
|
|
select func_20713_b();
|
|
|
|
select @in_func;
|
|
|
|
|
|
|
|
drop function if exists func_20713_a;
|
|
|
|
drop function if exists func_20713_b;
|
|
|
|
|
|
|
|
#
|
|
|
|
# Bug#25345 (Cursors from Functions)
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop table if exists table_25345_a;
|
|
|
|
drop table if exists table_25345_b;
|
|
|
|
drop procedure if exists proc_25345;
|
|
|
|
drop function if exists func_25345;
|
|
|
|
drop function if exists func_25345_b;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
create table table_25345_a (a int);
|
|
|
|
create table table_25345_b (b int);
|
|
|
|
|
|
|
|
delimiter ||;
|
|
|
|
|
|
|
|
create procedure proc_25345()
|
|
|
|
begin
|
|
|
|
declare c1 cursor for select a from table_25345_a;
|
|
|
|
declare c2 cursor for select b from table_25345_b;
|
|
|
|
|
|
|
|
select 1 as result;
|
|
|
|
end ||
|
|
|
|
|
|
|
|
create function func_25345() returns int(11)
|
|
|
|
begin
|
|
|
|
call proc_25345();
|
|
|
|
return 1;
|
|
|
|
end ||
|
|
|
|
|
|
|
|
create function func_25345_b() returns int(11)
|
|
|
|
begin
|
|
|
|
declare c1 cursor for select a from table_25345_a;
|
|
|
|
declare c2 cursor for select b from table_25345_b;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
end ||
|
|
|
|
|
|
|
|
delimiter ;||
|
|
|
|
|
|
|
|
call proc_25345();
|
|
|
|
--error ER_SP_NO_RETSET
|
|
|
|
select func_25345();
|
|
|
|
select func_25345_b();
|
|
|
|
|
|
|
|
drop table table_25345_a;
|
|
|
|
|
|
|
|
call proc_25345();
|
|
|
|
--error ER_SP_NO_RETSET
|
|
|
|
select func_25345();
|
|
|
|
select func_25345_b();
|
|
|
|
|
|
|
|
drop table table_25345_b;
|
|
|
|
drop procedure proc_25345;
|
|
|
|
drop function func_25345;
|
|
|
|
drop function func_25345_b;
|
2007-01-24 08:46:25 +01:00
|
|
|
|
2006-10-12 16:30:59 +02:00
|
|
|
#
|
|
|
|
# End of 5.0 tests
|
|
|
|
#
|
|
|
|
--echo End of 5.0 tests
|
|
|
|
|
|
|
|
#
|
|
|
|
# Bug#16164 "Easter egg": check that SHOW AUTHORS is disabled in
|
|
|
|
# stored functions/triggers
|
|
|
|
#
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists bug16164;
|
|
|
|
--enable_warnings
|
|
|
|
delimiter |;
|
|
|
|
--error ER_SP_NO_RETSET
|
|
|
|
create function bug16164() returns int
|
|
|
|
begin
|
|
|
|
show authors;
|
|
|
|
return 42;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
|
2006-08-09 17:07:59 +02:00
|
|
|
#
|
|
|
|
# BUG#20701: BINARY keyword should be forbidden in stored routines
|
|
|
|
#
|
|
|
|
--disable_warnings
|
2006-10-12 16:30:59 +02:00
|
|
|
drop function if exists bug20701;
|
2006-08-09 17:07:59 +02:00
|
|
|
--enable_warnings
|
2006-10-12 16:30:59 +02:00
|
|
|
create function bug20701() returns varchar(25) binary return "test";
|
2014-11-08 17:37:19 +01:00
|
|
|
drop function bug20701;
|
2006-10-12 16:30:59 +02:00
|
|
|
create function bug20701() returns varchar(25) return "test";
|
|
|
|
drop function bug20701;
|
|
|
|
|
Bug#26503 (Illegal SQL exception handler code causes the server to crash)
Before this fix, the parser would accept illegal code in SQL exceptions
handlers, that later causes the runtime to crash when executing the code,
due to memory violations in the exception handler stack.
The root cause of the problem is instructions within an exception handler
that jumps to code located outside of the handler. This is illegal according
to the SQL 2003 standard, since labels located outside the handler are not
supposed to be visible (they are "out of scope"), so any instruction that
jumps to these labels, like ITERATE or LEAVE, should not parse.
The section of the standard that is relevant for this is :
SQL:2003 SQL/PSM (ISO/IEC 9075-4:2003)
section 13.1 <compound statement>,
syntax rule 4
<quote>
The scope of the <beginning label> is CS excluding every <SQL schema
statement> contained in CS and excluding every
<local handler declaration list> contained in CS. <beginning label> shall
not be equivalent to any other <beginning label>s within that scope.
</quote>
With this fix, the C++ class sp_pcontext, which represent the "parsing
context" tree (a.k.a symbol table) of a stored procedure, has been changed
as follows:
- constructors have been cleaned up, so that only building a root node for
the tree is public; building nodes inside a tree is not public.
- a new member, m_label_scope, indicates if a given syntactic context
belongs to a DECLARE HANDLER block,
- label resolution, in the method find_label(), has been changed to
implement the restriction of scope regarding labels used in a compound
statement.
The actions in the parser, when parsing the body of a SQL exception handler,
have been changed as follows:
- the implementation of an exception handler (DECLARE HANDLER) now creates
explicitly a new sp_pcontext, to isolate the code inside the handler from
the containing compound statement context.
- registering exception handlers as a result occurs in the parent context,
see the rule sp_hcond_element
- the code in sp_hcond_list has been cleaned up, to avoid code duplication
In addition, the flags IN_SIMPLE_CASE and IN_HANDLER, declared in sp_head.h
have been removed, since they are unused and broken by design (as seen with
Bug 19194 (Right recursion in parser for CASE causes excessive stack usage,
limitation), representing a stack in a single flag is not possible.
Tests in sp-error have been added to show that illegal constructs are now
rejected.
Tests in sp have been added for code coverage, to show that ITERATE or LEAVE
statements are legal when jumping to a label in scope, inside the body of
an exception handler.
mysql-test/r/sp-error.result:
SQL Exception handlers define a parsing context for label resolution.
mysql-test/r/sp.result:
SQL Exception handlers define a parsing context for label resolution.
mysql-test/t/sp-error.test:
SQL Exception handlers define a parsing context for label resolution.
mysql-test/t/sp.test:
SQL Exception handlers define a parsing context for label resolution.
sql/sp_head.cc:
Minor cleanup
sql/sp_head.h:
Minor cleanup
sql/sp_pcontext.cc:
SQL Exception handlers define a parsing context for label resolution.
sql/sp_pcontext.h:
SQL Exception handlers define a parsing context for label resolution.
sql/sql_yacc.yy:
SQL Exception handlers define a parsing context for label resolution.
2007-03-14 19:02:32 +01:00
|
|
|
#
|
|
|
|
# Bug#26503 (Illegal SQL exception handler code causes the server to crash)
|
|
|
|
#
|
|
|
|
|
|
|
|
delimiter //;
|
|
|
|
|
|
|
|
--error ER_SP_LILABEL_MISMATCH
|
|
|
|
create procedure proc_26503_error_1()
|
|
|
|
begin
|
|
|
|
retry:
|
|
|
|
repeat
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlexception
|
|
|
|
begin
|
|
|
|
iterate retry;
|
|
|
|
end
|
|
|
|
|
|
|
|
select "do something";
|
|
|
|
end
|
|
|
|
until true end repeat retry;
|
|
|
|
end//
|
|
|
|
|
|
|
|
--error ER_SP_LILABEL_MISMATCH
|
|
|
|
create procedure proc_26503_error_2()
|
|
|
|
begin
|
|
|
|
retry:
|
|
|
|
repeat
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlexception
|
|
|
|
iterate retry;
|
|
|
|
|
|
|
|
select "do something";
|
|
|
|
end
|
|
|
|
until true end repeat retry;
|
|
|
|
end//
|
|
|
|
|
|
|
|
--error ER_SP_LILABEL_MISMATCH
|
|
|
|
create procedure proc_26503_error_3()
|
|
|
|
begin
|
|
|
|
retry:
|
|
|
|
repeat
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlexception
|
|
|
|
begin
|
|
|
|
leave retry;
|
|
|
|
end
|
|
|
|
|
|
|
|
select "do something";
|
|
|
|
end
|
|
|
|
until true end repeat retry;
|
|
|
|
end//
|
|
|
|
|
|
|
|
--error ER_SP_LILABEL_MISMATCH
|
|
|
|
create procedure proc_26503_error_4()
|
|
|
|
begin
|
|
|
|
retry:
|
|
|
|
repeat
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlexception
|
|
|
|
leave retry;
|
|
|
|
|
|
|
|
select "do something";
|
|
|
|
end
|
|
|
|
until true end repeat retry;
|
|
|
|
end//
|
|
|
|
|
|
|
|
delimiter ;//
|
|
|
|
|
2007-09-11 00:10:37 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# Bug#28360 (RENAME DATABASE destroys routines)
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists proc_28360;
|
|
|
|
drop function if exists func_28360;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter //;
|
|
|
|
|
|
|
|
--error ER_SP_NO_DROP_SP
|
|
|
|
CREATE PROCEDURE proc_28360()
|
|
|
|
BEGIN
|
|
|
|
ALTER DATABASE `#mysql50#upgrade-me` UPGRADE DATA DIRECTORY NAME;
|
|
|
|
END//
|
|
|
|
|
|
|
|
--error ER_SP_NO_DROP_SP
|
|
|
|
CREATE FUNCTION func_28360() RETURNS int
|
|
|
|
BEGIN
|
|
|
|
ALTER DATABASE `#mysql50#upgrade-me` UPGRADE DATA DIRECTORY NAME;
|
|
|
|
RETURN 0;
|
|
|
|
END//
|
|
|
|
|
|
|
|
delimiter ;//
|
|
|
|
|
|
|
|
|
2007-10-11 22:38:40 +02:00
|
|
|
#
|
|
|
|
# Bug#29223 declare cursor c for SHOW .....
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
|
|
--enable_warnings
|
|
|
|
--delimiter |
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE c char(100);
|
|
|
|
DECLARE cur1 CURSOR FOR SHOW TABLES;
|
|
|
|
|
|
|
|
OPEN cur1;
|
|
|
|
FETCH cur1 INTO c;
|
|
|
|
select c;
|
|
|
|
CLOSE cur1;
|
|
|
|
END|
|
|
|
|
--delimiter ;
|
|
|
|
|
2007-10-10 01:46:33 +02:00
|
|
|
#
|
|
|
|
# Bug#29816 Syntactically wrong query fails with misleading error message
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP DATABASE IF EXISTS mysqltest;
|
|
|
|
--enable_warnings
|
|
|
|
CREATE DATABASE mysqltest;
|
|
|
|
USE mysqltest;
|
|
|
|
DROP DATABASE mysqltest;
|
Bug#28318 (CREATE FUNCTION (UDF) requires a schema) -- part II
The root cause of the issue was that the CREATE FUNCTION grammar,
for User Defined Functions, was using the sp_name rule.
The sp_name rule is intended for fully qualified stored procedure names,
like either ident.ident, or just ident but with a default database
implicitly selected.
A UDF does not have a fully qualified name, only a name (ident), and should
not use the sp_name grammar fragment during parsing.
The fix is to re-organize the CREATE FUNCTION grammar, to better separate:
- creating UDF (no definer, can have AGGREGATE, simple ident)
- creating Stored Functions (definer, no AGGREGATE, fully qualified name)
With the test case provided, another issue was exposed which is also fixed:
the DROP FUNCTION statement was using sp_name and also failing when no database
is implicitly selected, when droping UDF functions.
The fix is also to change the grammar so that DROP FUNCTION works with
both the ident.ident syntax (to drop a stored function), or just the ident
syntax (to drop either a UDF or a Stored Function, in the current database)
mysql-test/r/sp-error.result:
Adjust test results
mysql-test/r/udf.result:
Adjust test results
mysql-test/t/sp-error.test:
Adjust test results
mysql-test/t/udf.test:
Adjust test results
sql/sql_parse.cc:
CREATE UDF FUNCTION does not use a fully qualified name.
sql/sql_yacc.yy:
Fix grammar for CREATE / DROP FUNCTION, FOR udf
Improve error messages for select no_such_function()
2007-10-16 03:15:38 +02:00
|
|
|
# Both ER_SP_DOES_NOT_EXIST and ER_PARSE_ERROR are valid here,
|
|
|
|
# the result is implementation dependent:
|
|
|
|
# See Bug#29816 for details
|
|
|
|
--error ER_SP_DOES_NOT_EXIST
|
2007-10-10 01:46:33 +02:00
|
|
|
SELECT inexistent(), 1 + ,;
|
|
|
|
--error ER_SP_DOES_NOT_EXIST
|
|
|
|
SELECT inexistent();
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SELECT .inexistent();
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
SELECT ..inexistent();
|
|
|
|
USE test;
|
|
|
|
|
2007-10-30 23:51:04 +01:00
|
|
|
#
|
|
|
|
# Bug#30904 SET PASSWORD statement is non-transactional
|
|
|
|
#
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
|
|
|
create function f1() returns int
|
|
|
|
begin
|
|
|
|
set @test = 1, password = password('foo');
|
|
|
|
return 1;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
|
|
|
create trigger t1
|
2007-11-01 21:52:56 +01:00
|
|
|
before insert on t2 for each row set password = password('foo');|
|
2007-10-30 23:51:04 +01:00
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
2007-11-01 21:52:56 +01:00
|
|
|
#
|
|
|
|
# Bug#30882 Dropping a temporary table inside a stored function may cause a server crash
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop function if exists f1;
|
|
|
|
drop function if exists f2;
|
|
|
|
drop table if exists t1, t2;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
create function f1() returns int
|
|
|
|
begin
|
|
|
|
drop temporary table t1;
|
|
|
|
return 1;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
2016-06-10 22:58:08 +02:00
|
|
|
--error ER_BAD_TABLE_ERROR
|
2007-11-01 21:52:56 +01:00
|
|
|
create temporary table t1 as select f1();
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
create function f2() returns int
|
|
|
|
begin
|
|
|
|
create temporary table t2 as select f1();
|
|
|
|
return 1;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
2016-06-10 22:58:08 +02:00
|
|
|
--error ER_BAD_TABLE_ERROR
|
2007-11-01 21:52:56 +01:00
|
|
|
create temporary table t1 as select f2();
|
|
|
|
|
|
|
|
drop function f1;
|
|
|
|
drop function f2;
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
create function f1() returns int
|
|
|
|
begin
|
|
|
|
drop temporary table t2,t1;
|
|
|
|
return 1;
|
|
|
|
end|
|
|
|
|
create function f2() returns int
|
|
|
|
begin
|
|
|
|
create temporary table t2 as select f1();
|
|
|
|
return 1;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
2016-06-10 22:58:08 +02:00
|
|
|
--error ER_BAD_TABLE_ERROR
|
2007-11-01 21:52:56 +01:00
|
|
|
create temporary table t1 as select f2();
|
|
|
|
|
|
|
|
drop function f1;
|
|
|
|
drop function f2;
|
|
|
|
|
|
|
|
create temporary table t2(a int);
|
|
|
|
select * from t2;
|
|
|
|
delimiter |;
|
|
|
|
create function f2() returns int
|
|
|
|
begin
|
|
|
|
drop temporary table t2;
|
|
|
|
return 1;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
|
|
|
select f2();
|
|
|
|
|
|
|
|
drop function f2;
|
|
|
|
--error ER_BAD_TABLE_ERROR
|
|
|
|
drop table t2;
|
|
|
|
|
|
|
|
--echo End of 5.1 tests
|
|
|
|
|
2008-01-24 00:21:09 +01:00
|
|
|
#
|
|
|
|
# Bug#33983 (Stored Procedures: wrong end <label> syntax is accepted)
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists proc_33983_a;
|
|
|
|
drop procedure if exists proc_33983_b;
|
|
|
|
drop procedure if exists proc_33983_c;
|
|
|
|
drop procedure if exists proc_33983_d;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
--error ER_SP_LABEL_MISMATCH
|
|
|
|
create procedure proc_33983_a()
|
|
|
|
begin
|
|
|
|
label1:
|
|
|
|
begin
|
|
|
|
label2:
|
|
|
|
begin
|
|
|
|
select 1;
|
|
|
|
end label1;
|
|
|
|
end;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error ER_SP_LABEL_MISMATCH
|
|
|
|
create procedure proc_33983_b()
|
|
|
|
begin
|
|
|
|
label1:
|
|
|
|
repeat
|
|
|
|
label2:
|
|
|
|
repeat
|
|
|
|
select 1;
|
|
|
|
until FALSE end repeat label1;
|
|
|
|
until FALSE end repeat;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error ER_SP_LABEL_MISMATCH
|
|
|
|
create procedure proc_33983_c()
|
|
|
|
begin
|
|
|
|
label1:
|
|
|
|
while TRUE do
|
|
|
|
label2:
|
|
|
|
while TRUE do
|
|
|
|
select 1;
|
|
|
|
end while label1;
|
|
|
|
end while;
|
|
|
|
end|
|
|
|
|
|
|
|
|
--error ER_SP_LABEL_MISMATCH
|
|
|
|
create procedure proc_33983_d()
|
|
|
|
begin
|
|
|
|
label1:
|
|
|
|
loop
|
|
|
|
label2:
|
|
|
|
loop
|
|
|
|
select 1;
|
|
|
|
end loop label1;
|
|
|
|
end loop;
|
|
|
|
end|
|
|
|
|
|
2008-09-29 16:11:34 +02:00
|
|
|
CREATE TABLE t1 (a INT)|
|
|
|
|
INSERT INTO t1 VALUES (1),(2)|
|
|
|
|
CREATE PROCEDURE p1(a INT) BEGIN END|
|
|
|
|
--error ER_SUBQUERY_NO_1_ROW
|
|
|
|
CALL p1((SELECT * FROM t1))|
|
|
|
|
DROP PROCEDURE IF EXISTS p1|
|
|
|
|
DROP TABLE t1|
|
|
|
|
|
2008-01-24 00:21:09 +01:00
|
|
|
delimiter ;|
|
|
|
|
|
2008-02-04 19:39:55 +01:00
|
|
|
#
|
|
|
|
# Bug#21801: SQL exception handlers and warnings
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists p1;
|
|
|
|
--enable_warnings
|
|
|
|
delimiter |;
|
|
|
|
create procedure p1()
|
|
|
|
begin
|
2009-11-04 13:28:20 +01:00
|
|
|
create table t1 (a int) engine=MyISAM;
|
2008-02-04 19:39:55 +01:00
|
|
|
drop table t1;
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
|
|
|
call p1();
|
|
|
|
call p1();
|
|
|
|
drop procedure p1;
|
|
|
|
|
2008-03-21 19:08:04 +01:00
|
|
|
#
|
|
|
|
# Bug#8759 (Stored Procedures: SQLSTATE '00000' should be illegal)
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists proc_8759;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter $$;
|
|
|
|
|
|
|
|
--error ER_SP_BAD_SQLSTATE
|
|
|
|
create procedure proc_8759()
|
|
|
|
begin
|
|
|
|
declare should_be_illegal condition for sqlstate '00000';
|
|
|
|
declare continue handler for should_be_illegal set @x=0;
|
|
|
|
end$$
|
|
|
|
|
|
|
|
--error ER_SP_BAD_SQLSTATE
|
|
|
|
create procedure proc_8759()
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlstate '00000' set @x=0;
|
|
|
|
end$$
|
|
|
|
|
|
|
|
delimiter ;$$
|
|
|
|
|
2009-11-20 23:42:57 +01:00
|
|
|
#
|
|
|
|
# Bug#36510 (Stored Procedures: mysql_error_code 0 should be illegal)
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists proc_36510;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter $$;
|
|
|
|
|
|
|
|
--error ER_SP_BAD_SQLSTATE
|
|
|
|
create procedure proc_36510()
|
|
|
|
begin
|
|
|
|
declare should_be_illegal condition for sqlstate '00123';
|
|
|
|
declare continue handler for should_be_illegal set @x=0;
|
|
|
|
end$$
|
|
|
|
|
|
|
|
--error ER_SP_BAD_SQLSTATE
|
|
|
|
create procedure proc_36510()
|
|
|
|
begin
|
|
|
|
declare continue handler for sqlstate '00123' set @x=0;
|
|
|
|
end$$
|
|
|
|
|
|
|
|
--error ER_WRONG_VALUE
|
|
|
|
create procedure proc_36510()
|
|
|
|
begin
|
|
|
|
declare should_be_illegal condition for 0;
|
|
|
|
declare continue handler for should_be_illegal set @x=0;
|
|
|
|
end$$
|
|
|
|
|
|
|
|
--error ER_WRONG_VALUE
|
|
|
|
create procedure proc_36510()
|
|
|
|
begin
|
|
|
|
declare continue handler for 0 set @x=0;
|
|
|
|
end$$
|
|
|
|
delimiter ;$$
|
|
|
|
|
2009-11-10 21:31:28 +01:00
|
|
|
#
|
|
|
|
# Bug#15192: "fatal errors" are caught by handlers in stored procedures
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop procedure if exists p1;
|
|
|
|
--enable_warnings
|
|
|
|
set @old_recursion_depth = @@max_sp_recursion_depth;
|
|
|
|
set @@max_sp_recursion_depth = 255;
|
|
|
|
delimiter |;
|
|
|
|
create procedure p1(a int)
|
|
|
|
begin
|
2009-11-13 13:56:38 +01:00
|
|
|
declare continue handler for 1436 -- ER_STACK_OVERRUN_NEED_MORE
|
|
|
|
select 'exception';
|
2009-11-10 21:31:28 +01:00
|
|
|
call p1(a+1);
|
|
|
|
end|
|
|
|
|
delimiter ;|
|
2009-11-13 13:56:38 +01:00
|
|
|
--error 0,ER_STACK_OVERRUN_NEED_MORE,ER_SP_RECURSION_LIMIT
|
2009-11-10 21:31:28 +01:00
|
|
|
call p1(1);
|
|
|
|
set @@max_sp_recursion_depth = @old_recursion_depth;
|
|
|
|
drop procedure p1;
|
2008-03-21 19:08:04 +01:00
|
|
|
|
2006-01-11 15:11:05 +01:00
|
|
|
#
|
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).
mysql-test/r/not_embedded_server.result:
Since we don't want to log Dynamic SQL in stored procedures,
now the general log gets only one log entry per SQL statement.
mysql-test/r/sp-error.result:
- remove obsolete tests
- a better error message for the case when a stored procedure that
returns a result set is called from a function
mysql-test/r/trigger.result:
- a better error message for the case when a stored procedure that
returns a result set is called from a trigger
mysql-test/t/sp-error.test:
- a better error message for the case when a stored procedure that
returns a result set is called from a function.
- move the comment to its place (end of file).
mysql-test/t/trigger.test:
- a better error message for the case when a stored procedure that
returns a result set is called from a trigger
sql/item_func.cc:
- we need to pass sql_command explicitly to get_var_with_binlog, because
when creating a query for SQL prepared statement thd->lex->sql_command
points at SQLCOM_EXECUTE, which is not listed in the list of update
queries.
sql/log_event.h:
- remove an extra copy of the previous sentence
sql/mysql_priv.h:
- fix declarations of sql_prepare.cc API
sql/share/errmsg.txt:
- a new error message, when one attempts to execute a prepared statement
which is currently being executed (this can happen only in Dynamic SQL
at the moment).
sql/sp_head.cc:
- extend sp_multi_results_command to return different flags for a
command (and rename it)
- add support for SQLCOM_PREPARE,SQLCOM_EXECUTE, SQLCOM_DEALLOCATE
to sp_get_flags_for_command
- replace multiple boolean sp_head members with uint m_flags
- a fix for a crash when user variables are used in a stored procedure
and binlog is on. A temporary fix for Bug#12637 "SP crashes the server
if it has update query with user var & binlog is enabled", which actually
stands for stored functions: now instead of a crash we break
replication if a user variable is used in a stored function which
is executed in prelocked mode.
sql/sp_head.h:
- replace multiple boolean flags of sp_head with uint m_flags;
- add flag CONTAINS_DYNAMIC_SQL
- use this flag to error if a stored procedure with Dynamic SQL is
called from a function or trigger.
sql/sql_class.cc:
- Statement_map::insert should not delete a statement if it exists,
now it's done externally to be able to handle the case when the
statement being deleted is in use.
- remove extra code (free_list is already reset in free_items)
sql/sql_lex.cc:
- add lex->stmt_prepare_mode; we can't rely on thd->command any more,
because we don't reset it any more (Dynamic SQL requirement is that
PS are as little intrusive as possible).
sql/sql_lex.h:
- declare bool LEX::stmt_prepare_mode
sql/sql_parse.cc:
- move prepared statement code to sql_prepare.cc
- change declarations (refactored code)
- better error message when one attempts to use Dynamic SQL or a
stored procedure that returns a result set in a function or trigger.
sql/sql_prepare.cc:
- major refactoring to ensure PREPARE/EXECUTE commands do not reset global THD
state and allow their use in stored procedures.
- add Prepared_statement::flags and use it to ensure no recursive execution
of a prepared statement is possible
- better comments
sql/sql_yacc.yy:
- enable PREPARE/EXECUTE/DEALLOCATE in stored procedures
- produce an error message on attempt to use PREPARE/EXECUTE/DEALLOCATE
in a stored function or trigger
mysql-test/r/sp-dynamic.result:
- sp-dynamic.test results
mysql-test/t/sp-dynamic.test:
- a new test for PREPARE/EXECUTE/DEALLOCATE in stored procedures.
2005-09-03 01:13:18 +02:00
|
|
|
# BUG#NNNN: New bug synopsis
|
|
|
|
#
|
|
|
|
#--disable_warnings
|
2006-10-12 16:30:59 +02:00
|
|
|
#drop procedure if exists bugNNNN;
|
|
|
|
#drop function if exists bugNNNN;
|
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).
mysql-test/r/not_embedded_server.result:
Since we don't want to log Dynamic SQL in stored procedures,
now the general log gets only one log entry per SQL statement.
mysql-test/r/sp-error.result:
- remove obsolete tests
- a better error message for the case when a stored procedure that
returns a result set is called from a function
mysql-test/r/trigger.result:
- a better error message for the case when a stored procedure that
returns a result set is called from a trigger
mysql-test/t/sp-error.test:
- a better error message for the case when a stored procedure that
returns a result set is called from a function.
- move the comment to its place (end of file).
mysql-test/t/trigger.test:
- a better error message for the case when a stored procedure that
returns a result set is called from a trigger
sql/item_func.cc:
- we need to pass sql_command explicitly to get_var_with_binlog, because
when creating a query for SQL prepared statement thd->lex->sql_command
points at SQLCOM_EXECUTE, which is not listed in the list of update
queries.
sql/log_event.h:
- remove an extra copy of the previous sentence
sql/mysql_priv.h:
- fix declarations of sql_prepare.cc API
sql/share/errmsg.txt:
- a new error message, when one attempts to execute a prepared statement
which is currently being executed (this can happen only in Dynamic SQL
at the moment).
sql/sp_head.cc:
- extend sp_multi_results_command to return different flags for a
command (and rename it)
- add support for SQLCOM_PREPARE,SQLCOM_EXECUTE, SQLCOM_DEALLOCATE
to sp_get_flags_for_command
- replace multiple boolean sp_head members with uint m_flags
- a fix for a crash when user variables are used in a stored procedure
and binlog is on. A temporary fix for Bug#12637 "SP crashes the server
if it has update query with user var & binlog is enabled", which actually
stands for stored functions: now instead of a crash we break
replication if a user variable is used in a stored function which
is executed in prelocked mode.
sql/sp_head.h:
- replace multiple boolean flags of sp_head with uint m_flags;
- add flag CONTAINS_DYNAMIC_SQL
- use this flag to error if a stored procedure with Dynamic SQL is
called from a function or trigger.
sql/sql_class.cc:
- Statement_map::insert should not delete a statement if it exists,
now it's done externally to be able to handle the case when the
statement being deleted is in use.
- remove extra code (free_list is already reset in free_items)
sql/sql_lex.cc:
- add lex->stmt_prepare_mode; we can't rely on thd->command any more,
because we don't reset it any more (Dynamic SQL requirement is that
PS are as little intrusive as possible).
sql/sql_lex.h:
- declare bool LEX::stmt_prepare_mode
sql/sql_parse.cc:
- move prepared statement code to sql_prepare.cc
- change declarations (refactored code)
- better error message when one attempts to use Dynamic SQL or a
stored procedure that returns a result set in a function or trigger.
sql/sql_prepare.cc:
- major refactoring to ensure PREPARE/EXECUTE commands do not reset global THD
state and allow their use in stored procedures.
- add Prepared_statement::flags and use it to ensure no recursive execution
of a prepared statement is possible
- better comments
sql/sql_yacc.yy:
- enable PREPARE/EXECUTE/DEALLOCATE in stored procedures
- produce an error message on attempt to use PREPARE/EXECUTE/DEALLOCATE
in a stored function or trigger
mysql-test/r/sp-dynamic.result:
- sp-dynamic.test results
mysql-test/t/sp-dynamic.test:
- a new test for PREPARE/EXECUTE/DEALLOCATE in stored procedures.
2005-09-03 01:13:18 +02:00
|
|
|
#--enable_warnings
|
|
|
|
#create procedure bugNNNN...
|
2006-08-09 17:07:59 +02:00
|
|
|
#create function bugNNNN...
|
2008-04-08 16:51:26 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# CLEANUP and RESTORE
|
|
|
|
#
|
|
|
|
LOAD DATA INFILE '../../tmp/proc.txt' INTO TABLE mysql.proc;
|
|
|
|
remove_file $MYSQLTEST_VARDIR/tmp/proc.txt;
|
2009-05-27 15:05:29 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# Bug #38159: Function parsing problem generates misleading error message
|
|
|
|
#
|
|
|
|
|
|
|
|
CREATE TABLE t1 (a INT, b INT);
|
|
|
|
INSERT INTO t1 VALUES (1,1), (2,2);
|
|
|
|
--error ER_FUNC_INEXISTENT_NAME_COLLISION
|
|
|
|
SELECT MAX (a) FROM t1 WHERE b = 999999;
|
|
|
|
SELECT AVG (a) FROM t1 WHERE b = 999999;
|
|
|
|
--error ER_SP_DOES_NOT_EXIST
|
|
|
|
SELECT non_existent (a) FROM t1 WHERE b = 999999;
|
|
|
|
DROP TABLE t1;
|
2009-10-19 15:55:04 +02:00
|
|
|
|
2009-12-10 16:22:41 +01:00
|
|
|
|
|
|
|
#
|
|
|
|
# Bug #46374 crash, INSERT INTO t1 uses function, function modifies t1
|
|
|
|
#
|
|
|
|
CREATE TABLE t1 ( f2 INTEGER, f3 INTEGER );
|
|
|
|
INSERT INTO t1 VALUES ( 1, 1 );
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE FUNCTION func_1 () RETURNS INTEGER
|
|
|
|
BEGIN
|
|
|
|
INSERT INTO t1 SELECT * FROM t1 ;
|
|
|
|
RETURN 1 ;
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
# The bug caused the following INSERT statement to trigger
|
|
|
|
# an assertion. Error 1442 is the correct response
|
|
|
|
#
|
|
|
|
--error 1442
|
|
|
|
INSERT INTO t1 SELECT * FROM (SELECT 2 AS f1, 2 AS f2) AS A WHERE func_1() = 5;
|
|
|
|
|
|
|
|
# Cleanup
|
|
|
|
DROP FUNCTION func_1;
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-10-19 15:55:04 +02:00
|
|
|
--echo #
|
|
|
|
--echo # Bug #47788: Crash in TABLE_LIST::hide_view_error on UPDATE + VIEW +
|
|
|
|
--echo # SP + MERGE + ALTER
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
CREATE TABLE t1 (pk INT, b INT, KEY (b));
|
|
|
|
CREATE ALGORITHM = TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1 (a int) UPDATE IGNORE v1 SET b = a;
|
|
|
|
|
|
|
|
--error ER_NON_UPDATABLE_TABLE
|
|
|
|
CALL p1(5);
|
|
|
|
|
|
|
|
ALTER TABLE t1 CHANGE COLUMN b b2 INT;
|
|
|
|
|
|
|
|
--error ER_VIEW_INVALID
|
|
|
|
CALL p1(7);
|
|
|
|
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP VIEW v1;
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
2011-06-09 18:30:52 +02:00
|
|
|
--echo #
|
|
|
|
--echo # Bug#12428824 - PARSER STACK OVERFLOW AND CRASH IN SP_ADD_USED_ROUTINE
|
|
|
|
--echo # WITH OBSCURE QUERY
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
--error ER_TOO_LONG_IDENT
|
|
|
|
SELECT very_long_fn_name_1111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225555555555555555555555555577777777777777777777777777777777777777777777777777777777777777777777777788888888999999999999999999999();
|
|
|
|
|
|
|
|
--error ER_TOO_LONG_IDENT
|
|
|
|
CALL very_long_pr_name_1111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225555555555555555555555555577777777777777777777777777777777777777777777777777777777777777777777777788888888999999999999999999999();
|
|
|
|
|
|
|
|
--error ER_WRONG_DB_NAME
|
|
|
|
SELECT very_long_db_name_1111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225555555555555555555555555577777777777777777777777777777777777777777777777777777777777777777777777788888888999999999999999999999.simple_func();
|
|
|
|
|
|
|
|
--error ER_WRONG_DB_NAME
|
|
|
|
CALL very_long_db_name_1111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225555555555555555555555555577777777777777777777777777777777777777777777777777777777777777777777777788888888999999999999999999999.simple_proc();
|
|
|
|
|
|
|
|
--error ER_TOO_LONG_IDENT
|
|
|
|
SELECT db_name.very_long_fn_name_111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222999999999999999999999();
|
|
|
|
|
|
|
|
--error ER_TOO_LONG_IDENT
|
|
|
|
CALL db_name.very_long_pr_name_111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222999999999999999999999();
|
2009-10-19 15:55:04 +02:00
|
|
|
--echo End of 5.1 tests
|
2009-12-10 16:22:41 +01:00
|
|
|
|
Auto-merge from mysql-trunk-bugfixing.
******
This patch fixes the following bugs:
- Bug#5889: Exit handler for a warning doesn't hide the warning in
trigger
- Bug#9857: Stored procedures: handler for sqlwarning ignored
- Bug#23032: Handlers declared in a SP do not handle warnings generated
in sub-SP
- Bug#36185: Incorrect precedence for warning and exception handlers
The problem was in the way warnings/errors during stored routine execution
were handled. Prior to this patch the logic was as follows:
- when a warning/an error happens: if we're executing a stored routine,
and there is a handler for that warning/error, remember the handler,
ignore the warning/error and continue execution.
- after a stored routine instruction is executed: check for a remembered
handler and activate one (if any).
This logic caused several problems:
- if one instruction generates several warnings (errors) it's impossible
to choose the right handler -- a handler for the first generated
condition was chosen and remembered for activation.
- mess with handling conditions in scopes different from the current one.
- not putting generated warnings/errors into Warning Info (Diagnostic
Area) is against The Standard.
The patch changes the logic as follows:
- Diagnostic Area is cleared on the beginning of each statement that
either is able to generate warnings, or is able to work with tables.
- at the end of a stored routine instruction, Diagnostic Area is left
intact.
- Diagnostic Area is checked after each stored routine instruction. If
an instruction generates several condition, it's now possible to take a
look at all of them and determine an appropriate handler.
mysql-test/r/signal.result:
Update result file:
1. handled conditions are not cleared any more;
2. reflect changes in signal.test
mysql-test/r/signal_demo3.result:
Update result file: handled conditions are not cleared any more.
Due to playing with max_error_count, resulting warning lists
have changed.
mysql-test/r/sp-big.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-bugs.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-code.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-code.test.
mysql-test/r/sp-error.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-error.test.
mysql-test/r/sp.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp_trans.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/strict.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/view.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/innodb_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/memory_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/myisam_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/storedproc.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp005.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_trig003.result:
Update result file: handled conditions are not cleared any more.
mysql-test/t/signal.test:
Make a test case more readable in the result file.
mysql-test/t/sp-code.test:
Add a test case for Bug#23032 checking that
No Data takes precedence on Warning.
mysql-test/t/sp-error.test:
Adding test cases for:
- Bug#23032
- Bug#36185
- Bug#5889
- Bug#9857
mysql-test/t/sp.test:
Fixing test case to reflect behavioral changes made by the patch.
sql/sp_head.cc:
Reset the per-statement warning count before executing
a stored procedure instruction.
Move to a separate function code which checks the
completion status of the executed statement and searches
for a handler.
Remove redundant code now that search for a handler is
done after execution, errors are always pushed.
sql/sp_pcontext.h:
Remove unused code.
sql/sp_rcontext.cc:
- Polish sp_rcontext::find_handler(): use sp_rcontext::m_hfound instead
of an extra local variable;
- Remove sp_rcontext::handle_condition();
- Introduce sp_rcontext::activate_handler(), which prepares
previously found handler for execution.
- Move sp_rcontext::enter_handler() code into activate_handler(),
because enter_handler() is used only from there;
- Cleanups;
- Introduce DBUG_EXECUTE_IF() for a test case in sp-code.test
sql/sp_rcontext.h:
- Remove unused code
- Cleanups
sql/sql_class.cc:
Merge THD::raise_condition_no_handler() into THD::raise_condition().
After the patch raise_condition_no_handler() was called
in raise_condition() only.
sql/sql_class.h:
Remove raise_condition_no_handler().
sql/sql_error.cc:
Remove Warning_info::reserve_space() -- handled conditions are not
cleared any more, so there is no need for RESIGNAL to re-push them.
sql/sql_error.h:
Remove Warning_info::reserve_space().
sql/sql_signal.cc:
Handled conditions are not cleared any more,
so there is no need for RESIGNAL to re-push them.
2010-07-30 17:28:36 +02:00
|
|
|
--echo #
|
|
|
|
--echo # Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # - Case 1
|
|
|
|
--echo
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
|
|
DROP PROCEDURE IF EXISTS p2;
|
|
|
|
DROP PROCEDURE IF EXISTS p3;
|
|
|
|
DROP PROCEDURE IF EXISTS p4;
|
|
|
|
DROP PROCEDURE IF EXISTS p5;
|
|
|
|
DROP PROCEDURE IF EXISTS p6;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
SELECT CAST('10 ' as unsigned integer);
|
|
|
|
SELECT 1;
|
|
|
|
CALL p2();
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE p2()
|
|
|
|
BEGIN
|
|
|
|
SELECT CAST('10 ' as unsigned integer);
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
CALL p1();
|
|
|
|
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP PROCEDURE p2;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # - Case 2
|
|
|
|
--echo
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE c INT DEFAULT 0;
|
2015-09-17 09:05:07 +02:00
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '22007' SET c = c + 1;
|
Auto-merge from mysql-trunk-bugfixing.
******
This patch fixes the following bugs:
- Bug#5889: Exit handler for a warning doesn't hide the warning in
trigger
- Bug#9857: Stored procedures: handler for sqlwarning ignored
- Bug#23032: Handlers declared in a SP do not handle warnings generated
in sub-SP
- Bug#36185: Incorrect precedence for warning and exception handlers
The problem was in the way warnings/errors during stored routine execution
were handled. Prior to this patch the logic was as follows:
- when a warning/an error happens: if we're executing a stored routine,
and there is a handler for that warning/error, remember the handler,
ignore the warning/error and continue execution.
- after a stored routine instruction is executed: check for a remembered
handler and activate one (if any).
This logic caused several problems:
- if one instruction generates several warnings (errors) it's impossible
to choose the right handler -- a handler for the first generated
condition was chosen and remembered for activation.
- mess with handling conditions in scopes different from the current one.
- not putting generated warnings/errors into Warning Info (Diagnostic
Area) is against The Standard.
The patch changes the logic as follows:
- Diagnostic Area is cleared on the beginning of each statement that
either is able to generate warnings, or is able to work with tables.
- at the end of a stored routine instruction, Diagnostic Area is left
intact.
- Diagnostic Area is checked after each stored routine instruction. If
an instruction generates several condition, it's now possible to take a
look at all of them and determine an appropriate handler.
mysql-test/r/signal.result:
Update result file:
1. handled conditions are not cleared any more;
2. reflect changes in signal.test
mysql-test/r/signal_demo3.result:
Update result file: handled conditions are not cleared any more.
Due to playing with max_error_count, resulting warning lists
have changed.
mysql-test/r/sp-big.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-bugs.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-code.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-code.test.
mysql-test/r/sp-error.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-error.test.
mysql-test/r/sp.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp_trans.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/strict.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/view.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/innodb_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/memory_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/myisam_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/storedproc.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp005.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_trig003.result:
Update result file: handled conditions are not cleared any more.
mysql-test/t/signal.test:
Make a test case more readable in the result file.
mysql-test/t/sp-code.test:
Add a test case for Bug#23032 checking that
No Data takes precedence on Warning.
mysql-test/t/sp-error.test:
Adding test cases for:
- Bug#23032
- Bug#36185
- Bug#5889
- Bug#9857
mysql-test/t/sp.test:
Fixing test case to reflect behavioral changes made by the patch.
sql/sp_head.cc:
Reset the per-statement warning count before executing
a stored procedure instruction.
Move to a separate function code which checks the
completion status of the executed statement and searches
for a handler.
Remove redundant code now that search for a handler is
done after execution, errors are always pushed.
sql/sp_pcontext.h:
Remove unused code.
sql/sp_rcontext.cc:
- Polish sp_rcontext::find_handler(): use sp_rcontext::m_hfound instead
of an extra local variable;
- Remove sp_rcontext::handle_condition();
- Introduce sp_rcontext::activate_handler(), which prepares
previously found handler for execution.
- Move sp_rcontext::enter_handler() code into activate_handler(),
because enter_handler() is used only from there;
- Cleanups;
- Introduce DBUG_EXECUTE_IF() for a test case in sp-code.test
sql/sp_rcontext.h:
- Remove unused code
- Cleanups
sql/sql_class.cc:
Merge THD::raise_condition_no_handler() into THD::raise_condition().
After the patch raise_condition_no_handler() was called
in raise_condition() only.
sql/sql_class.h:
Remove raise_condition_no_handler().
sql/sql_error.cc:
Remove Warning_info::reserve_space() -- handled conditions are not
cleared any more, so there is no need for RESIGNAL to re-push them.
sql/sql_error.h:
Remove Warning_info::reserve_space().
sql/sql_signal.cc:
Handled conditions are not cleared any more,
so there is no need for RESIGNAL to re-push them.
2010-07-30 17:28:36 +02:00
|
|
|
CALL p2();
|
|
|
|
CALL p3();
|
|
|
|
CALL p4();
|
|
|
|
SELECT c;
|
|
|
|
SELECT @@warning_count;
|
|
|
|
SHOW WARNINGS;
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE p2()
|
|
|
|
BEGIN
|
|
|
|
SELECT CAST('10 ' as unsigned integer);
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE p3()
|
|
|
|
BEGIN
|
|
|
|
SELECT CAST('10 ' as unsigned integer);
|
|
|
|
SELECT 1;
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE p4()
|
|
|
|
BEGIN
|
|
|
|
SELECT CAST('10 ' as unsigned integer);
|
|
|
|
CALL p2();
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE p5()
|
|
|
|
BEGIN
|
|
|
|
SELECT CAST('10 ' as unsigned integer);
|
|
|
|
SHOW WARNINGS;
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE P6()
|
|
|
|
BEGIN
|
|
|
|
DECLARE c INT DEFAULT 0;
|
2015-09-17 09:05:07 +02:00
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '22007' SET c = c + 1;
|
Auto-merge from mysql-trunk-bugfixing.
******
This patch fixes the following bugs:
- Bug#5889: Exit handler for a warning doesn't hide the warning in
trigger
- Bug#9857: Stored procedures: handler for sqlwarning ignored
- Bug#23032: Handlers declared in a SP do not handle warnings generated
in sub-SP
- Bug#36185: Incorrect precedence for warning and exception handlers
The problem was in the way warnings/errors during stored routine execution
were handled. Prior to this patch the logic was as follows:
- when a warning/an error happens: if we're executing a stored routine,
and there is a handler for that warning/error, remember the handler,
ignore the warning/error and continue execution.
- after a stored routine instruction is executed: check for a remembered
handler and activate one (if any).
This logic caused several problems:
- if one instruction generates several warnings (errors) it's impossible
to choose the right handler -- a handler for the first generated
condition was chosen and remembered for activation.
- mess with handling conditions in scopes different from the current one.
- not putting generated warnings/errors into Warning Info (Diagnostic
Area) is against The Standard.
The patch changes the logic as follows:
- Diagnostic Area is cleared on the beginning of each statement that
either is able to generate warnings, or is able to work with tables.
- at the end of a stored routine instruction, Diagnostic Area is left
intact.
- Diagnostic Area is checked after each stored routine instruction. If
an instruction generates several condition, it's now possible to take a
look at all of them and determine an appropriate handler.
mysql-test/r/signal.result:
Update result file:
1. handled conditions are not cleared any more;
2. reflect changes in signal.test
mysql-test/r/signal_demo3.result:
Update result file: handled conditions are not cleared any more.
Due to playing with max_error_count, resulting warning lists
have changed.
mysql-test/r/sp-big.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-bugs.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-code.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-code.test.
mysql-test/r/sp-error.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-error.test.
mysql-test/r/sp.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp_trans.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/strict.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/view.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/innodb_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/memory_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/myisam_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/storedproc.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp005.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_trig003.result:
Update result file: handled conditions are not cleared any more.
mysql-test/t/signal.test:
Make a test case more readable in the result file.
mysql-test/t/sp-code.test:
Add a test case for Bug#23032 checking that
No Data takes precedence on Warning.
mysql-test/t/sp-error.test:
Adding test cases for:
- Bug#23032
- Bug#36185
- Bug#5889
- Bug#9857
mysql-test/t/sp.test:
Fixing test case to reflect behavioral changes made by the patch.
sql/sp_head.cc:
Reset the per-statement warning count before executing
a stored procedure instruction.
Move to a separate function code which checks the
completion status of the executed statement and searches
for a handler.
Remove redundant code now that search for a handler is
done after execution, errors are always pushed.
sql/sp_pcontext.h:
Remove unused code.
sql/sp_rcontext.cc:
- Polish sp_rcontext::find_handler(): use sp_rcontext::m_hfound instead
of an extra local variable;
- Remove sp_rcontext::handle_condition();
- Introduce sp_rcontext::activate_handler(), which prepares
previously found handler for execution.
- Move sp_rcontext::enter_handler() code into activate_handler(),
because enter_handler() is used only from there;
- Cleanups;
- Introduce DBUG_EXECUTE_IF() for a test case in sp-code.test
sql/sp_rcontext.h:
- Remove unused code
- Cleanups
sql/sql_class.cc:
Merge THD::raise_condition_no_handler() into THD::raise_condition().
After the patch raise_condition_no_handler() was called
in raise_condition() only.
sql/sql_class.h:
Remove raise_condition_no_handler().
sql/sql_error.cc:
Remove Warning_info::reserve_space() -- handled conditions are not
cleared any more, so there is no need for RESIGNAL to re-push them.
sql/sql_error.h:
Remove Warning_info::reserve_space().
sql/sql_signal.cc:
Handled conditions are not cleared any more,
so there is no need for RESIGNAL to re-push them.
2010-07-30 17:28:36 +02:00
|
|
|
CALL p5();
|
|
|
|
SELECT c;
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
CALL p1();
|
|
|
|
CALL p6();
|
|
|
|
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP PROCEDURE p2;
|
|
|
|
DROP PROCEDURE p3;
|
|
|
|
DROP PROCEDURE p4;
|
|
|
|
DROP PROCEDURE p5;
|
|
|
|
DROP PROCEDURE p6;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # - Case 3: check that "Exception trumps No Data".
|
|
|
|
--echo
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
CREATE TABLE t1(a INT);
|
|
|
|
INSERT INTO t1 VALUES (1), (2), (3);
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE c CURSOR FOR SELECT a FROM t1;
|
|
|
|
|
|
|
|
OPEN c;
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
DECLARE v1 INT;
|
|
|
|
DECLARE v2 INT;
|
|
|
|
|
|
|
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT "Error caught (expected)";
|
|
|
|
|
|
|
|
DECLARE EXIT HANDLER FOR NOT FOUND
|
|
|
|
SELECT "End of Result Set found!";
|
|
|
|
|
|
|
|
WHILE TRUE DO
|
|
|
|
FETCH c INTO v1, v2;
|
|
|
|
END WHILE;
|
|
|
|
END;
|
|
|
|
|
|
|
|
CLOSE c;
|
|
|
|
|
|
|
|
SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
CALL p1();
|
|
|
|
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Bug#36185: Incorrect precedence for warning and exception handlers
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
CREATE TABLE t1 (a INT, b INT NOT NULL);
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING SELECT 'warning';
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT 'exception';
|
|
|
|
INSERT INTO t1 VALUES (CAST('10 ' AS SIGNED), NULL);
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
CALL p1();
|
|
|
|
|
|
|
|
DROP TABLE t1;
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Bug#5889: Exit handler for a warning doesn't hide the warning in trigger
|
|
|
|
--echo #
|
2017-02-08 21:28:00 +01:00
|
|
|
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
Auto-merge from mysql-trunk-bugfixing.
******
This patch fixes the following bugs:
- Bug#5889: Exit handler for a warning doesn't hide the warning in
trigger
- Bug#9857: Stored procedures: handler for sqlwarning ignored
- Bug#23032: Handlers declared in a SP do not handle warnings generated
in sub-SP
- Bug#36185: Incorrect precedence for warning and exception handlers
The problem was in the way warnings/errors during stored routine execution
were handled. Prior to this patch the logic was as follows:
- when a warning/an error happens: if we're executing a stored routine,
and there is a handler for that warning/error, remember the handler,
ignore the warning/error and continue execution.
- after a stored routine instruction is executed: check for a remembered
handler and activate one (if any).
This logic caused several problems:
- if one instruction generates several warnings (errors) it's impossible
to choose the right handler -- a handler for the first generated
condition was chosen and remembered for activation.
- mess with handling conditions in scopes different from the current one.
- not putting generated warnings/errors into Warning Info (Diagnostic
Area) is against The Standard.
The patch changes the logic as follows:
- Diagnostic Area is cleared on the beginning of each statement that
either is able to generate warnings, or is able to work with tables.
- at the end of a stored routine instruction, Diagnostic Area is left
intact.
- Diagnostic Area is checked after each stored routine instruction. If
an instruction generates several condition, it's now possible to take a
look at all of them and determine an appropriate handler.
mysql-test/r/signal.result:
Update result file:
1. handled conditions are not cleared any more;
2. reflect changes in signal.test
mysql-test/r/signal_demo3.result:
Update result file: handled conditions are not cleared any more.
Due to playing with max_error_count, resulting warning lists
have changed.
mysql-test/r/sp-big.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-bugs.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-code.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-code.test.
mysql-test/r/sp-error.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-error.test.
mysql-test/r/sp.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp_trans.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/strict.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/view.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/innodb_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/memory_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/myisam_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/storedproc.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp005.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_trig003.result:
Update result file: handled conditions are not cleared any more.
mysql-test/t/signal.test:
Make a test case more readable in the result file.
mysql-test/t/sp-code.test:
Add a test case for Bug#23032 checking that
No Data takes precedence on Warning.
mysql-test/t/sp-error.test:
Adding test cases for:
- Bug#23032
- Bug#36185
- Bug#5889
- Bug#9857
mysql-test/t/sp.test:
Fixing test case to reflect behavioral changes made by the patch.
sql/sp_head.cc:
Reset the per-statement warning count before executing
a stored procedure instruction.
Move to a separate function code which checks the
completion status of the executed statement and searches
for a handler.
Remove redundant code now that search for a handler is
done after execution, errors are always pushed.
sql/sp_pcontext.h:
Remove unused code.
sql/sp_rcontext.cc:
- Polish sp_rcontext::find_handler(): use sp_rcontext::m_hfound instead
of an extra local variable;
- Remove sp_rcontext::handle_condition();
- Introduce sp_rcontext::activate_handler(), which prepares
previously found handler for execution.
- Move sp_rcontext::enter_handler() code into activate_handler(),
because enter_handler() is used only from there;
- Cleanups;
- Introduce DBUG_EXECUTE_IF() for a test case in sp-code.test
sql/sp_rcontext.h:
- Remove unused code
- Cleanups
sql/sql_class.cc:
Merge THD::raise_condition_no_handler() into THD::raise_condition().
After the patch raise_condition_no_handler() was called
in raise_condition() only.
sql/sql_class.h:
Remove raise_condition_no_handler().
sql/sql_error.cc:
Remove Warning_info::reserve_space() -- handled conditions are not
cleared any more, so there is no need for RESIGNAL to re-push them.
sql/sql_error.h:
Remove Warning_info::reserve_space().
sql/sql_signal.cc:
Handled conditions are not cleared any more,
so there is no need for RESIGNAL to re-push them.
2010-07-30 17:28:36 +02:00
|
|
|
CREATE TABLE t1(a INT, b INT);
|
|
|
|
INSERT INTO t1 VALUES (1, 2);
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW
|
|
|
|
BEGIN
|
|
|
|
DECLARE EXIT HANDLER FOR SQLWARNING
|
|
|
|
SET NEW.a = 10;
|
|
|
|
|
|
|
|
SET NEW.a = 99999999999;
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
UPDATE t1 SET b = 20;
|
|
|
|
|
|
|
|
SHOW WARNINGS;
|
|
|
|
|
|
|
|
SELECT * FROM t1;
|
|
|
|
|
|
|
|
DROP TRIGGER t1_bu;
|
|
|
|
DROP TABLE t1;
|
2017-02-08 21:28:00 +01:00
|
|
|
SET sql_mode = DEFAULT;
|
Auto-merge from mysql-trunk-bugfixing.
******
This patch fixes the following bugs:
- Bug#5889: Exit handler for a warning doesn't hide the warning in
trigger
- Bug#9857: Stored procedures: handler for sqlwarning ignored
- Bug#23032: Handlers declared in a SP do not handle warnings generated
in sub-SP
- Bug#36185: Incorrect precedence for warning and exception handlers
The problem was in the way warnings/errors during stored routine execution
were handled. Prior to this patch the logic was as follows:
- when a warning/an error happens: if we're executing a stored routine,
and there is a handler for that warning/error, remember the handler,
ignore the warning/error and continue execution.
- after a stored routine instruction is executed: check for a remembered
handler and activate one (if any).
This logic caused several problems:
- if one instruction generates several warnings (errors) it's impossible
to choose the right handler -- a handler for the first generated
condition was chosen and remembered for activation.
- mess with handling conditions in scopes different from the current one.
- not putting generated warnings/errors into Warning Info (Diagnostic
Area) is against The Standard.
The patch changes the logic as follows:
- Diagnostic Area is cleared on the beginning of each statement that
either is able to generate warnings, or is able to work with tables.
- at the end of a stored routine instruction, Diagnostic Area is left
intact.
- Diagnostic Area is checked after each stored routine instruction. If
an instruction generates several condition, it's now possible to take a
look at all of them and determine an appropriate handler.
mysql-test/r/signal.result:
Update result file:
1. handled conditions are not cleared any more;
2. reflect changes in signal.test
mysql-test/r/signal_demo3.result:
Update result file: handled conditions are not cleared any more.
Due to playing with max_error_count, resulting warning lists
have changed.
mysql-test/r/sp-big.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-bugs.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-code.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-code.test.
mysql-test/r/sp-error.result:
Update result file:
1. handled conditions are not cleared any more.
2. add result for a new test case in sp-error.test.
mysql-test/r/sp.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/sp_trans.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/strict.result:
Update result file: handled conditions are not cleared any more.
mysql-test/r/view.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/innodb_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/memory_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/myisam_storedproc_02.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/storedproc.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp005.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result:
Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_trig003.result:
Update result file: handled conditions are not cleared any more.
mysql-test/t/signal.test:
Make a test case more readable in the result file.
mysql-test/t/sp-code.test:
Add a test case for Bug#23032 checking that
No Data takes precedence on Warning.
mysql-test/t/sp-error.test:
Adding test cases for:
- Bug#23032
- Bug#36185
- Bug#5889
- Bug#9857
mysql-test/t/sp.test:
Fixing test case to reflect behavioral changes made by the patch.
sql/sp_head.cc:
Reset the per-statement warning count before executing
a stored procedure instruction.
Move to a separate function code which checks the
completion status of the executed statement and searches
for a handler.
Remove redundant code now that search for a handler is
done after execution, errors are always pushed.
sql/sp_pcontext.h:
Remove unused code.
sql/sp_rcontext.cc:
- Polish sp_rcontext::find_handler(): use sp_rcontext::m_hfound instead
of an extra local variable;
- Remove sp_rcontext::handle_condition();
- Introduce sp_rcontext::activate_handler(), which prepares
previously found handler for execution.
- Move sp_rcontext::enter_handler() code into activate_handler(),
because enter_handler() is used only from there;
- Cleanups;
- Introduce DBUG_EXECUTE_IF() for a test case in sp-code.test
sql/sp_rcontext.h:
- Remove unused code
- Cleanups
sql/sql_class.cc:
Merge THD::raise_condition_no_handler() into THD::raise_condition().
After the patch raise_condition_no_handler() was called
in raise_condition() only.
sql/sql_class.h:
Remove raise_condition_no_handler().
sql/sql_error.cc:
Remove Warning_info::reserve_space() -- handled conditions are not
cleared any more, so there is no need for RESIGNAL to re-push them.
sql/sql_error.h:
Remove Warning_info::reserve_space().
sql/sql_signal.cc:
Handled conditions are not cleared any more,
so there is no need for RESIGNAL to re-push them.
2010-07-30 17:28:36 +02:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Bug#9857: Stored procedures: handler for sqlwarning ignored
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
SET @sql_mode_saved = @@sql_mode;
|
|
|
|
SET sql_mode = traditional;
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'warning caught (expected)';
|
|
|
|
|
|
|
|
SELECT 5 / 0;
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE p2()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT 'error caught (unexpected)';
|
|
|
|
|
|
|
|
SELECT 5 / 0;
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
CALL p1();
|
|
|
|
SHOW WARNINGS;
|
|
|
|
|
|
|
|
CALL p2();
|
|
|
|
SHOW WARNINGS;
|
|
|
|
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP PROCEDURE p2;
|
|
|
|
SET sql_mode = @sql_mode_saved;
|
2010-10-26 13:48:08 +02:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Bug#55850: Trigger warnings not cleared.
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
DROP TABLE IF EXISTS t2;
|
|
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT);
|
|
|
|
CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT,
|
|
|
|
d SMALLINT, e SMALLINT, f SMALLINT);
|
|
|
|
|
|
|
|
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
|
2017-02-08 21:28:00 +01:00
|
|
|
INSERT IGNORE INTO t2(a, b, c) VALUES(99999, 99999, 99999);
|
2010-10-26 13:48:08 +02:00
|
|
|
|
|
|
|
CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW
|
2017-02-08 21:28:00 +01:00
|
|
|
INSERT IGNORE INTO t2(d, e, f) VALUES(99999, 99999, 99999);
|
2010-10-26 13:48:08 +02:00
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
2017-02-08 21:28:00 +01:00
|
|
|
INSERT IGNORE INTO t1 VALUES(99999, 99999, 99999);
|
2010-10-26 13:48:08 +02:00
|
|
|
|
|
|
|
# What happened before the patch was:
|
|
|
|
# - INSERT INTO t1 added 3 warnings about overflow in 'x', 'y' and 'z' columns;
|
|
|
|
# - t1_bi run and added 3 warnings about overflow in 'a', 'b' and 'c' columns;
|
|
|
|
# - t1_ai run and added 3 warnings about overflow in 'd', 'e' and 'f' columns;
|
|
|
|
# => we had 9 warnings.
|
|
|
|
#
|
|
|
|
# Now what happens is:
|
|
|
|
# - INSERT INTO t1 adds 3 warnings about overflow in 'x', 'y' and 'z' columns;
|
|
|
|
# - t1_bi adds 3 warnings about overflow in 'a', 'b' and 'c' columns;
|
|
|
|
# - The warnings added by triggers are cleared;
|
|
|
|
# - t1_ai run and added 3 warnings about overflow in 'd', 'e' and 'f' columns;
|
|
|
|
# - The warnings added by triggers are cleared;
|
|
|
|
# => we have 3 warnings.
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p1();
|
|
|
|
|
|
|
|
--echo
|
|
|
|
SHOW WARNINGS;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
DROP TABLE t1;
|
|
|
|
DROP TABLE t2;
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
|
|
--echo # ----------------------------------------------------------------------
|
2017-02-08 21:28:00 +01:00
|
|
|
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
2010-10-26 13:48:08 +02:00
|
|
|
CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT);
|
|
|
|
CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT NOT NULL);
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
|
|
|
|
BEGIN
|
|
|
|
INSERT INTO t2 VALUES(
|
|
|
|
CAST('111111 ' AS SIGNED),
|
|
|
|
CAST('222222 ' AS SIGNED),
|
|
|
|
NULL);
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
INSERT INTO t1 VALUES(99999, 99999, 99999);
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--error ER_BAD_NULL_ERROR
|
|
|
|
CALL p1();
|
|
|
|
|
|
|
|
--echo
|
|
|
|
SHOW WARNINGS;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
DROP TABLE t1;
|
|
|
|
DROP TABLE t2;
|
|
|
|
DROP PROCEDURE p1;
|
2017-02-08 21:28:00 +01:00
|
|
|
SET sql_mode = DEFAULT;
|
2013-07-12 10:17:52 +02:00
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo ###################################################################
|
|
|
|
--echo # Tests for the following bugs:
|
|
|
|
--echo # - Bug#11763171: 55852 - Possibly inappropriate handler activation.
|
|
|
|
--echo # - Bug#11749343: 38806 - Wrong scope for SQL HANDLERS in SP.
|
|
|
|
--echo ###################################################################
|
|
|
|
--echo
|
|
|
|
|
|
|
|
#
|
|
|
|
# Structure of SQL-block:
|
|
|
|
# BEGIN
|
|
|
|
# <Handler declaration block>
|
|
|
|
# <Statement block>
|
|
|
|
# END
|
|
|
|
#
|
|
|
|
# Scope of Handler-decl-block is Statement-block.
|
|
|
|
# I.e. SQL-conditions thrown in the Handler-decl-block can not be handled by
|
|
|
|
# the same block, only by outer SQL-blocks.
|
|
|
|
#
|
|
|
|
# This rule is recursive, i.e. if a Handler-decl-block has nested SQL-blocks,
|
|
|
|
# the SQL-conditions from those nested blocks can not be handled by the this
|
|
|
|
# Handler-decl-block, only by outer SQL-blocks.
|
|
|
|
#
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that SQL-conditions thrown by Statement-blocks are
|
|
|
|
--echo # -- handled by Handler-decl blocks properly.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should be handled by H2.
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p1()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that SQL-conditions thrown by Statement-blocks are
|
|
|
|
--echo # -- handled by Handler-decl blocks properly in case of nested
|
|
|
|
--echo # -- SQL-blocks.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p2()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
SELECT 'B1' AS BlockId;
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
SELECT 'B2' AS BlockId;
|
|
|
|
BEGIN
|
|
|
|
SELECT 'B3' AS BlockId;
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should be handled by H2.
|
|
|
|
END;
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p2()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check SQL-handler resolution rules.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p3()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'H3' AS HandlerId;
|
|
|
|
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should be handled by H3.
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p3()|
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p4()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H3' AS HandlerId;
|
|
|
|
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should be handled by H2.
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p4()|
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p5()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H3' AS HandlerId;
|
|
|
|
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should be handled by H3.
|
|
|
|
END;
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p5()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that handlers don't handle its own exceptions.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p6()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE 'HY000'; # Should *not* be handled by H1.
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S1' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000'; # Should be handled by H1.
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--error ER_SIGNAL_EXCEPTION
|
|
|
|
CALL p6()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that handlers don't handle its own warnings.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p7()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should *not* be handled by H1.
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S1' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should be handled by H1.
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p7()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that conditions for handlers are not handled by the handlers
|
|
|
|
--echo # -- from the same block.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p8()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should *not* be handled by H1.
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S1' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000'; # Should be handled by H2.
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p8()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that conditions for handlers are not handled by the handlers
|
|
|
|
--echo # -- from the same block even if they are thrown deep down the stack.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p9()
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H1:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H1:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H2:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H2:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H3:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H3:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H4:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H4:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H5:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H5:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H6:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H6:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should *not* be handled by H1.
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S6' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S5' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S4' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S3' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S2' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S1' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000'; # Should be handled by H2.
|
|
|
|
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p9()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that handlers are choosen properly in case of deep stack and
|
|
|
|
--echo # -- nested SQL-blocks.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p10()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
BEGIN
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H1:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H1:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H2:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H2:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H3:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H3:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H4:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H4:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H5:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H5:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000'
|
|
|
|
SELECT 'Wrong:H6:1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Wrong:H6:2' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
BEGIN
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01000'; # Should be handled by H1.
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S6' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S5' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S4' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S3' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S2' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S1' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000'; # Should be handled by H2.
|
|
|
|
|
|
|
|
END;
|
|
|
|
END;
|
|
|
|
END;
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p10()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Test stored procedure from Peter's mail.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p11()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT 'H1' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H2' AS HandlerId;
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01000', 1249
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
|
|
|
|
SELECT 'H3' AS HandlerId;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'H4' AS HandlerId;
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
SELECT 'H5' AS HandlerId;
|
|
|
|
|
|
|
|
SELECT 'S3' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000'; # H3
|
|
|
|
|
|
|
|
SELECT 'S4' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE '22003'; # H3
|
|
|
|
|
|
|
|
SELECT 'S5' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE '01000' SET MYSQL_ERRNO = 1249; # H4
|
|
|
|
END;
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S6' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000'; # H1
|
|
|
|
|
|
|
|
SELECT 'S7' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE '22003'; # H1
|
|
|
|
|
|
|
|
SELECT 'S8' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE '01000' SET MYSQL_ERRNO = 1249; # H5
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'S1' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE 'HY000'; # H1
|
|
|
|
|
|
|
|
SELECT 'S2' AS SignalId;
|
|
|
|
SIGNAL SQLSTATE '01000' SET MYSQL_ERRNO = 1249; # H2
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p11()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that runtime stack-trace can be deeper than parsing-time one.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p12()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01001'
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01001'
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01001'
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01001'
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01001'
|
|
|
|
BEGIN
|
|
|
|
SELECT 'H1:5' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01002';
|
|
|
|
END;
|
|
|
|
SELECT 'H1:4' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01001';
|
|
|
|
END;
|
|
|
|
SELECT 'H1:3' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01001';
|
|
|
|
END;
|
|
|
|
SELECT 'H1:2' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01001';
|
|
|
|
END;
|
|
|
|
SELECT 'H1:1' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01001';
|
|
|
|
END;
|
|
|
|
|
|
|
|
#########################################################
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '01002'
|
|
|
|
SELECT 'OK' AS Msg;
|
|
|
|
|
|
|
|
#########################################################
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
SELECT 'H2:5' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01001';
|
|
|
|
END;
|
|
|
|
SELECT 'H2:4' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
END;
|
|
|
|
SELECT 'H2:3' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
END;
|
|
|
|
SELECT 'H2:2' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
END;
|
|
|
|
SELECT 'H2:1' AS HandlerId;
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
END;
|
|
|
|
|
|
|
|
#######################################################
|
|
|
|
|
|
|
|
SELECT 'Throw 01000' AS Msg;
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
END;
|
|
|
|
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p12()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # -- Check that handler-call-frames are removed properly for EXIT
|
|
|
|
--echo # -- handlers.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p13()
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
DECLARE EXIT HANDLER FOR SQLWARNING
|
|
|
|
BEGIN
|
|
|
|
SELECT 'EXIT handler 3' AS Msg;
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'CONTINUE handler 2: 1' AS Msg;
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
SELECT 'CONTINUE handler 2: 2' AS Msg;
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'CONTINUE handler 1: 1' AS Msg;
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
SELECT 'CONTINUE handler 1: 2' AS Msg;
|
|
|
|
END;
|
|
|
|
|
|
|
|
SELECT 'Throw 01000' AS Msg;
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p13()|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # That's it. Cleanup.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP PROCEDURE p2;
|
|
|
|
DROP PROCEDURE p3;
|
|
|
|
DROP PROCEDURE p4;
|
|
|
|
DROP PROCEDURE p5;
|
|
|
|
DROP PROCEDURE p6;
|
|
|
|
DROP PROCEDURE p7;
|
|
|
|
DROP PROCEDURE p8;
|
|
|
|
DROP PROCEDURE p9;
|
|
|
|
DROP PROCEDURE p10;
|
|
|
|
DROP PROCEDURE p11;
|
|
|
|
DROP PROCEDURE p12;
|
|
|
|
DROP PROCEDURE p13;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Bug#12731619: NESTED SP HANDLERS CAN TRIGGER ASSERTION
|
|
|
|
--echo
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP FUNCTION IF EXISTS f1;
|
|
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
CREATE TABLE t1(msg VARCHAR(255));
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
CREATE FUNCTION f1() RETURNS INT
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION # handler 1
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION # handler 2
|
|
|
|
BEGIN
|
|
|
|
INSERT INTO t1 VALUE('WRONG: Inside H2');
|
|
|
|
RETURN 2;
|
|
|
|
END;
|
|
|
|
|
|
|
|
INSERT INTO t1 VALUE('CORRECT: Inside H1');
|
|
|
|
RETURN 1;
|
|
|
|
END;
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING # handler 3
|
|
|
|
BEGIN
|
|
|
|
INSERT INTO t1 VALUE('WRONG: Inside H3');
|
|
|
|
RETURN 3;
|
|
|
|
END;
|
|
|
|
|
|
|
|
INSERT INTO t1 VALUE('CORRECT: Calling f1()');
|
|
|
|
RETURN f1(); # -- exception here
|
|
|
|
END;
|
|
|
|
|
|
|
|
INSERT INTO t1 VALUE('WRONG: Returning 10');
|
|
|
|
RETURN 10;
|
|
|
|
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
SELECT f1();
|
|
|
|
--echo
|
|
|
|
SELECT * FROM t1;
|
|
|
|
--echo
|
|
|
|
|
|
|
|
DROP FUNCTION f1;
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Check that handled SQL-conditions are properly cleared from DA.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
DROP TABLE IF EXISTS t2;
|
|
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
|
|
DROP PROCEDURE IF EXISTS p2;
|
|
|
|
DROP PROCEDURE IF EXISTS p3;
|
|
|
|
DROP PROCEDURE IF EXISTS p4;
|
|
|
|
DROP PROCEDURE IF EXISTS p5;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
CREATE TABLE t1(a CHAR, b CHAR, c CHAR);
|
|
|
|
CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT);
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Check that SQL-conditions for which SQL-handler has been invoked,
|
|
|
|
--echo # are cleared from the Diagnostics Area. Note, there might be several
|
|
|
|
--echo # SQL-conditions, but SQL-handler must be invoked only once.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE EXIT HANDLER FOR SQLWARNING
|
|
|
|
SELECT 'Warning caught' AS msg;
|
|
|
|
|
|
|
|
# The INSERT below raises 3 SQL-conditions (warnings). The EXIT HANDLER
|
|
|
|
# above must be invoked once (for one condition), but all three conditions
|
|
|
|
# must be cleared from the Diagnostics Area.
|
|
|
|
|
2017-02-08 21:28:00 +01:00
|
|
|
INSERT IGNORE INTO t1 VALUES('qqqq', 'ww', 'eee');
|
2013-07-12 10:17:52 +02:00
|
|
|
|
|
|
|
# The following INSERT will not be executed, because of the EXIT HANDLER.
|
|
|
|
|
|
|
|
INSERT INTO t1 VALUES('zzz', 'xx', 'yyyy');
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p1()|
|
|
|
|
--echo
|
|
|
|
SELECT * FROM t1|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Check that SQL-conditions for which SQL-handler has *not* been
|
|
|
|
--echo # invoked, are *still* cleared from the Diagnostics Area.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p2()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1292
|
|
|
|
SELECT 'Warning 1292 caught' AS msg;
|
|
|
|
|
|
|
|
# The following INSERT raises 6 SQL-warnings with code 1292,
|
|
|
|
# and 3 SQL-warnings with code 1264. The CONTINUE HANDLER above must be
|
|
|
|
# invoked once, and all nine SQL-warnings must be cleared from
|
|
|
|
# the Diagnostics Area.
|
|
|
|
|
2017-02-08 21:28:00 +01:00
|
|
|
INSERT IGNORE INTO t2
|
2013-07-12 10:17:52 +02:00
|
|
|
SELECT
|
|
|
|
CAST(CONCAT(CAST('1 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('2 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('3 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER);
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p2()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Check that if there are two equally ranked SQL-handlers to handle
|
|
|
|
--echo # SQL-conditions from SQL-statement, only one of them will be invoked.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p3()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1292
|
|
|
|
SELECT 'Warning 1292 caught' AS msg;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1264
|
|
|
|
SELECT 'Warning 1264 caught' AS msg;
|
|
|
|
|
|
|
|
# The following INSERT raises 6 SQL-warnings with code 1292,
|
|
|
|
# and 3 SQL-warnings with code 1264. Only one of the CONTINUE HANDLERs above
|
|
|
|
# must be called, and only once. The SQL Standard does not define, which one
|
|
|
|
# should be invoked.
|
|
|
|
|
|
|
|
INSERT INTO t2
|
|
|
|
SELECT
|
|
|
|
CAST(CONCAT(CAST('1 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('2 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('3 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER);
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p3()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # The same as p3, but 1264 comes first.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p4()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1292
|
|
|
|
SELECT 'Warning 1292 caught' AS msg;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1264
|
|
|
|
SELECT 'Warning 1264 caught' AS msg;
|
|
|
|
|
|
|
|
# The following INSERT raises 4 SQL-warnings with code 1292,
|
|
|
|
# and 3 SQL-warnings with code 1264. Only one of the CONTINUE HANDLERs above
|
|
|
|
# must be called, and only once. The SQL Standard does not define, which one
|
|
|
|
# should be invoked.
|
|
|
|
|
|
|
|
INSERT INTO t2
|
|
|
|
SELECT
|
|
|
|
CAST(999999 AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('2 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('3 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER);
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p4()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Check that if a SQL-handler raised its own SQL-conditions, there are
|
|
|
|
--echo # preserved after handler exit.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p5()
|
|
|
|
BEGIN
|
|
|
|
DECLARE EXIT HANDLER FOR 1292
|
|
|
|
BEGIN
|
|
|
|
SELECT 'Handler for 1292 (1)' AS Msg;
|
|
|
|
SIGNAL SQLSTATE '01000' SET MYSQL_ERRNO = 1234;
|
|
|
|
SHOW WARNINGS;
|
|
|
|
SELECT 'Handler for 1292 (2)' AS Msg;
|
|
|
|
END;
|
|
|
|
|
2017-02-08 21:28:00 +01:00
|
|
|
INSERT IGNORE INTO t2
|
2013-07-12 10:17:52 +02:00
|
|
|
SELECT
|
|
|
|
CAST(999999 AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('2 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('3 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER);
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p5()|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Check that SQL-conditions are available inside the handler, but
|
|
|
|
--echo # cleared after the handler exits.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE PROCEDURE p6()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1292
|
|
|
|
BEGIN
|
|
|
|
SHOW WARNINGS;
|
|
|
|
SELECT 'Handler for 1292' Msg;
|
|
|
|
END;
|
|
|
|
|
2017-02-08 21:28:00 +01:00
|
|
|
INSERT IGNORE INTO t2
|
2013-07-12 10:17:52 +02:00
|
|
|
SELECT
|
|
|
|
CAST(CONCAT(CAST('1 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('2 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER),
|
|
|
|
CAST(CONCAT(CAST('3 ' AS UNSIGNED INTEGER), '999999 ') AS SIGNED INTEGER);
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p6()|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP PROCEDURE p2;
|
|
|
|
DROP PROCEDURE p3;
|
|
|
|
DROP PROCEDURE p4;
|
|
|
|
DROP PROCEDURE p5;
|
|
|
|
DROP PROCEDURE p6;
|
|
|
|
DROP TABLE t1;
|
|
|
|
DROP TABLE t2;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Bug#13059316: ASSERTION FAILURE IN SP_RCONTEXT.CC
|
|
|
|
--echo # Check DECLARE statements that raise conditions before handlers
|
|
|
|
--echo # are declared.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
|
|
DROP PROCEDURE IF EXISTS p2;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
2017-02-08 21:28:00 +01:00
|
|
|
SET sql_mode = '';
|
2013-07-12 10:17:52 +02:00
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE var1 INTEGER DEFAULT 'string';
|
|
|
|
DECLARE EXIT HANDLER FOR SQLWARNING SELECT 'H1';
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p1()|
|
|
|
|
--echo
|
2017-02-08 21:28:00 +01:00
|
|
|
SET sql_mode = DEFAULT;
|
2013-07-12 10:17:52 +02:00
|
|
|
|
|
|
|
CREATE PROCEDURE p2()
|
|
|
|
BEGIN
|
|
|
|
DECLARE EXIT HANDLER FOR SQLWARNING SELECT 'H2';
|
|
|
|
CALL p1();
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
CALL p2()|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP PROCEDURE p2;
|
|
|
|
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Bug#13113222 RQG_SIGNAL_RESIGNAL FAILED WITH ASSERTION.
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
|
|
DROP PROCEDURE IF EXISTS p2;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
CREATE PROCEDURE p1()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT 'triggered p1';
|
|
|
|
# This will trigger an error.
|
|
|
|
SIGNAL SQLSTATE 'HY000';
|
|
|
|
END|
|
|
|
|
|
|
|
|
CREATE PROCEDURE p2()
|
|
|
|
BEGIN
|
|
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING SELECT 'triggered p2';
|
|
|
|
# This will trigger a warning.
|
|
|
|
SIGNAL SQLSTATE '01000';
|
|
|
|
END|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
SET @old_max_error_count= @@session.max_error_count;
|
|
|
|
SET SESSION max_error_count= 0;
|
|
|
|
CALL p1();
|
|
|
|
CALL p2();
|
|
|
|
SET SESSION max_error_count= @old_max_error_count;
|
|
|
|
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
DROP PROCEDURE p2;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Bug#12652873: 61392: Continue handler for NOT FOUND being triggered
|
|
|
|
--echo # from internal stored function.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
DROP FUNCTION IF EXISTS f1;
|
|
|
|
DROP FUNCTION IF EXISTS f2;
|
|
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE TABLE t1 (a INT, b INT);
|
|
|
|
INSERT INTO t1 VALUES (1, 2);
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # f1() raises NOT_FOUND condition.
|
|
|
|
--echo # Raising NOT_FOUND can not be simulated by SIGNAL,
|
|
|
|
--echo # because SIGNAL would raise SQL-error in that case.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE FUNCTION f1() RETURNS INTEGER
|
|
|
|
BEGIN
|
|
|
|
DECLARE v VARCHAR(5) DEFAULT -1;
|
|
|
|
SELECT b FROM t1 WHERE a = 2 INTO v;
|
|
|
|
RETURN v;
|
|
|
|
END|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
--echo # Here we check that the NOT_FOUND condition raised in f1()
|
|
|
|
--echo # is not visible in the outer function (f2), i.e. the continue
|
|
|
|
--echo # handler in f2() will not be called.
|
|
|
|
--echo
|
|
|
|
|
|
|
|
CREATE FUNCTION f2() RETURNS INTEGER
|
|
|
|
BEGIN
|
|
|
|
DECLARE v INTEGER;
|
|
|
|
|
|
|
|
DECLARE CONTINUE HANDLER FOR NOT FOUND
|
|
|
|
SET @msg = 'Handler activated.';
|
|
|
|
|
|
|
|
SELECT f1() INTO v;
|
|
|
|
|
|
|
|
RETURN v;
|
|
|
|
END|
|
|
|
|
|
|
|
|
delimiter ;|
|
|
|
|
|
|
|
|
SET @msg = '';
|
|
|
|
|
|
|
|
--echo
|
|
|
|
SELECT f2();
|
|
|
|
--echo
|
|
|
|
SELECT @msg;
|
|
|
|
--echo
|
|
|
|
|
|
|
|
DROP FUNCTION f1;
|
|
|
|
DROP FUNCTION f2;
|
|
|
|
DROP TABLE t1;
|