Commit d6c2a1e3 authored by unknown's avatar unknown
Browse files

Fixed BUG#9856: Stored procedures: crash if handler for sqlexception, not found.


mysql-test/r/sp.result:
  Added test case for BUG#6129.
mysql-test/t/sp.test:
  Added test case for BUG#6129.
sql/sp_pcontext.h:
  Only need one handler counter.
sql/sql_yacc.yy:
  Count handlers correctly.
parent a3aed4d8
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -2862,4 +2862,22 @@ call bug6129(@@sql_mode)|
@@sql_mode = mode
0
drop procedure bug6129|
drop procedure if exists bug9856|
create procedure bug9856()
begin
declare v int;
declare c cursor for select data from t1;
declare exit handler for sqlexception, not found select '16';
open c;
fetch c into v;
select v;
end|
delete from t1|
call bug9856()|
16
16
call bug9856()|
16
16
drop procedure bug9856|
drop table t1,t2;
+23 −0
Original line number Diff line number Diff line
@@ -3514,6 +3514,29 @@ call bug6129(@@sql_mode)|
drop procedure bug6129|


#
# BUG#9856: Stored procedures: crash if handler for sqlexception, not found
#
--disable_warnings
drop procedure if exists bug9856|
--enable_warnings
create procedure bug9856()
begin
  declare v int;
  declare c cursor for select data from t1;
  declare exit handler for sqlexception, not found select '16';

  open c;
  fetch c into v;
  select v;
end|

delete from t1|
call bug9856()|
call bug9856()|
drop procedure bug9856|


#
# BUG#NNNN: New bug synopsis
#
+1 −7
Original line number Diff line number Diff line
@@ -235,12 +235,6 @@ class sp_pcontext : public Sql_alloc
  // Handlers
  //

  inline void
  add_handler()
  {
    m_handlers+= 1;
  }

  inline void
  push_handler(sp_cond_type_t *cond)
  {
@@ -257,7 +251,7 @@ class sp_pcontext : public Sql_alloc
  }

  inline void
  push_handlers(uint n)
  add_handlers(uint n)
  {
    m_handlers+= n;
  }
+1 −1
Original line number Diff line number Diff line
@@ -1681,7 +1681,6 @@ sp_decl:

	    sp->add_instr(i);
	    sp->push_backpatch(i, ctx->push_label((char *)"", 0));
	    ctx->add_handler();
	    sp->m_in_handler= TRUE;
	  }
	  sp_hcond_list sp_proc_stmt
@@ -1709,6 +1708,7 @@ sp_decl:
	    sp->m_in_handler= FALSE;
	    $$.vars= $$.conds= $$.curs= 0;
	    $$.hndlrs= $6;
	    ctx->add_handlers($6);
	  }
	| DECLARE_SYM ident CURSOR_SYM FOR_SYM sp_cursor_stmt
	  {