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
|
3.2000
|
||||||
drop procedure bug8937|
|
drop procedure bug8937|
|
||||||
delete from t1|
|
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;
|
drop table t1,t2;
|
||||||
|
@ -3398,6 +3398,89 @@ drop procedure bug8937|
|
|||||||
delete from t1|
|
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
|
# BUG#NNNN: New bug synopsis
|
||||||
#
|
#
|
||||||
|
@ -80,24 +80,24 @@ sp_rcontext::find_handler(uint sql_errno,
|
|||||||
break;
|
break;
|
||||||
case sp_cond_type_t::state:
|
case sp_cond_type_t::state:
|
||||||
if (strcmp(sqlstate, cond->sqlstate) == 0 &&
|
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;
|
found= i;
|
||||||
break;
|
break;
|
||||||
case sp_cond_type_t::warning:
|
case sp_cond_type_t::warning:
|
||||||
if ((sqlstate[0] == '0' && sqlstate[1] == '1' ||
|
if ((sqlstate[0] == '0' && sqlstate[1] == '1' ||
|
||||||
level == MYSQL_ERROR::WARN_LEVEL_WARN) &&
|
level == MYSQL_ERROR::WARN_LEVEL_WARN) &&
|
||||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::state))
|
found < 0)
|
||||||
found= i;
|
found= i;
|
||||||
break;
|
break;
|
||||||
case sp_cond_type_t::notfound:
|
case sp_cond_type_t::notfound:
|
||||||
if (sqlstate[0] == '0' && sqlstate[1] == '2' &&
|
if (sqlstate[0] == '0' && sqlstate[1] == '2' &&
|
||||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::state))
|
found < 0)
|
||||||
found= i;
|
found= i;
|
||||||
break;
|
break;
|
||||||
case sp_cond_type_t::exception:
|
case sp_cond_type_t::exception:
|
||||||
if ((sqlstate[0] != '0' || sqlstate[1] > '2') &&
|
if ((sqlstate[0] != '0' || sqlstate[1] > '2') &&
|
||||||
level == MYSQL_ERROR::WARN_LEVEL_ERROR &&
|
level == MYSQL_ERROR::WARN_LEVEL_ERROR &&
|
||||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::state))
|
found < 0)
|
||||||
found= i;
|
found= i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user