mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fixed BUG#6900: Stored procedure inner handler ignored
and BUG#9074: STORED PROC: The scope of every handler declared is not properly applied mysql-test/r/sp.result: New test cases for BUG#6900 and BUG#9074 (duplicates). mysql-test/t/sp.test: New test cases for BUG#6900 and BUG#9074 (duplicates). sql/sp_rcontext.cc: Corrected logic for finding condition handlers - pick the innermost one.
This commit is contained in:
@ -2779,4 +2779,69 @@ a
|
||||
3.2000
|
||||
drop procedure bug8937|
|
||||
delete from t1|
|
||||
drop procedure if exists bug6900|
|
||||
drop procedure if exists bug9074|
|
||||
drop procedure if exists bug6900_9074|
|
||||
drop table if exists t3|
|
||||
create table t3 (w char unique, x char)|
|
||||
insert into t3 values ('a', 'b')|
|
||||
create procedure bug6900()
|
||||
begin
|
||||
declare exit handler for sqlexception select '1';
|
||||
begin
|
||||
declare exit handler for sqlexception select '2';
|
||||
insert into t3 values ('x', 'y', 'z');
|
||||
end;
|
||||
end|
|
||||
create procedure bug9074()
|
||||
begin
|
||||
declare x1, x2, x3, x4, x5, x6 int default 0;
|
||||
begin
|
||||
declare continue handler for sqlstate '23000' set x5 = 1;
|
||||
insert into t3 values ('a', 'b');
|
||||
set x6 = 1;
|
||||
end;
|
||||
begin1_label:
|
||||
begin
|
||||
declare continue handler for sqlstate '23000' set x1 = 1;
|
||||
insert into t3 values ('a', 'b');
|
||||
set x2 = 1;
|
||||
begin2_label:
|
||||
begin
|
||||
declare exit handler for sqlstate '23000' set x3 = 1;
|
||||
set x4= 1;
|
||||
insert into t3 values ('a','b');
|
||||
set x4= 0;
|
||||
end begin2_label;
|
||||
end begin1_label;
|
||||
select x1, x2, x3, x4, x5, x6;
|
||||
end|
|
||||
create procedure bug6900_9074(z int)
|
||||
begin
|
||||
declare exit handler for sqlstate '23000' select '23000';
|
||||
begin
|
||||
declare exit handler for sqlexception select 'sqlexception';
|
||||
if z = 1 then
|
||||
insert into t3 values ('a', 'b');
|
||||
else
|
||||
insert into t3 values ('x', 'y', 'z');
|
||||
end if;
|
||||
end;
|
||||
end|
|
||||
call bug6900()|
|
||||
2
|
||||
2
|
||||
call bug9074()|
|
||||
x1 x2 x3 x4 x5 x6
|
||||
1 1 1 1 1 1
|
||||
call bug6900_9074(0)|
|
||||
sqlexception
|
||||
sqlexception
|
||||
call bug6900_9074(1)|
|
||||
23000
|
||||
23000
|
||||
drop procedure bug6900|
|
||||
drop procedure bug9074|
|
||||
drop procedure bug6900_9074|
|
||||
drop table t3|
|
||||
drop table t1,t2;
|
||||
|
@ -3398,6 +3398,89 @@ drop procedure bug8937|
|
||||
delete from t1|
|
||||
|
||||
|
||||
#
|
||||
# BUG#6900: Stored procedure inner handler ignored
|
||||
# BUG#9074: STORED PROC: The scope of every handler declared is not
|
||||
# properly applied
|
||||
#
|
||||
--disable_warnings
|
||||
drop procedure if exists bug6900|
|
||||
drop procedure if exists bug9074|
|
||||
drop procedure if exists bug6900_9074|
|
||||
drop table if exists t3|
|
||||
--enable_warnings
|
||||
|
||||
create table t3 (w char unique, x char)|
|
||||
insert into t3 values ('a', 'b')|
|
||||
|
||||
create procedure bug6900()
|
||||
begin
|
||||
declare exit handler for sqlexception select '1';
|
||||
|
||||
begin
|
||||
declare exit handler for sqlexception select '2';
|
||||
|
||||
insert into t3 values ('x', 'y', 'z');
|
||||
end;
|
||||
end|
|
||||
|
||||
create procedure bug9074()
|
||||
begin
|
||||
declare x1, x2, x3, x4, x5, x6 int default 0;
|
||||
|
||||
begin
|
||||
declare continue handler for sqlstate '23000' set x5 = 1;
|
||||
|
||||
insert into t3 values ('a', 'b');
|
||||
set x6 = 1;
|
||||
end;
|
||||
|
||||
begin1_label:
|
||||
begin
|
||||
declare continue handler for sqlstate '23000' set x1 = 1;
|
||||
|
||||
insert into t3 values ('a', 'b');
|
||||
set x2 = 1;
|
||||
|
||||
begin2_label:
|
||||
begin
|
||||
declare exit handler for sqlstate '23000' set x3 = 1;
|
||||
|
||||
set x4= 1;
|
||||
insert into t3 values ('a','b');
|
||||
set x4= 0;
|
||||
end begin2_label;
|
||||
end begin1_label;
|
||||
|
||||
select x1, x2, x3, x4, x5, x6;
|
||||
end|
|
||||
|
||||
create procedure bug6900_9074(z int)
|
||||
begin
|
||||
declare exit handler for sqlstate '23000' select '23000';
|
||||
|
||||
begin
|
||||
declare exit handler for sqlexception select 'sqlexception';
|
||||
|
||||
if z = 1 then
|
||||
insert into t3 values ('a', 'b');
|
||||
else
|
||||
insert into t3 values ('x', 'y', 'z');
|
||||
end if;
|
||||
end;
|
||||
end|
|
||||
|
||||
call bug6900()|
|
||||
call bug9074()|
|
||||
call bug6900_9074(0)|
|
||||
call bug6900_9074(1)|
|
||||
|
||||
drop procedure bug6900|
|
||||
drop procedure bug9074|
|
||||
drop procedure bug6900_9074|
|
||||
drop table t3|
|
||||
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
|
@ -80,24 +80,24 @@ sp_rcontext::find_handler(uint sql_errno,
|
||||
break;
|
||||
case sp_cond_type_t::state:
|
||||
if (strcmp(sqlstate, cond->sqlstate) == 0 &&
|
||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::number))
|
||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::state))
|
||||
found= i;
|
||||
break;
|
||||
case sp_cond_type_t::warning:
|
||||
if ((sqlstate[0] == '0' && sqlstate[1] == '1' ||
|
||||
level == MYSQL_ERROR::WARN_LEVEL_WARN) &&
|
||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::state))
|
||||
found < 0)
|
||||
found= i;
|
||||
break;
|
||||
case sp_cond_type_t::notfound:
|
||||
if (sqlstate[0] == '0' && sqlstate[1] == '2' &&
|
||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::state))
|
||||
found < 0)
|
||||
found= i;
|
||||
break;
|
||||
case sp_cond_type_t::exception:
|
||||
if ((sqlstate[0] != '0' || sqlstate[1] > '2') &&
|
||||
level == MYSQL_ERROR::WARN_LEVEL_ERROR &&
|
||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::state))
|
||||
found < 0)
|
||||
found= i;
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user