Bug 8407, post review cleanup: use instr::get_cont_dest() to get the instruction
continuation instruction, for CONTINUE exception handlers.
parent b89b1922
......@@ -1078,7 +1078,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;
......@@ -2394,7 +2394,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)
res= instr->exec_core(thd, nextp);
......@@ -2443,8 +2443,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;
......@@ -2454,19 +2453,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);
}
......@@ -2654,9 +2650,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;
}
......@@ -2748,7 +2744,6 @@ sp_instr_jump_if_not::exec_core(THD *thd, uint *nextp)
if (! it)
{
res= -1;
*nextp = m_cont_dest;
}
else
{
......@@ -3317,7 +3312,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;
......
......@@ -449,11 +449,13 @@ class sp_instr :public Query_arena, public Sql_alloc
thd Thread handle
nextp OUT index of the next instruction to execute. (For most
instructions this will be the instruction following this
one).
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 occured
other if some error occurred
*/
virtual int execute(THD *thd, uint *nextp) = 0;
......@@ -463,22 +465,17 @@ class sp_instr :public Query_arena, public Sql_alloc
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.
......@@ -744,7 +741,7 @@ class sp_instr_opt_meta : public sp_instr
virtual void set_destination(uint old_dest, uint new_dest)
= 0;
virtual void get_cont_dest(uint *nextp);
virtual uint get_cont_dest();
protected:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment