Commit 50d615f3 authored by unknown's avatar unknown
Browse files

Merge mysql.com:/usr/local/bk/mysql-5.0

into  mysql.com:/usr/home/pem/bug14643/mysql-5.0


sql/sp_head.cc:
  Auto merged
mysql-test/r/sp.result:
  Manual merge.
mysql-test/t/sp.test:
  Manual merge.
parents bb0edb81 850cfe78
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -4010,4 +4010,40 @@ s1
2
drop procedure bug13729|
drop table t3|
drop procedure if exists bug14643_1|
drop procedure if exists bug14643_2|
create procedure bug14643_1()
begin
declare continue handler for sqlexception select 'boo' as 'Handler';
begin
declare v int default x;
if v = 1 then
select 1;
else
select 2;
end if;
end;
end|
create procedure bug14643_2()
begin
declare continue handler for sqlexception select 'boo' as 'Handler';
case x
when 1 then
select 1;
else
select 2;
end case;
end|
call bug14643_1()|
Handler
boo
2
2
call bug14643_2()|
Handler
boo
2
2
drop procedure bug14643_1|
drop procedure bug14643_2|
drop table t1,t2;
+42 −0
Original line number Diff line number Diff line
@@ -4781,6 +4781,48 @@ select * from t3|
drop procedure bug13729|
drop table t3|

#
# BUG#14643: Stored Procedure: Continuing after failed var. initialization
#            crashes server.
#
--disable_warnings
drop procedure if exists bug14643_1|
drop procedure if exists bug14643_2|
--enable_warnings

create procedure bug14643_1()
begin
  declare continue handler for sqlexception select 'boo' as 'Handler';

  begin
    declare v int default x;

    if v = 1 then
      select 1;
    else
      select 2;
    end if;
  end;
end|

create procedure bug14643_2()
begin
  declare continue handler for sqlexception select 'boo' as 'Handler';

  case x
  when 1 then
    select 1;
  else
    select 2;
  end case;
end|

call bug14643_1()|
call bug14643_2()|

drop procedure bug14643_1|
drop procedure bug14643_2|


#
# BUG#NNNN: New bug synopsis
+20 −0
Original line number Diff line number Diff line
@@ -2209,6 +2209,26 @@ sp_instr_set::exec_core(THD *thd, uint *nextp)
{
  int res= thd->spcont->set_item_eval(thd, m_offset, &m_value, m_type);

  if (res < 0 &&
      thd->spcont->get_item(m_offset) == NULL &&
      thd->spcont->found_handler_here())
  {
    /*
      Failed to evaluate the value, the variable is still not initialized,
      and a handler has been found. Set to null so we can continue.
    */
    Item *it= new Item_null();

    if (!it || thd->spcont->set_item_eval(thd, m_offset, &it, m_type) < 0)
    {                           /* If this also failed, we have to abort */
      sp_rcontext *spcont= thd->spcont;

      thd->spcont= 0;           /* Avoid handlers */
      my_error(ER_OUT_OF_RESOURCES, MYF(0));
      spcont->clear_handler();
      thd->spcont= spcont;
    }
  }
  *nextp = m_ip+1;
  return res;
}