summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2023-01-18 16:52:08 +0300
committerAleksey Midenkov <midenok@gmail.com>2023-01-26 17:15:20 +0300
commit059222ea882d26e3e59eebfb66b6e699fc50e975 (patch)
tree54d06c888662e71eade60ff4c33d7a76fb00eefa
parent28a370fb6c771728adb76d5791a5c9b17b77faa1 (diff)
downloadmariadb-git-059222ea882d26e3e59eebfb66b6e699fc50e975.tar.gz
MDEV-25292 Disable atomic replace for slave-generated or-replace
Also fixes wrong rollback of ddl_log_state_rm in case of non-atomic replace. There is no backup to remove in that case.
-rw-r--r--mysql-test/suite/rpl/r/create_or_replace_mix.result2
-rw-r--r--mysql-test/suite/rpl/r/create_or_replace_statement.result2
-rw-r--r--sql/handler.h3
-rw-r--r--sql/sql_table.cc7
4 files changed, 10 insertions, 4 deletions
diff --git a/mysql-test/suite/rpl/r/create_or_replace_mix.result b/mysql-test/suite/rpl/r/create_or_replace_mix.result
index 4d452d7d74e..fbcdc0ecc44 100644
--- a/mysql-test/suite/rpl/r/create_or_replace_mix.result
+++ b/mysql-test/suite/rpl/r/create_or_replace_mix.result
@@ -150,7 +150,7 @@ slave-bin.000001 # Query # # use `test`; create table t4 (server_2_to_be_delete
slave-bin.000001 # Gtid # # GTID #-#-#
slave-bin.000001 # Query # # use `test`; create table t1 (new_table int)
slave-bin.000001 # Gtid # # BEGIN GTID #-#-#
-slave-bin.000001 # Query # # use `test`; CREATE TABLE `t2` (
+slave-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE `t2` (
`a` int(11) DEFAULT NULL
)
slave-bin.000001 # Annotate_rows # # create table t2 select * from t9
diff --git a/mysql-test/suite/rpl/r/create_or_replace_statement.result b/mysql-test/suite/rpl/r/create_or_replace_statement.result
index 4d452d7d74e..fbcdc0ecc44 100644
--- a/mysql-test/suite/rpl/r/create_or_replace_statement.result
+++ b/mysql-test/suite/rpl/r/create_or_replace_statement.result
@@ -150,7 +150,7 @@ slave-bin.000001 # Query # # use `test`; create table t4 (server_2_to_be_delete
slave-bin.000001 # Gtid # # GTID #-#-#
slave-bin.000001 # Query # # use `test`; create table t1 (new_table int)
slave-bin.000001 # Gtid # # BEGIN GTID #-#-#
-slave-bin.000001 # Query # # use `test`; CREATE TABLE `t2` (
+slave-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE `t2` (
`a` int(11) DEFAULT NULL
)
slave-bin.000001 # Annotate_rows # # create table t2 select * from t9
diff --git a/sql/handler.h b/sql/handler.h
index e68fa42a926..d963611e7ac 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -2472,7 +2472,8 @@ struct Table_specification_st: public HA_CREATE_INFO,
}
bool is_atomic_replace() const
{
- return or_replace() && is_atomic_replace_usable();
+ return or_replace() && !or_replace_slave_generated() &&
+ is_atomic_replace_usable();
}
};
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 81603a61be1..b6b94ba989d 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -4409,6 +4409,8 @@ bool HA_CREATE_INFO::finalize_atomic_replace(THD *thd, TABLE_LIST *orig_table)
char path[FN_REFLEN + 1];
cpath.str= path;
+ DBUG_ASSERT(is_atomic_replace());
+
debug_crash_here("ddl_log_create_before_install_new");
if (old_hton)
{
@@ -4509,7 +4511,10 @@ void HA_CREATE_INFO::finalize_ddl(THD *thd, bool roll_back)
debug_crash_here("ddl_log_create_log_complete");
ddl_log_complete(ddl_log_state_create);
debug_crash_here("ddl_log_create_log_complete2");
- (void) ddl_log_revert(thd, ddl_log_state_rm);
+ if (is_atomic_replace())
+ (void) ddl_log_revert(thd, ddl_log_state_rm);
+ else
+ ddl_log_complete(ddl_log_state_rm);
debug_crash_here("ddl_log_create_log_complete3");
}
}