diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index 08f942b7d6d..396f5b448fc 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -61,6 +61,7 @@ sp_rcontext *sp_rcontext::create(THD *thd, const sp_pcontext *root_parsing_ctx, Field *return_value_fld) { + SELECT_LEX *save_current_select; sp_rcontext *ctx= new (thd->mem_root) sp_rcontext(root_parsing_ctx, return_value_fld, thd->in_sub_stmt); @@ -68,14 +69,19 @@ sp_rcontext *sp_rcontext::create(THD *thd, if (!ctx) return NULL; + /* Reset current_select as it's checked in Item_ident::Item_ident */ + save_current_select= thd->lex->current_select; + thd->lex->current_select= 0; + if (ctx->alloc_arrays(thd) || ctx->init_var_table(thd) || ctx->init_var_items(thd)) { delete ctx; - return NULL; + ctx= 0; } + thd->lex->current_select= save_current_select; return ctx; } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 21abc1a248c..99c57fc7cfa 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2876,6 +2876,12 @@ static bool do_execute_sp(THD *thd, sp_head *sp) ha_rows select_limit= thd->variables.select_limit; thd->variables.select_limit= HA_POS_ERROR; + /* + Reset current_select as it may point to random data as a + result of previous parsing. + */ + thd->lex->current_select= NULL; + /* We never write CALL statements into binlog: - If the mode is non-prelocked, each statement will be logged