Loading mysql-test/r/sp.result +36 −0 Original line number Diff line number Diff line Loading @@ -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; mysql-test/t/sp.test +42 −0 Original line number Diff line number Diff line Loading @@ -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 Loading sql/sp_head.cc +20 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
mysql-test/r/sp.result +36 −0 Original line number Diff line number Diff line Loading @@ -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;
mysql-test/t/sp.test +42 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
sql/sp_head.cc +20 −0 Original line number Diff line number Diff line Loading @@ -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