diff options
author | unknown <pem@mysql.comhem.se> | 2004-09-10 11:11:52 +0200 |
---|---|---|
committer | unknown <pem@mysql.comhem.se> | 2004-09-10 11:11:52 +0200 |
commit | 1912148cec19f4a20eddae9d0143124909872173 (patch) | |
tree | 177a307bee403859b893521b666bfd245cbef01f /sql/sp_rcontext.cc | |
parent | 862e78568e43272002dea1a12ff62e3d097be558 (diff) | |
download | mariadb-git-1912148cec19f4a20eddae9d0143124909872173.tar.gz |
Fixed BUG#3294: Stored procedure crash if table dropped before use.
Dropping the table was not the real problem, the problem was with errors
occuring within error handlers.
mysql-test/r/sp-error.result:
New test case for BUG#3294.
mysql-test/t/sp-error.test:
New test case for BUG#3294.
sql/sp_head.cc:
Use hreturn instruction both for continue and exit handlers (a special case
of a jump).
sql/sp_head.h:
Use hreturn instruction both for continue and exit handlers (a special case
of a jump).
sql/sp_rcontext.cc:
Keep track on if we're in a handler already, for error handling.
sql/sp_rcontext.h:
Keep track on if we're in a handler already, for error handling.
sql/sql_yacc.yy:
Use hreturn instruction both for continue and exit handlers (a special case
of a jump).
Diffstat (limited to 'sql/sp_rcontext.cc')
-rw-r--r-- | sql/sp_rcontext.cc | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index 7fa44f217f6..1bdd022470b 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -32,6 +32,7 @@ sp_rcontext::sp_rcontext(uint fsize, uint hmax, uint cmax) : m_count(0), m_fsize(fsize), m_result(NULL), m_hcount(0), m_hsp(0), m_hfound(-1), m_ccount(0) { + in_handler= FALSE; m_frame= (Item **)sql_alloc(fsize * sizeof(Item*)); m_outs= (int *)sql_alloc(fsize * sizeof(int)); m_handler= (sp_handler_t *)sql_alloc(hmax * sizeof(sp_handler_t)); @@ -58,6 +59,8 @@ sp_rcontext::set_item_eval(uint idx, Item *i, enum_field_types type) int sp_rcontext::find_handler(uint sql_errno) { + if (in_handler) + return 0; // Already executing a handler if (m_hfound >= 0) return 1; // Already got one |