Merge branch '10.1' into 10.2

# Conflicts:
#	sql/sp_head.cc
#	sql/sql_select.cc
#	sql/sql_trigger.cc
This commit is contained in:
Sergei Petrunia 2020-01-17 00:24:17 +03:00
commit b04429434a
14 changed files with 67 additions and 67 deletions

View File

@ -110,7 +110,8 @@ Item_args::Item_args(THD *thd, const Item_args *other)
arg_count= 0; arg_count= 0;
return; return;
} }
memcpy(args, other->args, sizeof(Item*) * arg_count); if (arg_count)
memcpy(args, other->args, sizeof(Item*) * arg_count);
} }

View File

@ -754,7 +754,7 @@ static sp_head *sp_compile(THD *thd, String *defstr, sql_mode_t sql_mode,
if (parse_sql(thd, & parser_state, creation_ctx) || thd->lex == NULL) if (parse_sql(thd, & parser_state, creation_ctx) || thd->lex == NULL)
{ {
sp= thd->lex->sphead; sp= thd->lex->sphead;
delete sp; sp_head::destroy(sp);
sp= 0; sp= 0;
} }
else else

View File

@ -284,7 +284,7 @@ uchar *hash_get_key_for_sp_head(const uchar *ptr, size_t *plen,
void hash_free_sp_head(void *p) void hash_free_sp_head(void *p)
{ {
sp_head *sp= (sp_head *)p; sp_head *sp= (sp_head *)p;
delete sp; sp_head::destroy(sp);
} }

View File

@ -532,51 +532,40 @@ check_routine_name(LEX_STRING *ident)
} }
sp_head* sp_head::create()
{
MEM_ROOT own_root;
init_sql_alloc(&own_root, MEM_ROOT_BLOCK_SIZE, MEM_ROOT_PREALLOC, MYF(0));
sp_head *sp;
if (!(sp= new (&own_root) sp_head(&own_root)))
free_root(&own_root, MYF(0));
return sp;
}
void sp_head::destroy(sp_head *sp)
{
if (sp)
{
/* Make a copy of main_mem_root as free_root will free the sp */
MEM_ROOT own_root= sp->main_mem_root;
DBUG_PRINT("info", ("mem_root %p moved to %p",
&sp->main_mem_root, &own_root));
delete sp;
free_root(&own_root, MYF(0));
}
}
/* /*
* *
* sp_head * sp_head
* *
*/ */
void * sp_head::sp_head(MEM_ROOT *mem_root_arg)
sp_head::operator new(size_t size) throw() :Query_arena(NULL, STMT_INITIALIZED_FOR_SP),
{ main_mem_root(*mem_root_arg), // todo: std::move operator.
DBUG_ENTER("sp_head::operator new");
MEM_ROOT own_root;
sp_head *sp;
init_sql_alloc(&own_root, MEM_ROOT_BLOCK_SIZE, MEM_ROOT_PREALLOC, MYF(0));
sp= (sp_head *) alloc_root(&own_root, size);
if (sp == NULL)
DBUG_RETURN(NULL);
sp->main_mem_root= own_root;
DBUG_PRINT("info", ("mem_root %p", &sp->mem_root));
DBUG_RETURN(sp);
}
void
sp_head::operator delete(void *ptr, size_t size) throw()
{
DBUG_ENTER("sp_head::operator delete");
MEM_ROOT own_root;
if (ptr == NULL)
DBUG_VOID_RETURN;
sp_head *sp= (sp_head *) ptr;
/* Make a copy of main_mem_root as free_root will free the sp */
own_root= sp->main_mem_root;
DBUG_PRINT("info", ("mem_root %p moved to %p",
&sp->mem_root, &own_root));
free_root(&own_root, MYF(0));
DBUG_VOID_RETURN;
}
sp_head::sp_head()
:Query_arena(&main_mem_root, STMT_INITIALIZED_FOR_SP),
m_flags(0), m_flags(0),
m_sp_cache_version(0), m_sp_cache_version(0),
m_creation_ctx(0), m_creation_ctx(0),
@ -585,6 +574,8 @@ sp_head::sp_head()
m_next_cached_sp(0), m_next_cached_sp(0),
m_cont_level(0) m_cont_level(0)
{ {
mem_root= &main_mem_root;
m_first_instance= this; m_first_instance= this;
m_first_free_instance= this; m_first_free_instance= this;
m_last_cached_sp= this; m_last_cached_sp= this;
@ -831,7 +822,7 @@ sp_head::~sp_head()
my_hash_free(&m_sptabs); my_hash_free(&m_sptabs);
my_hash_free(&m_sroutines); my_hash_free(&m_sroutines);
delete m_next_cached_sp; sp_head::destroy(m_next_cached_sp);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }

View File

@ -139,7 +139,7 @@ public:
bool bool
check_routine_name(LEX_STRING *ident); check_routine_name(LEX_STRING *ident);
class sp_head :private Query_arena class sp_head :private Query_arena, public Sql_alloc
{ {
sp_head(const sp_head &); /**< Prevent use of these */ sp_head(const sp_head &); /**< Prevent use of these */
void operator=(sp_head &); void operator=(sp_head &);
@ -298,14 +298,16 @@ public:
being opened is probably enough). being opened is probably enough).
*/ */
SQL_I_List<Item_trigger_field> m_trg_table_fields; SQL_I_List<Item_trigger_field> m_trg_table_fields;
private:
// users must use sp= sp_head::create()
sp_head(MEM_ROOT *mem_root_arg);
static void * // users must use sp_head::destroy(sp)
operator new(size_t size) throw (); virtual ~sp_head();
static void public:
operator delete(void *ptr, size_t size) throw (); static sp_head* create();
static void destroy(sp_head *sp);
sp_head();
/// Initialize after we have reset mem_root /// Initialize after we have reset mem_root
void void
@ -323,7 +325,6 @@ public:
void void
set_stmt_end(THD *thd); set_stmt_end(THD *thd);
virtual ~sp_head();
bool bool
execute_trigger(THD *thd, execute_trigger(THD *thd,

View File

@ -794,7 +794,7 @@ void lex_end_stage1(LEX *lex)
} }
else else
{ {
delete lex->sphead; sp_head::destroy(lex->sphead);
lex->sphead= NULL; lex->sphead= NULL;
} }
@ -2843,7 +2843,7 @@ void LEX::cleanup_lex_after_parse_error(THD *thd)
if (thd->lex->sphead) if (thd->lex->sphead)
{ {
thd->lex->sphead->restore_thd_mem_root(thd); thd->lex->sphead->restore_thd_mem_root(thd);
delete thd->lex->sphead; sp_head::destroy(thd->lex->sphead);
thd->lex->sphead= NULL; thd->lex->sphead= NULL;
} }
} }

View File

@ -4862,7 +4862,7 @@ mysql_execute_command(THD *thd)
/* Don't do it, if we are inside a SP */ /* Don't do it, if we are inside a SP */
if (!thd->spcont) if (!thd->spcont)
{ {
delete lex->sphead; sp_head::destroy(lex->sphead);
lex->sphead= NULL; lex->sphead= NULL;
} }
/* lex->unit.cleanup() is called outside, no need to call it here */ /* lex->unit.cleanup() is called outside, no need to call it here */

View File

@ -3877,7 +3877,7 @@ Prepared_statement::~Prepared_statement()
free_items(); free_items();
if (lex) if (lex)
{ {
delete lex->sphead; sp_head::destroy(lex->sphead);
delete lex->result; delete lex->result;
delete (st_lex_local *) lex; delete (st_lex_local *) lex;
} }

View File

@ -13863,15 +13863,18 @@ static int compare_fields_by_table_order(Item *field1,
{ {
int cmp= 0; int cmp= 0;
bool outer_ref= 0; bool outer_ref= 0;
Item_field *f1= (Item_field *) (field1->real_item()); Item *field1_real= field1->real_item();
Item_field *f2= (Item_field *) (field2->real_item()); Item *field2_real= field2->real_item();
if (field1->const_item() || f1->const_item())
if (field1->const_item() || field1_real->const_item())
return -1; return -1;
if (field2->const_item() || f2->const_item()) if (field2->const_item() || field2_real->const_item())
return 1; return 1;
Item_field *f1= (Item_field *) field1_real;
Item_field *f2= (Item_field *) field2_real;
if (f1->used_tables() & OUTER_REF_TABLE_BIT) if (f1->used_tables() & OUTER_REF_TABLE_BIT)
{ {
outer_ref= 1; outer_ref= -1;
cmp= -1; cmp= -1;
} }
if (f2->used_tables() & OUTER_REF_TABLE_BIT) if (f2->used_tables() & OUTER_REF_TABLE_BIT)

View File

@ -5994,7 +5994,7 @@ bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table,
{ {
free_table_share(&share); free_table_share(&share);
if (free_sp_head) if (free_sp_head)
delete sp; sp_head::destroy(sp);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }
@ -6045,7 +6045,7 @@ bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table,
} }
} }
if (free_sp_head) if (free_sp_head)
delete sp; sp_head::destroy(sp);
} }
free_table_share(&share); free_table_share(&share);
DBUG_RETURN(error); DBUG_RETURN(error);
@ -6131,7 +6131,7 @@ bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
store_column_type(table, field, cs, 5); store_column_type(table, field, cs, 5);
free_table_share(&share); free_table_share(&share);
if (free_sp_head) if (free_sp_head)
delete sp; sp_head::destroy(sp);
} }
} }

View File

@ -337,7 +337,7 @@ public:
Trigger::~Trigger() Trigger::~Trigger()
{ {
delete body; sp_head::destroy(body);
} }

View File

@ -226,7 +226,7 @@ static sp_head *make_sp_head(THD *thd, sp_name *name,
sp_head *sp; sp_head *sp;
/* Order is important here: new - reset - init */ /* Order is important here: new - reset - init */
if ((sp= new sp_head())) if ((sp= sp_head::create()))
{ {
sp->reset_thd_mem_root(thd); sp->reset_thd_mem_root(thd);
sp->init(lex); sp->init(lex);

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 2019, MariaDB Corporation. Copyright (c) 2013, 2020, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@ -992,6 +992,7 @@ try_again:
int64_t sig_count = os_event_reset(buf_dblwr->b_event); int64_t sig_count = os_event_reset(buf_dblwr->b_event);
mutex_exit(&buf_dblwr->mutex); mutex_exit(&buf_dblwr->mutex);
os_aio_simulated_wake_handler_threads();
os_event_wait_low(buf_dblwr->b_event, sig_count); os_event_wait_low(buf_dblwr->b_event, sig_count);
goto try_again; goto try_again;
} }
@ -1121,6 +1122,7 @@ try_again:
checkpoint. */ checkpoint. */
int64_t sig_count = os_event_reset(buf_dblwr->b_event); int64_t sig_count = os_event_reset(buf_dblwr->b_event);
mutex_exit(&buf_dblwr->mutex); mutex_exit(&buf_dblwr->mutex);
os_aio_simulated_wake_handler_threads();
os_event_wait_low(buf_dblwr->b_event, sig_count); os_event_wait_low(buf_dblwr->b_event, sig_count);
goto try_again; goto try_again;

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 2019, MariaDB Corporation. Copyright (c) 2013, 2020, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@ -963,6 +963,7 @@ try_again:
ib_int64_t sig_count = os_event_reset(buf_dblwr->b_event); ib_int64_t sig_count = os_event_reset(buf_dblwr->b_event);
mutex_exit(&buf_dblwr->mutex); mutex_exit(&buf_dblwr->mutex);
os_aio_simulated_wake_handler_threads();
os_event_wait_low(buf_dblwr->b_event, sig_count); os_event_wait_low(buf_dblwr->b_event, sig_count);
goto try_again; goto try_again;
} }
@ -1112,6 +1113,7 @@ try_again:
checkpoint. */ checkpoint. */
ib_int64_t sig_count = os_event_reset(buf_dblwr->b_event); ib_int64_t sig_count = os_event_reset(buf_dblwr->b_event);
mutex_exit(&buf_dblwr->mutex); mutex_exit(&buf_dblwr->mutex);
os_aio_simulated_wake_handler_threads();
os_event_wait_low(buf_dblwr->b_event, sig_count); os_event_wait_low(buf_dblwr->b_event, sig_count);
goto try_again; goto try_again;