Merge 10.2 into bb-10.2-ext
This commit is contained in:
commit
c6cd64f3cb
@ -1127,7 +1127,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success)
|
||||
We should also save Item tree change list to avoid rollback something
|
||||
too early in the calling query.
|
||||
*/
|
||||
thd->change_list.move_elements_to(&old_change_list);
|
||||
thd->Item_change_list::move_elements_to(&old_change_list);
|
||||
/*
|
||||
Cursors will use thd->packet, so they may corrupt data which was prepared
|
||||
for sending by upper level. OTOH cursors in the same routine can share this
|
||||
@ -1266,8 +1266,8 @@ sp_head::execute(THD *thd, bool merge_da_on_success)
|
||||
/* Restore all saved */
|
||||
thd->server_status= (thd->server_status & ~status_backup_mask) | old_server_status;
|
||||
old_packet.swap(thd->packet);
|
||||
DBUG_ASSERT(thd->change_list.is_empty());
|
||||
old_change_list.move_elements_to(&thd->change_list);
|
||||
DBUG_ASSERT(thd->Item_change_list::is_empty());
|
||||
old_change_list.move_elements_to(thd);
|
||||
thd->lex= old_lex;
|
||||
thd->set_query_id(old_query_id);
|
||||
DBUG_ASSERT(!thd->derived_tables);
|
||||
@ -3043,7 +3043,7 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp,
|
||||
bool parent_modified_non_trans_table= thd->transaction.stmt.modified_non_trans_table;
|
||||
thd->transaction.stmt.modified_non_trans_table= FALSE;
|
||||
DBUG_ASSERT(!thd->derived_tables);
|
||||
DBUG_ASSERT(thd->change_list.is_empty());
|
||||
DBUG_ASSERT(thd->Item_change_list::is_empty());
|
||||
/*
|
||||
Use our own lex.
|
||||
We should not save old value since it is saved/restored in
|
||||
|
@ -2720,8 +2720,10 @@ struct Item_change_record: public ilink
|
||||
thd->mem_root (due to possible set_n_backup_active_arena called for thd).
|
||||
*/
|
||||
|
||||
void THD::nocheck_register_item_tree_change(Item **place, Item *old_value,
|
||||
MEM_ROOT *runtime_memroot)
|
||||
void
|
||||
Item_change_list::nocheck_register_item_tree_change(Item **place,
|
||||
Item *old_value,
|
||||
MEM_ROOT *runtime_memroot)
|
||||
{
|
||||
Item_change_record *change;
|
||||
DBUG_ENTER("THD::nocheck_register_item_tree_change");
|
||||
@ -2762,8 +2764,10 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value,
|
||||
changes to substitute the same reference at both locations L1 and L2.
|
||||
*/
|
||||
|
||||
void THD::check_and_register_item_tree_change(Item **place, Item **new_value,
|
||||
MEM_ROOT *runtime_memroot)
|
||||
void
|
||||
Item_change_list::check_and_register_item_tree_change(Item **place,
|
||||
Item **new_value,
|
||||
MEM_ROOT *runtime_memroot)
|
||||
{
|
||||
Item_change_record *change;
|
||||
I_List_iterator<Item_change_record> it(change_list);
|
||||
@ -2778,7 +2782,7 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value,
|
||||
}
|
||||
|
||||
|
||||
void THD::rollback_item_tree_changes()
|
||||
void Item_change_list::rollback_item_tree_changes()
|
||||
{
|
||||
I_List_iterator<Item_change_record> it(change_list);
|
||||
Item_change_record *change;
|
||||
|
@ -1271,7 +1271,21 @@ public:
|
||||
*/
|
||||
|
||||
struct Item_change_record;
|
||||
typedef I_List<Item_change_record> Item_change_list;
|
||||
class Item_change_list
|
||||
{
|
||||
I_List<Item_change_record> change_list;
|
||||
public:
|
||||
void nocheck_register_item_tree_change(Item **place, Item *old_value,
|
||||
MEM_ROOT *runtime_memroot);
|
||||
void check_and_register_item_tree_change(Item **place, Item **new_value,
|
||||
MEM_ROOT *runtime_memroot);
|
||||
void rollback_item_tree_changes();
|
||||
void move_elements_to(Item_change_list *to)
|
||||
{
|
||||
change_list.move_elements_to(&to->change_list);
|
||||
}
|
||||
bool is_empty() { return change_list.is_empty(); }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
@ -2032,6 +2046,14 @@ void dbug_serve_apcs(THD *thd, int n_calls);
|
||||
*/
|
||||
|
||||
class THD :public Statement,
|
||||
/*
|
||||
This is to track items changed during execution of a prepared
|
||||
statement/stored procedure. It's created by
|
||||
nocheck_register_item_tree_change() in memory root of THD,
|
||||
and freed in rollback_item_tree_changes().
|
||||
For conventional execution it's always empty.
|
||||
*/
|
||||
public Item_change_list,
|
||||
public MDL_context_owner,
|
||||
public Open_tables_state
|
||||
{
|
||||
@ -2511,14 +2533,6 @@ public:
|
||||
#ifdef SIGNAL_WITH_VIO_CLOSE
|
||||
Vio* active_vio;
|
||||
#endif
|
||||
/*
|
||||
This is to track items changed during execution of a prepared
|
||||
statement/stored procedure. It's created by
|
||||
nocheck_register_item_tree_change() in memory root of THD, and freed in
|
||||
rollback_item_tree_changes(). For conventional execution it's always
|
||||
empty.
|
||||
*/
|
||||
Item_change_list change_list;
|
||||
|
||||
/*
|
||||
A permanent memory area of the statement. For conventional
|
||||
@ -3645,11 +3659,6 @@ public:
|
||||
*/
|
||||
memcpy((char*) place, new_value, sizeof(*new_value));
|
||||
}
|
||||
void nocheck_register_item_tree_change(Item **place, Item *old_value,
|
||||
MEM_ROOT *runtime_memroot);
|
||||
void check_and_register_item_tree_change(Item **place, Item **new_value,
|
||||
MEM_ROOT *runtime_memroot);
|
||||
void rollback_item_tree_changes();
|
||||
|
||||
/*
|
||||
Cleanup statement parse state (parse tree, lex) and execution
|
||||
|
@ -7957,7 +7957,7 @@ void mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||
sp_cache_enforce_limit(thd->sp_func_cache, stored_program_cache_size);
|
||||
thd->end_statement();
|
||||
thd->cleanup_after_query();
|
||||
DBUG_ASSERT(thd->change_list.is_empty());
|
||||
DBUG_ASSERT(thd->Item_change_list::is_empty());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -3876,7 +3876,7 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len)
|
||||
If called from a stored procedure, ensure that we won't rollback
|
||||
external changes when cleaning up after validation.
|
||||
*/
|
||||
DBUG_ASSERT(thd->change_list.is_empty());
|
||||
DBUG_ASSERT(thd->Item_change_list::is_empty());
|
||||
|
||||
/*
|
||||
Marker used to release metadata locks acquired while the prepared
|
||||
@ -4353,7 +4353,7 @@ Prepared_statement::execute_server_runnable(Server_runnable *server_runnable)
|
||||
bool error;
|
||||
Query_arena *save_stmt_arena= thd->stmt_arena;
|
||||
Item_change_list save_change_list;
|
||||
thd->change_list.move_elements_to(&save_change_list);
|
||||
thd->Item_change_list::move_elements_to(&save_change_list);
|
||||
|
||||
state= STMT_CONVENTIONAL_EXECUTION;
|
||||
|
||||
@ -4372,7 +4372,7 @@ Prepared_statement::execute_server_runnable(Server_runnable *server_runnable)
|
||||
thd->restore_backup_statement(this, &stmt_backup);
|
||||
thd->stmt_arena= save_stmt_arena;
|
||||
|
||||
save_change_list.move_elements_to(&thd->change_list);
|
||||
save_change_list.move_elements_to(thd);
|
||||
|
||||
/* Items and memory will freed in destructor */
|
||||
|
||||
@ -4600,7 +4600,7 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor)
|
||||
If the free_list is not empty, we'll wrongly free some externally
|
||||
allocated items when cleaning up after execution of this statement.
|
||||
*/
|
||||
DBUG_ASSERT(thd->change_list.is_empty());
|
||||
DBUG_ASSERT(thd->Item_change_list::is_empty());
|
||||
|
||||
/*
|
||||
The only case where we should have items in the thd->free_list is
|
||||
|
@ -3694,7 +3694,7 @@ btr_cur_update_in_place(
|
||||
#ifdef BTR_CUR_HASH_ADAPT
|
||||
{
|
||||
rw_lock_t* ahi_latch = block->index
|
||||
? btr_get_search_latch(block->index) : NULL;
|
||||
? btr_get_search_latch(index) : NULL;
|
||||
if (ahi_latch) {
|
||||
/* TO DO: Can we skip this if none of the fields
|
||||
index->search_info->curr_n_fields
|
||||
|
@ -1446,6 +1446,7 @@ srv_prepare_to_delete_redo_log_files(
|
||||
<< " bytes; LSN=" << flushed_lsn;
|
||||
}
|
||||
|
||||
srv_start_lsn = flushed_lsn;
|
||||
/* Flush the old log files. */
|
||||
log_mutex_exit();
|
||||
|
||||
@ -2246,17 +2247,32 @@ files_checked:
|
||||
|
||||
recv_sys->dblwr.pages.clear();
|
||||
|
||||
if (err == DB_SUCCESS) {
|
||||
/* Initialize the change buffer. */
|
||||
err = dict_boot();
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
return(srv_init_abort(err));
|
||||
}
|
||||
|
||||
/* This must precede recv_apply_hashed_log_recs(true). */
|
||||
trx_sys_init_at_db_start();
|
||||
switch (srv_operation) {
|
||||
case SRV_OPERATION_NORMAL:
|
||||
case SRV_OPERATION_RESTORE_EXPORT:
|
||||
/* Initialize the change buffer. */
|
||||
err = dict_boot();
|
||||
if (err != DB_SUCCESS) {
|
||||
return(srv_init_abort(err));
|
||||
}
|
||||
/* This must precede
|
||||
recv_apply_hashed_log_recs(true). */
|
||||
trx_sys_init_at_db_start();
|
||||
break;
|
||||
case SRV_OPERATION_RESTORE_DELTA:
|
||||
case SRV_OPERATION_BACKUP:
|
||||
ut_ad(!"wrong mariabackup mode");
|
||||
/* fall through */
|
||||
case SRV_OPERATION_RESTORE:
|
||||
/* mariabackup --prepare only deals with
|
||||
the redo log and the data files, not with
|
||||
transactions or the data dictionary. */
|
||||
break;
|
||||
}
|
||||
|
||||
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
||||
/* Apply the hashed log records to the
|
||||
|
Loading…
x
Reference in New Issue
Block a user