Commit 50d615f3 authored by unknown's avatar unknown

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
...@@ -4010,4 +4010,40 @@ s1 ...@@ -4010,4 +4010,40 @@ s1
2 2
drop procedure bug13729| drop procedure bug13729|
drop table t3| 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; drop table t1,t2;
...@@ -4781,6 +4781,48 @@ select * from t3| ...@@ -4781,6 +4781,48 @@ select * from t3|
drop procedure bug13729| drop procedure bug13729|
drop table t3| 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 # BUG#NNNN: New bug synopsis
......
...@@ -2209,6 +2209,26 @@ sp_instr_set::exec_core(THD *thd, uint *nextp) ...@@ -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); 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; *nextp = m_ip+1;
return res; return res;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment