Commit 4215d120 authored by unknown's avatar unknown
Browse files

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.
parent 5f006200
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
@@ -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;
+83 −0
Original line number Diff line number Diff line
@@ -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
#
+4 −4
Original line number Diff line number Diff line
@@ -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;
    }