diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2022-10-17 02:15:05 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2022-10-17 02:15:05 +0300 |
commit | 22701cdb4ffffdb4f965bb122867eb6adafee735 (patch) | |
tree | cfb433704cd9f398279959db93b6bccebed024cd | |
parent | a25c1b7b79f8caccac036aacf54b04b97d755b3a (diff) | |
download | mariadb-git-22701cdb4ffffdb4f965bb122867eb6adafee735.tar.gz |
Progress
-rw-r--r-- | sql/ddl_log.cc | 8 | ||||
-rw-r--r-- | sql/sql_table.cc | 27 |
2 files changed, 33 insertions, 2 deletions
diff --git a/sql/ddl_log.cc b/sql/ddl_log.cc index 3887ff14ca0..40465a92031 100644 --- a/sql/ddl_log.cc +++ b/sql/ddl_log.cc @@ -3192,7 +3192,11 @@ static bool ddl_log_drop_init(DDL_LOG_STATE *ddl_state, ddl_log_entry.from_db= *const_cast<LEX_CSTRING*>(db); ddl_log_entry.tmp_name= *const_cast<LEX_CSTRING*>(comment); - DBUG_RETURN(ddl_log_write(ddl_state, &ddl_log_entry)); + DDL_LOG_MEMORY_ENTRY *main_entry_save= ddl_state->main_entry; + bool result= ddl_log_write(ddl_state, &ddl_log_entry); + ddl_state->main_entry= main_entry_save; + + DBUG_RETURN(result); } @@ -3249,6 +3253,8 @@ static bool ddl_log_drop(DDL_LOG_STATE *ddl_state, bzero(&ddl_log_entry, sizeof(ddl_log_entry)); ddl_log_entry.action_type= action_code; + ddl_log_entry.next_entry= ddl_state->main_entry ? ddl_state->main_entry->entry_pos : 0; + if (hton) lex_string_set(&ddl_log_entry.handler_name, ha_resolve_storage_engine_name(hton)); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 7301240598b..25a6ee30b64 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4502,12 +4502,37 @@ bool HA_CREATE_INFO::finalize_atomic_replace(THD *thd, TABLE_LIST *orig_table) Something is wrong with the old table! But C-O-R is almost done, so we finish it anyway by dropping the old table and applying new table. */ + + ddl_log_start_atomic_block(ddl_log_state_create); if (ddl_log_rename_table(ddl_log_state_create, db_type, &db, &table_name, &tmp_name.db, &tmp_name.table_name, DDL_RENAME_PHASE_TRIGGER, DDL_LOG_FLAG_FROM_IS_TMP)) + { + if (locked_tables_decremented) + thd->locked_tables_list.add_back_last_deleted_lock(pos_in_locked_tables); + return true; + } + + cpath.length= build_table_filename(path, sizeof(path) - 1, db.str, + table_name.str, "", 0); + + if (ddl_log_drop_table_init(ddl_log_state_create, &db, &empty_clex_str) || + ddl_log_drop_table(ddl_log_state_create, old_hton, &cpath, + &db, &table_name, 0)) + { + if (locked_tables_decremented) + thd->locked_tables_list.add_back_last_deleted_lock(pos_in_locked_tables); return true; + } + + if (ddl_log_commit_atomic_block(ddl_log_state_create)) + { + if (locked_tables_decremented) + thd->locked_tables_list.add_back_last_deleted_lock(pos_in_locked_tables); + return true; + } debug_crash_here("ddl_log_replace_broken_2"); /* We don't need restore from backup entry anymore, disabling it */ @@ -4523,7 +4548,7 @@ bool HA_CREATE_INFO::finalize_atomic_replace(THD *thd, TABLE_LIST *orig_table) */ DDL_LOG_STATE drop_broken_table; bzero(&drop_broken_table, sizeof(drop_broken_table)); - if (ddl_log_link_chains(ddl_log_state_create, &drop_broken_table)) + if (ddl_log_link_chains(&drop_broken_table, ddl_log_state_create)) { if (locked_tables_decremented) thd->locked_tables_list.add_back_last_deleted_lock(pos_in_locked_tables); |