mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-7006 MDEV-7007: SET STATEMENT and slow log
fixed embedded server tests MDEV-7009: SET STATEMENT min_examined_row_limit has no effect MDEV-6948:SET STATEMENT gtid_domain_id = ... FOR has no effect (same for gtid_seq_no and server_id) old values of SET STATENENT variables now saved in its own Query_arena and restored later
This commit is contained in:
@@ -2628,7 +2628,8 @@ void Query_tables_list::destroy_query_tables_list()
|
||||
|
||||
LEX::LEX()
|
||||
: explain(NULL),
|
||||
result(0), option_type(OPT_DEFAULT), sphead(0),
|
||||
result(0), arena_for_set_stmt(0), mem_root_for_set_stmt(0),
|
||||
option_type(OPT_DEFAULT), sphead(0),
|
||||
is_lex_started(0), limit_rows_examined_cnt(ULONGLONG_MAX)
|
||||
{
|
||||
|
||||
@@ -4223,6 +4224,67 @@ int LEX::print_explain(select_result_sink *output, uint8 explain_flags,
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allocates and set arena for SET STATEMENT old values.
|
||||
|
||||
@param backup where to save backup of arena.
|
||||
|
||||
@retval 1 Error
|
||||
@retval 0 OK
|
||||
*/
|
||||
|
||||
bool LEX::set_arena_for_set_stmt(Query_arena *backup)
|
||||
{
|
||||
DBUG_ENTER("LEX::set_arena_for_set_stmt");
|
||||
DBUG_ASSERT(arena_for_set_stmt== 0);
|
||||
if (!mem_root_for_set_stmt)
|
||||
{
|
||||
mem_root_for_set_stmt= new MEM_ROOT();
|
||||
if (!(mem_root_for_set_stmt))
|
||||
DBUG_RETURN(1);
|
||||
init_sql_alloc(mem_root_for_set_stmt, ALLOC_ROOT_SET, ALLOC_ROOT_SET,
|
||||
MYF(MY_THREAD_SPECIFIC));
|
||||
}
|
||||
if (!(arena_for_set_stmt= new(mem_root_for_set_stmt)
|
||||
Query_arena_memroot(mem_root_for_set_stmt,
|
||||
Query_arena::STMT_INITIALIZED)))
|
||||
DBUG_RETURN(1);
|
||||
DBUG_PRINT("info", ("mem_root: 0x%lx arena: 0x%lx",
|
||||
(ulong) mem_root_for_set_stmt,
|
||||
(ulong) arena_for_set_stmt));
|
||||
thd->set_n_backup_active_arena(arena_for_set_stmt, backup);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
void LEX::reset_arena_for_set_stmt(Query_arena *backup)
|
||||
{
|
||||
DBUG_ENTER("LEX::reset_arena_for_set_stmt");
|
||||
DBUG_ASSERT(arena_for_set_stmt);
|
||||
thd->restore_active_arena(arena_for_set_stmt, backup);
|
||||
DBUG_PRINT("info", ("mem_root: 0x%lx arena: 0x%lx",
|
||||
(ulong) arena_for_set_stmt->mem_root,
|
||||
(ulong) arena_for_set_stmt));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
void LEX::free_arena_for_set_stmt()
|
||||
{
|
||||
DBUG_ENTER("LEX::free_arena_for_set_stmt");
|
||||
if (!arena_for_set_stmt)
|
||||
return;
|
||||
DBUG_PRINT("info", ("mem_root: 0x%lx arena: 0x%lx",
|
||||
(ulong) arena_for_set_stmt->mem_root,
|
||||
(ulong) arena_for_set_stmt));
|
||||
arena_for_set_stmt->free_items();
|
||||
delete(arena_for_set_stmt);
|
||||
free_root(mem_root_for_set_stmt, MYF(MY_KEEP_PREALLOC));
|
||||
arena_for_set_stmt= 0;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void LEX::restore_set_statement_var()
|
||||
{
|
||||
DBUG_ENTER("LEX::restore_set_statement_var");
|
||||
@@ -4231,7 +4293,9 @@ void LEX::restore_set_statement_var()
|
||||
DBUG_PRINT("info", ("vars: %d", old_var_list.elements));
|
||||
sql_set_variables(thd, &old_var_list, false);
|
||||
old_var_list.empty();
|
||||
free_arena_for_set_stmt();
|
||||
}
|
||||
DBUG_ASSERT(!is_arena_for_set_stmt());
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user