mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Implemented SP CONDITIONs and HANDLERs, with the extension of handling
MySQL error codes as well. (No UNDO HANDLERs yet, and no SIGNAL or RESIGNAL.) WL#850 Docs/sp-imp-spec.txt: Spec of CONDITIONs and HANDLERs (and updated some old stuff too). Docs/sp-implemented.txt: Updated info about caching, CONDITIONs and HANDLERs. include/mysqld_error.h: New error for undeclared CONDITION. libmysqld/Makefile.am: New file: sp_rcontext.cc. mysql-test/r/sp-error.result: New tests for CONDITIONs and HANDLERs. mysql-test/r/sp.result: New tests for CONDITIONs and HANDLERs. mysql-test/t/sp-error.test: New tests for CONDITIONs and HANDLERs. mysql-test/t/sp.test: New tests for CONDITIONs and HANDLERs. sql/Makefile.am: New file: sp_rcontext.cc. sql/lex.h: New symbols for CONDITIONs, HANDLERs and CURSORs. sql/mysqld.cc: Catch error if we have a handler for it. sql/protocol.cc: Catch error if we have a handler for it. sql/share/czech/errmsg.txt: New error for undeclared CONDITION. sql/share/danish/errmsg.txt: New error for undeclared CONDITION. sql/share/dutch/errmsg.txt: New error for undeclared CONDITION. sql/share/english/errmsg.txt: New error for undeclared CONDITION. sql/share/estonian/errmsg.txt: New error for undeclared CONDITION. sql/share/french/errmsg.txt: New error for undeclared CONDITION. sql/share/german/errmsg.txt: New error for undeclared CONDITION. sql/share/greek/errmsg.txt: New error for undeclared CONDITION. sql/share/hungarian/errmsg.txt: New error for undeclared CONDITION. sql/share/italian/errmsg.txt: New error for undeclared CONDITION. sql/share/japanese/errmsg.txt: New error for undeclared CONDITION. sql/share/korean/errmsg.txt: New error for undeclared CONDITION. sql/share/norwegian-ny/errmsg.txt: New error for undeclared CONDITION. sql/share/norwegian/errmsg.txt: New error for undeclared CONDITION. sql/share/polish/errmsg.txt: New error for undeclared CONDITION. sql/share/portuguese/errmsg.txt: New error for undeclared CONDITION. sql/share/romanian/errmsg.txt: New error for undeclared CONDITION. sql/share/russian/errmsg.txt: New error for undeclared CONDITION. sql/share/serbian/errmsg.txt: New error for undeclared CONDITION. sql/share/slovak/errmsg.txt: New error for undeclared CONDITION. sql/share/spanish/errmsg.txt: New error for undeclared CONDITION. sql/share/swedish/errmsg.txt: New error for undeclared CONDITION. sql/share/ukrainian/errmsg.txt: New error for undeclared CONDITION. sql/sp_head.cc: New HANDLER code. sql/sp_head.h: New HANDLER code. sql/sp_pcontext.cc: New CONDITION and HANDLER code. sql/sp_pcontext.h: New CONDITION and HANDLER code. sql/sp_rcontext.h: New CONDITION and HANDLER code. sql/sql_yacc.yy: New CONDITION and HANDLER code.
This commit is contained in:
@ -96,3 +96,28 @@ select f(1, 2);
|
||||
ERROR HY000: Wrong number of arguments for FUNCTION f, expected 1, got 2
|
||||
drop procedure p;
|
||||
drop function f;
|
||||
create procedure p(val int, out res int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare continue handler for foo set x = 1;
|
||||
insert into test.t1 values (val);
|
||||
if (x) then
|
||||
set res = 0;
|
||||
else
|
||||
set res = 1;
|
||||
end if;
|
||||
end;
|
||||
ERROR HY000: Undefined CONDITION: foo
|
||||
create procedure p(val int, out res int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare foo condition for 1146;
|
||||
declare continue handler for bar set x = 1;
|
||||
insert into test.t1 values (val);
|
||||
if (x) then
|
||||
set res = 0;
|
||||
else
|
||||
set res = 1;
|
||||
end if;
|
||||
end;
|
||||
ERROR HY000: Undefined CONDITION: bar
|
||||
|
@ -443,6 +443,63 @@ drop function inc;
|
||||
drop function mul;
|
||||
drop function append;
|
||||
drop function fun;
|
||||
create procedure hndlr1(val int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare foo condition for 1146;
|
||||
declare continue handler for foo set x = 1;
|
||||
insert into test.t666 values ("hndlr1", val); # Non-existing table
|
||||
if (x) then
|
||||
insert into test.t1 values ("hndlr1", val); # This instead then
|
||||
end if;
|
||||
end;
|
||||
call hndlr1(42);
|
||||
select * from t1;
|
||||
id data
|
||||
hndlr1 42
|
||||
delete from t1;
|
||||
drop procedure hndlr1;
|
||||
create procedure hndlr2(val int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
begin
|
||||
declare exit handler for '42S02' set x = 1;
|
||||
insert into test.t666 values ("hndlr2", val); # Non-existing table
|
||||
end;
|
||||
insert into test.t1 values ("hndlr2", x);
|
||||
end;
|
||||
call hndlr2(42);
|
||||
select * from t1;
|
||||
id data
|
||||
hndlr2 1
|
||||
delete from t1;
|
||||
drop procedure hndlr2;
|
||||
create procedure hndlr3(val int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare continue handler for sqlexception # Any error
|
||||
begin
|
||||
declare z int;
|
||||
set z = 2 * val;
|
||||
set x = 1;
|
||||
end;
|
||||
if val < 10 then
|
||||
begin
|
||||
declare y int;
|
||||
set y = val + 10;
|
||||
insert into test.t666 values ("hndlr3", y); # Non-existing table
|
||||
if x then
|
||||
insert into test.t1 values ("hndlr3", y);
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
end;
|
||||
call hndlr3(3);
|
||||
select * from t1;
|
||||
id data
|
||||
hndlr3 13
|
||||
delete from t1;
|
||||
drop procedure hndlr3;
|
||||
drop table if exists fac;
|
||||
create table fac (n int unsigned not null primary key, f bigint unsigned);
|
||||
create procedure ifac(n int unsigned)
|
||||
|
@ -142,4 +142,33 @@ select f(1, 2)|
|
||||
drop procedure p|
|
||||
drop function f|
|
||||
|
||||
--error 1289
|
||||
create procedure p(val int, out res int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare continue handler for foo set x = 1;
|
||||
|
||||
insert into test.t1 values (val);
|
||||
if (x) then
|
||||
set res = 0;
|
||||
else
|
||||
set res = 1;
|
||||
end if;
|
||||
end|
|
||||
|
||||
--error 1289
|
||||
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|
|
||||
|
||||
delimiter ;|
|
||||
|
@ -519,6 +519,76 @@ drop function append|
|
||||
drop function fun|
|
||||
|
||||
|
||||
#
|
||||
# CONDITIONs and HANDLERs
|
||||
#
|
||||
|
||||
create procedure hndlr1(val int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare foo condition for 1146;
|
||||
declare continue handler for foo set x = 1;
|
||||
|
||||
insert into test.t666 values ("hndlr1", val); # Non-existing table
|
||||
if (x) then
|
||||
insert into test.t1 values ("hndlr1", val); # This instead then
|
||||
end if;
|
||||
end|
|
||||
|
||||
call hndlr1(42)|
|
||||
select * from t1|
|
||||
delete from t1|
|
||||
drop procedure hndlr1|
|
||||
|
||||
create procedure hndlr2(val int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
|
||||
begin
|
||||
declare exit handler for '42S02' set x = 1;
|
||||
|
||||
insert into test.t666 values ("hndlr2", val); # Non-existing table
|
||||
end;
|
||||
|
||||
insert into test.t1 values ("hndlr2", x);
|
||||
end|
|
||||
|
||||
call hndlr2(42)|
|
||||
select * from t1|
|
||||
delete from t1|
|
||||
drop procedure hndlr2|
|
||||
|
||||
|
||||
create procedure hndlr3(val int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare continue handler for sqlexception # Any error
|
||||
begin
|
||||
declare z int;
|
||||
|
||||
set z = 2 * val;
|
||||
set x = 1;
|
||||
end;
|
||||
|
||||
if val < 10 then
|
||||
begin
|
||||
declare y int;
|
||||
|
||||
set y = val + 10;
|
||||
insert into test.t666 values ("hndlr3", y); # Non-existing table
|
||||
if x then
|
||||
insert into test.t1 values ("hndlr3", y);
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
end|
|
||||
|
||||
call hndlr3(3)|
|
||||
select * from t1|
|
||||
delete from t1|
|
||||
drop procedure hndlr3|
|
||||
|
||||
|
||||
#
|
||||
# Some "real" examples
|
||||
#
|
||||
|
Reference in New Issue
Block a user