Commit c6cd64f3 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.2 into bb-10.2-ext

parents 656f66de f4401738
...@@ -1127,7 +1127,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success) ...@@ -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 We should also save Item tree change list to avoid rollback something
too early in the calling query. 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 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 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) ...@@ -1266,8 +1266,8 @@ sp_head::execute(THD *thd, bool merge_da_on_success)
/* Restore all saved */ /* Restore all saved */
thd->server_status= (thd->server_status & ~status_backup_mask) | old_server_status; thd->server_status= (thd->server_status & ~status_backup_mask) | old_server_status;
old_packet.swap(thd->packet); old_packet.swap(thd->packet);
DBUG_ASSERT(thd->change_list.is_empty()); DBUG_ASSERT(thd->Item_change_list::is_empty());
old_change_list.move_elements_to(&thd->change_list); old_change_list.move_elements_to(thd);
thd->lex= old_lex; thd->lex= old_lex;
thd->set_query_id(old_query_id); thd->set_query_id(old_query_id);
DBUG_ASSERT(!thd->derived_tables); DBUG_ASSERT(!thd->derived_tables);
...@@ -3043,7 +3043,7 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp, ...@@ -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; bool parent_modified_non_trans_table= thd->transaction.stmt.modified_non_trans_table;
thd->transaction.stmt.modified_non_trans_table= FALSE; thd->transaction.stmt.modified_non_trans_table= FALSE;
DBUG_ASSERT(!thd->derived_tables); DBUG_ASSERT(!thd->derived_tables);
DBUG_ASSERT(thd->change_list.is_empty()); DBUG_ASSERT(thd->Item_change_list::is_empty());
/* /*
Use our own lex. Use our own lex.
We should not save old value since it is saved/restored in We should not save old value since it is saved/restored in
......
...@@ -2720,7 +2720,9 @@ struct Item_change_record: public ilink ...@@ -2720,7 +2720,9 @@ struct Item_change_record: public ilink
thd->mem_root (due to possible set_n_backup_active_arena called for thd). 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, void
Item_change_list::nocheck_register_item_tree_change(Item **place,
Item *old_value,
MEM_ROOT *runtime_memroot) MEM_ROOT *runtime_memroot)
{ {
Item_change_record *change; Item_change_record *change;
...@@ -2762,7 +2764,9 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value, ...@@ -2762,7 +2764,9 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value,
changes to substitute the same reference at both locations L1 and L2. 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, void
Item_change_list::check_and_register_item_tree_change(Item **place,
Item **new_value,
MEM_ROOT *runtime_memroot) MEM_ROOT *runtime_memroot)
{ {
Item_change_record *change; Item_change_record *change;
...@@ -2778,7 +2782,7 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value, ...@@ -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); I_List_iterator<Item_change_record> it(change_list);
Item_change_record *change; Item_change_record *change;
......
...@@ -1271,7 +1271,21 @@ class Security_context { ...@@ -1271,7 +1271,21 @@ class Security_context {
*/ */
struct Item_change_record; 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); ...@@ -2032,6 +2046,14 @@ void dbug_serve_apcs(THD *thd, int n_calls);
*/ */
class THD :public Statement, 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 MDL_context_owner,
public Open_tables_state public Open_tables_state
{ {
...@@ -2511,14 +2533,6 @@ class THD :public Statement, ...@@ -2511,14 +2533,6 @@ class THD :public Statement,
#ifdef SIGNAL_WITH_VIO_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
Vio* active_vio; Vio* active_vio;
#endif #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 A permanent memory area of the statement. For conventional
...@@ -3645,11 +3659,6 @@ class THD :public Statement, ...@@ -3645,11 +3659,6 @@ class THD :public Statement,
*/ */
memcpy((char*) place, new_value, sizeof(*new_value)); 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 Cleanup statement parse state (parse tree, lex) and execution
......
...@@ -7957,7 +7957,7 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, ...@@ -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); sp_cache_enforce_limit(thd->sp_func_cache, stored_program_cache_size);
thd->end_statement(); thd->end_statement();
thd->cleanup_after_query(); thd->cleanup_after_query();
DBUG_ASSERT(thd->change_list.is_empty()); DBUG_ASSERT(thd->Item_change_list::is_empty());
} }
else else
{ {
......
...@@ -3876,7 +3876,7 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) ...@@ -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 If called from a stored procedure, ensure that we won't rollback
external changes when cleaning up after validation. 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 Marker used to release metadata locks acquired while the prepared
...@@ -4353,7 +4353,7 @@ Prepared_statement::execute_server_runnable(Server_runnable *server_runnable) ...@@ -4353,7 +4353,7 @@ Prepared_statement::execute_server_runnable(Server_runnable *server_runnable)
bool error; bool error;
Query_arena *save_stmt_arena= thd->stmt_arena; Query_arena *save_stmt_arena= thd->stmt_arena;
Item_change_list save_change_list; 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; state= STMT_CONVENTIONAL_EXECUTION;
...@@ -4372,7 +4372,7 @@ Prepared_statement::execute_server_runnable(Server_runnable *server_runnable) ...@@ -4372,7 +4372,7 @@ Prepared_statement::execute_server_runnable(Server_runnable *server_runnable)
thd->restore_backup_statement(this, &stmt_backup); thd->restore_backup_statement(this, &stmt_backup);
thd->stmt_arena= save_stmt_arena; 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 */ /* Items and memory will freed in destructor */
...@@ -4600,7 +4600,7 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) ...@@ -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 If the free_list is not empty, we'll wrongly free some externally
allocated items when cleaning up after execution of this statement. 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 The only case where we should have items in the thd->free_list is
......
...@@ -3694,7 +3694,7 @@ btr_cur_update_in_place( ...@@ -3694,7 +3694,7 @@ btr_cur_update_in_place(
#ifdef BTR_CUR_HASH_ADAPT #ifdef BTR_CUR_HASH_ADAPT
{ {
rw_lock_t* ahi_latch = block->index rw_lock_t* ahi_latch = block->index
? btr_get_search_latch(block->index) : NULL; ? btr_get_search_latch(index) : NULL;
if (ahi_latch) { if (ahi_latch) {
/* TO DO: Can we skip this if none of the fields /* TO DO: Can we skip this if none of the fields
index->search_info->curr_n_fields index->search_info->curr_n_fields
......
...@@ -1446,6 +1446,7 @@ srv_prepare_to_delete_redo_log_files( ...@@ -1446,6 +1446,7 @@ srv_prepare_to_delete_redo_log_files(
<< " bytes; LSN=" << flushed_lsn; << " bytes; LSN=" << flushed_lsn;
} }
srv_start_lsn = flushed_lsn;
/* Flush the old log files. */ /* Flush the old log files. */
log_mutex_exit(); log_mutex_exit();
...@@ -2246,17 +2247,32 @@ innobase_start_or_create_for_mysql() ...@@ -2246,17 +2247,32 @@ innobase_start_or_create_for_mysql()
recv_sys->dblwr.pages.clear(); recv_sys->dblwr.pages.clear();
if (err == DB_SUCCESS) { if (err != DB_SUCCESS) {
/* Initialize the change buffer. */ return(srv_init_abort(err));
err = dict_boot();
} }
switch (srv_operation) {
case SRV_OPERATION_NORMAL:
case SRV_OPERATION_RESTORE_EXPORT:
/* Initialize the change buffer. */
err = dict_boot();
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
return(srv_init_abort(err)); return(srv_init_abort(err));
} }
/* This must precede
/* This must precede recv_apply_hashed_log_recs(true). */ recv_apply_hashed_log_recs(true). */
trx_sys_init_at_db_start(); 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) { if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
/* Apply the hashed log records to the /* Apply the hashed log records to the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment