From 5f5f7befe37e942d4fff0771ac79d143ca4500c6 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 23 Jan 2014 11:11:01 +0200 Subject: [PATCH] MDEV-5356: Server crashes in Item_equal::contains on 2nd execution of a PS THD::thd->activate_stmt_arena_if_needed() should be used to temporary activating statement arena instead of direct usage of THD::set_n_backup_active_arena() because possible such scenario: 1) func1 saves current arena and activates copy1 of statement arena 2) func2 saves copy1 of statement arena setup by func1 and activates copy2 3) some changes made for copy 2 4) func2 stores changed copy2 back to statenet arena and activates copy1 5) func1 store unchanged copy1 back to statemnt arena (rewrite changed copy 2 so changes become lost) and activates arena which was before. --- sql/sql_base.cc | 7 ++----- sql/sql_select.cc | 7 ++----- sql/sql_view.cc | 6 +----- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 283d56f6d48..2b0f0daf554 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -7843,12 +7843,9 @@ bool setup_tables(THD *thd, Name_resolution_context *context, { DBUG_ASSERT(table_list->view && table_list->effective_algorithm == VIEW_ALGORITHM_MERGE); - Query_arena *arena= thd->stmt_arena, backup; + Query_arena *arena, backup; + arena= thd->activate_stmt_arena_if_needed(&backup); bool res; - if (arena->is_conventional()) - arena= 0; // For easier test - else - thd->set_n_backup_active_arena(arena, &backup); res= table_list->setup_underlying(thd); if (arena) thd->restore_active_arena(arena, &backup); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d8bbabd5f63..6434c045da0 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -882,11 +882,8 @@ JOIN::optimize() MEMROOT for prepared statements and stored procedures. */ - Query_arena *arena= thd->stmt_arena, backup; - if (arena->is_conventional()) - arena= 0; // For easier test - else - thd->set_n_backup_active_arena(arena, &backup); + Query_arena *arena, backup; + arena= thd->activate_stmt_arena_if_needed(&backup); sel->first_cond_optimization= 0; diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 27bdfed6bea..8dde595f401 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -1121,11 +1121,7 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table, will be TRUE as far as we make new table cache). */ old_lex= thd->lex; - arena= thd->stmt_arena; - if (arena->is_conventional()) - arena= 0; - else - thd->set_n_backup_active_arena(arena, &backup); + arena= thd->activate_stmt_arena_if_needed(&backup); /* init timestamp */ if (!table->timestamp.str)