From 122ffa22112ebc78a63e39cc2fcc7b9da3675926 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 27 Apr 2017 10:24:16 +0300 Subject: [PATCH] SQL(misc): Query_arena_stmt RAII --- sql/sql_class.cc | 13 +++++++++++++ sql/sql_class.h | 16 ++++++++++++++++ sql/sql_derived.cc | 5 +---- sql/sql_select.cc | 10 ++-------- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 1a422fd9966..052e5ae136d 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -7425,3 +7425,16 @@ bool Discrete_intervals_list::append(Discrete_interval *new_interval) } #endif /* !defined(MYSQL_CLIENT) */ + + +Query_arena_stmt::Query_arena_stmt(THD *_thd) : + thd(_thd) +{ + arena= thd->activate_stmt_arena_if_needed(&backup); +} + +Query_arena_stmt::~Query_arena_stmt() +{ + if (arena) + thd->restore_active_arena(arena, &backup); +} diff --git a/sql/sql_class.h b/sql/sql_class.h index 303992c40d8..b76b5cd6e60 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1024,6 +1024,22 @@ public: }; +class Query_arena_stmt +{ + THD *thd; + Query_arena backup; + Query_arena *arena; + +public: + Query_arena_stmt(THD *_thd); + ~Query_arena_stmt(); + bool arena_replaced() + { + return arena != NULL; + } +}; + + class Server_side_cursor; /** diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 43302498d57..eb99544ea0b 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -723,14 +723,11 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived) TABLE_SHARE *s= tl->table->s; const char *db= tl->db; const char *alias= tl->alias; - Query_arena backup; - Query_arena *arena= thd->activate_stmt_arena_if_needed(&backup); + Query_arena_stmt on_stmt_arena(thd); sl->item_list.push_back(new (thd->mem_root) Item_field( thd, &sl->context, db, alias, s->vers_start_field()->field_name)); sl->item_list.push_back(new (thd->mem_root) Item_field( thd, &sl->context, db, alias, s->vers_end_field()->field_name)); - if (arena) - thd->restore_active_arena(arena, &backup); } } } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 5901d1d4d6f..5ebd3126a23 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -695,7 +695,6 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr, TABLE_LIST *table; int versioned_tables= 0; int slex_conds_used= 0; - Query_arena *arena= 0, backup; if (!thd->stmt_arena->is_conventional() && !thd->stmt_arena->is_stmt_prepare() && !thd->stmt_arena->is_sp_execute()) @@ -727,7 +726,7 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr, /* For prepared statements we create items on statement arena, because they must outlive execution phase for multiple executions. */ - arena= thd->activate_stmt_arena_if_needed(&backup); + Query_arena_stmt on_stmt_arena(thd); if (slex->saved_where) { @@ -798,8 +797,6 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr, case TL_WRITE: case TL_WRITE_ONLY: my_error(ER_VERS_WRONG_PARAMS, MYF(0), "FOR SYSTEM_TIME query", "write-locking of historic rows"); - if (arena) - thd->restore_active_arena(arena, &backup); DBUG_RETURN(-1); default: break; @@ -969,7 +966,7 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr, cond2, cond1)); - if (arena) + if (on_stmt_arena.arena_replaced()) *dst_cond= cond1; else thd->change_item_tree(dst_cond, cond1); @@ -977,9 +974,6 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr, } // if (... table->table->versioned()) } // for (table= tables; ...) - if (arena) - thd->restore_active_arena(arena, &backup); - if (!slex_conds_used && slex->vers_conditions) { my_error(ER_VERS_WRONG_QUERY, MYF(0), "unused `QUERY FOR SYSTEM_TIME` clause!");