diff options
-rw-r--r-- | sql/sp_head.cc | 20 | ||||
-rw-r--r-- | sql/sp_head.h | 27 |
2 files changed, 19 insertions, 28 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 1e0986f6e82..b4c4d1bac85 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1117,7 +1117,7 @@ sp_head::execute(THD *thd) case SP_HANDLER_CONTINUE: thd->restore_active_arena(&execute_arena, &backup_arena); thd->set_n_backup_active_arena(&execute_arena, &backup_arena); - ctx->push_hstack(ip); + ctx->push_hstack(i->get_cont_dest()); // Fall through default: ip= hip; @@ -2448,7 +2448,7 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp, reinit_stmt_before_use(thd, m_lex); if (open_tables) - res= instr->exec_open_and_lock_tables(thd, m_lex->query_tables, nextp); + res= instr->exec_open_and_lock_tables(thd, m_lex->query_tables); if (!res) { @@ -2500,8 +2500,7 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp, sp_instr class functions */ -int sp_instr::exec_open_and_lock_tables(THD *thd, TABLE_LIST *tables, - uint *nextp) +int sp_instr::exec_open_and_lock_tables(THD *thd, TABLE_LIST *tables) { int result; @@ -2511,19 +2510,16 @@ int sp_instr::exec_open_and_lock_tables(THD *thd, TABLE_LIST *tables, */ if (check_table_access(thd, SELECT_ACL, tables, 0) || open_and_lock_tables(thd, tables)) - { - get_cont_dest(nextp); result= -1; - } else result= 0; return result; } -void sp_instr::get_cont_dest(uint *nextp) +uint sp_instr::get_cont_dest() { - *nextp= m_ip+1; + return (m_ip+1); } @@ -2716,9 +2712,9 @@ sp_instr_set_trigger_field::print(String *str) sp_instr_opt_meta */ -void sp_instr_opt_meta::get_cont_dest(uint *nextp) +uint sp_instr_opt_meta::get_cont_dest() { - *nextp= m_cont_dest; + return m_cont_dest; } @@ -2810,7 +2806,6 @@ sp_instr_jump_if_not::exec_core(THD *thd, uint *nextp) if (! it) { res= -1; - *nextp = m_cont_dest; } else { @@ -3379,7 +3374,6 @@ sp_instr_set_case_expr::exec_core(THD *thd, uint *nextp) spcont->clear_handler(); thd->spcont= spcont; } - *nextp= m_cont_dest; /* For continue handler */ } else *nextp= m_ip+1; diff --git a/sql/sp_head.h b/sql/sp_head.h index 46ad3dd96d8..1776d81b248 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -468,13 +468,15 @@ public: thd Thread handle nextp OUT index of the next instruction to execute. (For most instructions this will be the instruction following this - one). - - RETURN - 0 on success, - other if some error occured + one). Note that this parameter is undefined in case of + errors, use get_cont_dest() to find the continuation + instruction for CONTINUE error handlers. + + RETURN + 0 on success, + other if some error occurred */ - + virtual int execute(THD *thd, uint *nextp) = 0; /** @@ -482,22 +484,17 @@ public: Open and lock the tables used by this statement, as a pre-requisite to execute the core logic of this instruction with <code>exec_core()</code>. - If this statement fails, the next instruction to execute is also returned. - This is useful when a user defined SQL continue handler needs to be - executed. @param thd the current thread @param tables the list of tables to open and lock - @param nextp the continuation instruction, returned to the caller if this - method fails. @return zero on success, non zero on failure. */ - int exec_open_and_lock_tables(THD *thd, TABLE_LIST *tables, uint *nextp); + int exec_open_and_lock_tables(THD *thd, TABLE_LIST *tables); /** Get the continuation destination of this instruction. - @param nextp the continuation destination (output) + @return the continuation destination */ - virtual void get_cont_dest(uint *nextp); + virtual uint get_cont_dest(); /* Execute core function of instruction after all preparations (e.g. @@ -763,7 +760,7 @@ public: virtual void set_destination(uint old_dest, uint new_dest) = 0; - virtual void get_cont_dest(uint *nextp); + virtual uint get_cont_dest(); protected: |