1
0
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:
Oleksandr Byelkin
2015-02-17 12:54:51 +01:00
parent dab12366b1
commit a71e2d23bd
14 changed files with 314 additions and 40 deletions

View File

@@ -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;
}