diff options
author | Monty <monty@mariadb.org> | 2018-01-21 20:16:22 +0200 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2018-01-21 20:22:14 +0200 |
commit | 6b7dcefdc83c4444ac8a4623b46810ff940528db (patch) | |
tree | 938e0c6302b43e22e04ff03991a9b16afe900c35 /sql/sp_rcontext.cc | |
parent | f67b8273c03b4802cb97e68b0c1baf5de330a2bf (diff) | |
download | mariadb-git-6b7dcefdc83c4444ac8a4623b46810ff940528db.tar.gz |
Reset thd->lex->current_select for SP
current_select may point to data from old parser states
when calling a stored procedure with CALL
The failure happens in Item::Item when testing if we are
in having.
Fixed by explicitely reseting current_select in do_execute_sp()
and in sp_rcontext::create(). The later is also needed for
stored functions().
Diffstat (limited to 'sql/sp_rcontext.cc')
-rw-r--r-- | sql/sp_rcontext.cc | 8 |
1 files changed, 7 insertions, 1 deletions
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; } |