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.
This commit is contained in:
commit
50d615f31f
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user