diff options
author | Monty <monty@mariadb.org> | 2018-02-01 20:03:18 +0200 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2018-02-01 20:03:44 +0200 |
commit | 859fe1f24d499b34d31807d267a534a7f72e9c03 (patch) | |
tree | 6fc1410c6868b9a96315e083eb75810daefd9d41 | |
parent | 44314c768f45ff7f0ad5d1133f4fd9ae0df12585 (diff) | |
download | mariadb-git-859fe1f24d499b34d31807d267a534a7f72e9c03.tar.gz |
Ensure that thd->user_var_events_alloc is always relevant
If binary logging is not enabled thd->user_var_events_alloc
would never be initialized.
-rw-r--r-- | sql/sp_head.cc | 5 | ||||
-rw-r--r-- | sql/sql_class.cc | 6 | ||||
-rw-r--r-- | sql/sql_parse.cc | 5 |
3 files changed, 12 insertions, 4 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 8b05d14f2de..eca72f4d643 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1135,6 +1135,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success) uint old_server_status; const uint status_backup_mask= SERVER_STATUS_CURSOR_EXISTS | SERVER_STATUS_LAST_ROW_SENT; + MEM_ROOT *user_var_events_alloc_saved= 0; Reprepare_observer *save_reprepare_observer= thd->m_reprepare_observer; Object_creation_ctx *UNINIT_VAR(saved_creation_ctx); Diagnostics_area *da= thd->get_stmt_da(); @@ -1326,9 +1327,11 @@ sp_head::execute(THD *thd, bool merge_da_on_success) Will write this SP statement into binlog separately. TODO: consider changing the condition to "not inside event union". */ - MEM_ROOT *user_var_events_alloc_saved= thd->user_var_events_alloc; if (thd->locked_tables_mode <= LTM_LOCK_TABLES) + { + user_var_events_alloc_saved= thd->user_var_events_alloc; thd->user_var_events_alloc= thd->mem_root; + } sql_digest_state *parent_digest= thd->m_digest; thd->m_digest= NULL; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index d0b45441d83..6922a7ae5df 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -772,6 +772,12 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) init_sql_alloc(&main_mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0, MYF(MY_THREAD_SPECIFIC)); + /* + Allocation of user variables for binary logging is always done with main + mem root + */ + user_var_events_alloc= mem_root; + stmt_arena= this; thread_stack= 0; scheduler= thread_scheduler; // Will be fixed later diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 7e9159a9c9b..835ffeaecb3 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -7483,10 +7483,9 @@ void THD::reset_for_next_command(bool do_clear_error) thd->thread_specific_used= FALSE; if (opt_bin_log) - { reset_dynamic(&thd->user_var_events); - thd->user_var_events_alloc= thd->mem_root; - } + DBUG_ASSERT(thd->user_var_events_alloc == &thd->main_mem_root); + thd->get_stmt_da()->reset_for_next_command(); thd->rand_used= 0; thd->m_sent_row_count= thd->m_examined_row_count= 0; |