diff --git a/sql/log_event.cc b/sql/log_event.cc index e53cbd310ea..4351ef93e29 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -6127,6 +6127,20 @@ int Rows_log_event::do_apply_event(RELAY_LOG_INFO const *rli) DBUG_RETURN(0); } +Log_event::enum_skip_reason +Rows_log_event::do_shall_skip(RELAY_LOG_INFO *rli) +{ + /* + If the slave skip counter is 1 and this event does not end a + statement, then we should not start executing on the next event. + Otherwise, we defer the decision to the normal skipping logic. + */ + if (rli->slave_skip_counter == 1 && !get_flags(STMT_END_F)) + return Log_event::EVENT_SKIP_IGNORE; + else + return Log_event::do_shall_skip(rli); +} + int Rows_log_event::do_update_pos(RELAY_LOG_INFO *rli) { @@ -6599,6 +6613,19 @@ err: DBUG_RETURN(error); } +Log_event::enum_skip_reason +Table_map_log_event::do_shall_skip(RELAY_LOG_INFO *rli) +{ + /* + If the slave skip counter is 1, then we should not start executing + on the next event. + */ + if (rli->slave_skip_counter == 1) + return Log_event::EVENT_SKIP_IGNORE; + else + return Log_event::do_shall_skip(rli); +} + int Table_map_log_event::do_update_pos(RELAY_LOG_INFO *rli) { rli->inc_event_relay_log_pos(); diff --git a/sql/log_event.h b/sql/log_event.h index 4e43822cb38..dec7a599410 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -2066,6 +2066,7 @@ private: #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) virtual int do_apply_event(RELAY_LOG_INFO const *rli); virtual int do_update_pos(RELAY_LOG_INFO *rli); + virtual enum_skip_reason do_shall_skip(RELAY_LOG_INFO *rli); #endif #ifndef MYSQL_CLIENT @@ -2244,6 +2245,7 @@ private: #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) virtual int do_apply_event(RELAY_LOG_INFO const *rli); virtual int do_update_pos(RELAY_LOG_INFO *rli); + virtual enum_skip_reason do_shall_skip(RELAY_LOG_INFO *rli); /* Primitive to prepare for a sequence of row executions.