summaryrefslogtreecommitdiff
path: root/sql/rpl_rli.h
diff options
context:
space:
mode:
authorAndrei Elkin <andrei.elkin@oracle.com>2012-04-20 19:41:20 +0300
committerAndrei Elkin <andrei.elkin@oracle.com>2012-04-20 19:41:20 +0300
commitf3509d1d67281af248988e117027c67667dae65c (patch)
treebb5c1d632c90bb4f7042bf18cfd4e1ab0c74a921 /sql/rpl_rli.h
parent5203d9bb98bc4696b916317045216de1ee55c663 (diff)
downloadmariadb-git-f3509d1d67281af248988e117027c67667dae65c.tar.gz
BUG#11754117 incorrect logging of INSERT into auto-increment
BUG#11761686 insert_id event is not filtered. Two issues are covered. INSERT into autoincrement field which is not the first part in the composed primary key is unsafe by autoincrement logging design. The case is specific to MyISAM engine because Innodb does not allow such table definition. However no warnings and row-format logging in the MIXED mode was done, and that is fixed. Int-, Rand-, User-var log-events were not filtered along with their parent query that made possible them to screw up execution context of the following query. Fixed with deferring their execution until the parent query. ****** Bug#11754117 Post review fixes.
Diffstat (limited to 'sql/rpl_rli.h')
-rw-r--r--sql/rpl_rli.h35
1 files changed, 35 insertions, 0 deletions
diff --git a/sql/rpl_rli.h b/sql/rpl_rli.h
index f49be72db46..959105b16e0 100644
--- a/sql/rpl_rli.h
+++ b/sql/rpl_rli.h
@@ -369,6 +369,41 @@ public:
*/
time_t last_event_start_time;
+ /*
+ A container to hold on Intvar-, Rand-, Uservar- log-events in case
+ the slave is configured with table filtering rules.
+ The withhold events are executed when their parent Query destiny is
+ determined for execution as well.
+ */
+ Deferred_log_events *deferred_events;
+
+ /*
+ State of the container: true stands for IRU events gathering,
+ false does for execution, either deferred or direct.
+ */
+ bool deferred_events_collecting;
+
+ /*
+ Returns true if the argument event resides in the containter;
+ more specifically, the checking is done against the last added event.
+ */
+ bool is_deferred_event(Log_event * ev)
+ {
+ return deferred_events_collecting ? deferred_events->is_last(ev) : false;
+ };
+ /* The general cleanup that slave applier may need at the end of query. */
+ inline void cleanup_after_query()
+ {
+ if (deferred_events)
+ deferred_events->rewind();
+ };
+ /* The general cleanup that slave applier may need at the end of session. */
+ void cleanup_after_session()
+ {
+ if (deferred_events)
+ delete deferred_events;
+ };
+
/**
Helper function to do after statement completion.