summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2022-10-17 02:15:05 +0300
committerAleksey Midenkov <midenok@gmail.com>2022-10-17 02:15:05 +0300
commit22701cdb4ffffdb4f965bb122867eb6adafee735 (patch)
treecfb433704cd9f398279959db93b6bccebed024cd
parenta25c1b7b79f8caccac036aacf54b04b97d755b3a (diff)
downloadmariadb-git-22701cdb4ffffdb4f965bb122867eb6adafee735.tar.gz
Progress
-rw-r--r--sql/ddl_log.cc8
-rw-r--r--sql/sql_table.cc27
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);