From f2ba11c327c99c3e1c56a58967ea9f3da1deef3c Mon Sep 17 00:00:00 2001
From: "mats@kindahl-laptop.dnsalias.net" <>
Date: Fri, 19 Oct 2007 14:18:41 +0200
Subject: BUG#28618 (Skipping into the middle of a group with
 SQL_SLAVE_SKIP_COUNTER is possible):

When skipping the beginning of a transaction starting with BEGIN, the OPTION_BEGIN
flag was not set correctly, which caused the slave to not recognize that it was
inside a group. This patch sets the OPTION_BEGIN flag for BEGIN, COMMIT, ROLLBACK,
and XID events. It also adds checks if inside a group before decreasing the
slave skip counter to zero.

Begin_query_log_event was not marked that it could not end a group, which is now
corrected.
---
 sql/log_event.h | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

(limited to 'sql/log_event.h')

diff --git a/sql/log_event.h b/sql/log_event.h
index 05d4c70042f..9321860a062 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -870,6 +870,25 @@ public:
 
 protected:
 
+  /**
+     Helper function to ignore an event w.r.t. the slave skip counter.
+
+     This function can be used inside do_shall_skip() for functions
+     that cannot end a group. If the slave skip counter is 1 when
+     seeing such an event, the event shall be ignored, the counter
+     left intact, and processing continue with the next event.
+
+     A typical usage is:
+     @code
+     enum_skip_reason do_shall_skip(Relay_log_info *rli) {
+       return continue_group(rli);
+     }
+     @endcode
+
+     @return Skip reason
+   */
+  enum_skip_reason continue_group(Relay_log_info *rli);
+
   /**
     Primitive to apply an event to the database.
 
@@ -1086,6 +1105,7 @@ public:
 
 public:        /* !!! Public in this patch to allow old usage */
 #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
+  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
   virtual int do_apply_event(Relay_log_info const *rli);
   virtual int do_update_pos(Relay_log_info *rli);
 
@@ -1559,6 +1579,7 @@ class Xid_log_event: public Log_event
 private:
 #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
   virtual int do_apply_event(Relay_log_info const *rli);
+  enum_skip_reason do_shall_skip(Relay_log_info *rli);
 #endif
 };
 
@@ -1937,6 +1958,10 @@ public:
                              *description_event);
   ~Begin_load_query_log_event() {}
   Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
+private:
+#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
+  virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
+#endif
 };
 
 
-- 
cgit v1.2.1