From 3a6e84a2b36d6bf49bedc6f0e4f97b79220456d2 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 10 Jan 2008 16:39:44 +0100 Subject: [PATCH] BUG#27779: Slave cannot read old rows log events. Problem: Replication fails when master is mysql-5.1-wl2325-5.0-drop6 and slave is mysql-5.1-new-rpl. The reason is that, in mysql-5.1-wl2325-5.0-drop6, the event type id's were different than in mysql-5.1-new-rpl. Fix (in mysql-5.1-new-rpl): (1) detect that the server that generated the events uses the old format, by checking the server version of the format_description_log_event This patch recognizes mysql-5.1-wl2325-5.0-drop6p13-alpha, mysql-5.1-wl2325-5.0-drop6, mysql-5.1-wl2325-5.0, mysql-5.1-wl2325-no-dd. (2) if the generating server is old, map old event types to new event types using a permutation array. I've also added a test case which reads binlogs for four different versions. mysql-test/suite/binlog/std_data/binlog_old_version_5_1-telco.000001: BitKeeper file /home/sven/bk/b27779-old_row_events/5.1-new-rpl/mysql-test/suite/binlog/std_data/binlog_old_version_5_1-telco.000001 mysql-test/suite/binlog/std_data/binlog_old_version_5_1-wl2325_row.000001: BitKeeper file /home/sven/bk/b27779-old_row_events/5.1-new-rpl/mysql-test/suite/binlog/std_data/binlog_old_version_5_1-wl2325_row.000001 mysql-test/suite/binlog/std_data/binlog_old_version_5_1-wl2325_stm.000001: BitKeeper file /home/sven/bk/b27779-old_row_events/5.1-new-rpl/mysql-test/suite/binlog/std_data/binlog_old_version_5_1-wl2325_stm.000001 mysql-test/suite/binlog/std_data/binlog_old_version_5_1_17.000001: BitKeeper file /home/sven/bk/b27779-old_row_events/5.1-new-rpl/mysql-test/suite/binlog/std_data/binlog_old_version_5_1_17.000001 mysql-test/suite/binlog/std_data/binlog_old_version_5_1_23.000001: BitKeeper file /home/sven/bk/b27779-old_row_events/5.1-new-rpl/mysql-test/suite/binlog/std_data/binlog_old_version_5_1_23.000001 sql/log_event.cc: Added code to read events generated by mysql-5.1-wl2325-5.0-drop6p13-alpha, mysql-5.1-wl2325-5.0-drop6, mysql-5.1-wl2325-5.0, mysql-5.1-wl2325-no-dd. More precisely, the event type id's had different numbers in those versions. To fix, we add a permutation array which maps old_id to new_id when the format_description_log_event indicates that the originating server is of the old type. We also need to permute the post_header_len array accordingly. sql/log_event.h: sql/log_event.h@1.169, 2008-01-09 11:34:37+01:00, sven@riska.(none) +5 -1 Added declaration needed in log_event.cc. Also, the destructor of Format_description_log_event is sometimes called when post_header_len is null, so we must pass the MY_ALLOW_ZERO_PTR flag to my_free. mysql-test/suite/binlog/r/binlog_old_versions.result: Result file for new test. mysql-test/suite/binlog/t/binlog_old_versions.test: New test case that loads binlogs from several old versions. --- .../suite/binlog/r/binlog_old_versions.result | 61 ++++++++ .../binlog_old_version_5_1-telco.000001 | Bin 0 -> 150385 bytes .../binlog_old_version_5_1-wl2325_row.000001 | Bin 0 -> 705 bytes .../binlog_old_version_5_1-wl2325_stm.000001 | Bin 0 -> 149796 bytes .../std_data/binlog_old_version_5_1_17.000001 | Bin 0 -> 150385 bytes .../std_data/binlog_old_version_5_1_23.000001 | Bin 0 -> 150402 bytes .../suite/binlog/t/binlog_old_versions.test | 147 ++++++++++++++++++ sql/log_event.cc | 86 +++++++++- sql/log_event.h | 6 +- 9 files changed, 297 insertions(+), 3 deletions(-) create mode 100644 mysql-test/suite/binlog/r/binlog_old_versions.result create mode 100644 mysql-test/suite/binlog/std_data/binlog_old_version_5_1-telco.000001 create mode 100644 mysql-test/suite/binlog/std_data/binlog_old_version_5_1-wl2325_row.000001 create mode 100644 mysql-test/suite/binlog/std_data/binlog_old_version_5_1-wl2325_stm.000001 create mode 100644 mysql-test/suite/binlog/std_data/binlog_old_version_5_1_17.000001 create mode 100644 mysql-test/suite/binlog/std_data/binlog_old_version_5_1_23.000001 create mode 100644 mysql-test/suite/binlog/t/binlog_old_versions.test diff --git a/mysql-test/suite/binlog/r/binlog_old_versions.result b/mysql-test/suite/binlog/r/binlog_old_versions.result new file mode 100644 index 00000000000..a514f9278a6 --- /dev/null +++ b/mysql-test/suite/binlog/r/binlog_old_versions.result @@ -0,0 +1,61 @@ +DROP TABLE IF EXISTS t1, t2, t3; +==== Read modern binlog (version 5.1.23) ==== +SELECT * FROM t1 ORDER BY a; +a b +0 last_insert_id +1 one +3 last stm in trx: next event should be xid +4 four +674568 random +SELECT * FROM t2 ORDER BY a; +a b +3 first stm in trx +SELECT COUNT(*) FROM t3; +COUNT(*) +17920 +DROP TABLE t1, t2, t3; +==== Read binlog from version 5.1.17 ==== +SELECT * FROM t1 ORDER BY a; +a b +0 last_insert_id +1 one +3 last stm in trx: next event should be xid +4 four +764247 random +SELECT * FROM t2 ORDER BY a; +a b +3 first stm in trx +SELECT COUNT(*) FROM t3; +COUNT(*) +17920 +DROP TABLE t1, t2, t3; +==== Read binlog from alcatel tree (mysql-5.1-wl2325-5.0-drop6) ==== +SELECT * FROM t1 ORDER BY a; +a b +0 last_insert_id +1 one +3 last stm in trx: next event should be xid +4 four +781729 random +SELECT * FROM t2 ORDER BY a; +a b +3 first stm in trx +SELECT COUNT(*) FROM t3; +COUNT(*) +17920 +DROP TABLE t1, t2, t3; +==== Read binlog from ndb tree (mysql-5.1-telco-6.1) ==== +SELECT * FROM t1 ORDER BY a; +a b +0 last_insert_id +1 one +3 last stm in trx: next event should be xid +4 four +703356 random +SELECT * FROM t2 ORDER BY a; +a b +3 first stm in trx +SELECT COUNT(*) FROM t3; +COUNT(*) +17920 +DROP TABLE t1, t2, t3; diff --git a/mysql-test/suite/binlog/std_data/binlog_old_version_5_1-telco.000001 b/mysql-test/suite/binlog/std_data/binlog_old_version_5_1-telco.000001 new file mode 100644 index 0000000000000000000000000000000000000000..76856cb04a2eb5eec4276f605fc8a67d1a6688d2 GIT binary patch literal 150385 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 GSPcNT7kLN( literal 0 HcmV?d00001 diff --git a/mysql-test/suite/binlog/std_data/binlog_old_version_5_1-wl2325_stm.000001 b/mysql-test/suite/binlog/std_data/binlog_old_version_5_1-wl2325_stm.000001 new file mode 100644 index 0000000000000000000000000000000000000000..4302bfed879d3b9dc692f11c13029f733771d724 GIT binary patch literal 149796 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 literal 0 HcmV?d00001 diff --git a/mysql-test/suite/binlog/std_data/binlog_old_version_5_1_17.000001 b/mysql-test/suite/binlog/std_data/binlog_old_version_5_1_17.000001 new file mode 100644 index 0000000000000000000000000000000000000000..9b6e200e492025f270cd28cec67795ca96fc136e GIT binary patch literal 150385 zcmeI5UvC^&8OBd+r*b0|Oaep-T#TS1PHECQp$bC$$p)Lq#dV~_a8rqB#yj?|vYAz9 z#>V~t?HzmzJ^rKyXf@P%RfnHG z+Uo6XC40U5J6lP;k*uf5u&CcovSfddmh11md*ep3wfkUucPsf(^1tZvV`Er0U+wB~opz9_#zOZ7%r zTK-h8`>J-oW6Qt%65{JFgr$GK&^wmLMgBssSgwCPe&w)l`WN!Khy9w~)UzeG*R9#V z{{G8hUq1c|9rE0Xe)GjA`npc^9b5kJ*%Q5dGzZhBz3QKSG=H$INx*b}%Yf2-StEOw zmg(TJz596U(O$B>yZ11uZzsR(?fhcvak75r?d1Bwu&nB&s-GD|le#>)?%$qY@5gqY zf6RBTjaSY!N?$qE50WB3sgwLTFYF2iXd=_NROC zCGC34mYcpyTPI=ZC$?I(#hMrKgp8eyZE@r3qc<)Js*pqF$EV~$e(@%y)m6x`%uk*QmXJ64pUA2z%&liP% zExoiH995TWH7+jovNTIC*|Pssj|a6L?K2haI`6lwVR6_tpBZ@CwjXJ+2eeD5avi^l zXRq@1gt1k{eQ`DLjY0FuLEb#uTy52?Yd>BcUsZRnb33y= zQ5I=E(6!{H0bQq5!%qc>0Fl7~5P2`9A6Ht@6M0`lPgJzSl?Kv?4Ih3O&U_Th{hlzK zO+~W2pYd)cau_&~Ga5M2G)x^3*)IrUZ7`Ta?g1h|G`GzF5CI}Ugq;XuqxFO}#zu^d zgT_*g#Ttt>5+Aq6jLtZSHN+ZX4Y7t;L#*-QYczyd#|RLOi-dyMU9hmC)h_W+Uj zFfrB)XBM+hpuTkn6Y^k&GqOGA=D~mn5CI}j4IuA~ytBsNPx7L23th~SyhsKt>I`F} zGOAH$s547PcfLq2KDqc_hJu0)vR@iaqM$?L&v!Ldwe>&TKSEUy&oLHEAlBxsYaoK} zjM6fA@gdgJq|Rfp#$t`d8jCfR(iAxYv4&U^9_s}kU09iQikgkqF-Tbv9*f0VI3S(~ zi#63_jVv`OC0MMjSHNN|8I8r7I@XhpkB*jz8L~Y*B*X)RDEv8%^%4+i>>=9&bw)hV zRAr}ed*Jq%+pGhK01+UT*Iz zd?fzd9S0x+M1Tl85q2W%L@{MiY@Fo9$i}>1pehJneCr&Du_nga`o>9P$RO4bYlt<( z8e$ExhFCMVN18R0H;}w&)X2gSdYN?$B2*A-h&9CekaBxPT9dp;@?v9v9G4OgBri%v zle|ds;-rQrM@z&E$%`Z}rU%}ENPr0x6IO@-L>hZYUPPUdyf{_If!hPO$J}NeKm>>Y z5xz5gXX4=`FOs}S@*>HLBrkS8)ZEm0<4(nQHicOSVhyo|SVOEK)(~rg(g;fHSQJ5N z1f?Bo;#Y|EO#V`cHN+ZX4Y7t;L#!dz5Nn9F&5@mAvF>mHv7Rju5fDMFA=VIUh&99- zVhyqG2o)A_u<)LvYT@F~Q*MuPd#x`^B)fq~#0(Ynsi;3& zysb35LQ?G!5CI}U)YflQ|JsJ0d0;`i;lt3`hDU8HoSSJGtQTR@JPLnmG!a9I1BzOW z-Z^g@#CL}84Br`cB7A3J;7EKVJ`$gb`qU@tq!;yxW>e%4Ylt<(8e$ExhFBAncHZzL zRN(etB4I4nOeE|^2Q1dqC#nbX*om+cX;`G(Uf;AE$%`Z}dM=)& ze+-LsB)Vjt%~4v5G*BkydsC^yuZIuN}0c=7S#F8MzR1A zZjZT179avdfQU+IR7$g+kVF2 zPt_@8V|R3nYbz6{4cs1ciz$3(fCv!bJHvM-+ay701f>y_Mo=0-X`S>UC~Y=>Da0CL z4Y7t;L#!dz1f>y_))6X-Tp2Yonb}*wJP+zxh-@62WNqV$@SRN^TLOq$@U&|{1c6|>(`(YGNu!=EEWqKTv4vdxriv`;40VP& zQJz9>pgw{63wFk#&WwjLw}-)i zxjmeKG4mpGd!*JUWS$0u@62um>I`*eo)DFw(2oLjW;emC+3q*32EKthL!F_{P-m#K zE`XXe>e>9IgvXLbO&T>pX}CRbdyqy=8g)mgNTVi=`gmw@0%mb&t<=m$ZG(jRh!{LU zJQ3L*QV&?Hu~=iVj%I3^C8Mbti?w0G2Z}z#`hSR6Kfn9QgV!&F5Uy^8@b~wZtfd92 zqz>Rf*PzHE)27Y$X~SGORB1XU^y+d&iOKF)od`)7tn z`(0pzgjlP4WL8g$i!6(@9;nccOpg%j=%s*IL#!dz!y+A7#~?=CtRU79>sXDfV^KKw zaqi>Xe=0tS#X1(EhFDXD&+0xf7H5J|u@ z`4GiI8p~$u0+G|WX-B%&Zg^Jo*@jZ+Gg*lNk@Y21oN+@SAR>OBiZl4m(yEdA1f^+& zG}TYV8G_RAolTnGhB|{-&s{hI5CI}URC=&0>dbx%la4-=EmCw(tL0y6lA;fYWcEYi zBk_^=QP_`5S4j7V1ph1`b$!XE|jPHp+s z&zHiQmqoFSuoA*G-+0|N-qbT8+zUZ3_P^JbtGd6k8uV|$$aUCx*xO7tdwacPd-rGC sJ6p;1YcKlMxHP5=M^ literal 0 HcmV?d00001 diff --git a/mysql-test/suite/binlog/std_data/binlog_old_version_5_1_23.000001 b/mysql-test/suite/binlog/std_data/binlog_old_version_5_1_23.000001 new file mode 100644 index 0000000000000000000000000000000000000000..0e9a9d1470abb341c9fe78d98e183b8ac6905c12 GIT binary patch literal 150402 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 literal 0 HcmV?d00001 diff --git a/mysql-test/suite/binlog/t/binlog_old_versions.test b/mysql-test/suite/binlog/t/binlog_old_versions.test new file mode 100644 index 00000000000..9fb7343e761 --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_old_versions.test @@ -0,0 +1,147 @@ +# Test that old binlog formats can be read. + +# Some previous versions of MySQL use their own binlog format, +# especially in row-based replication. This test uses saved binlogs +# from those old versions to test that we can replicate from old +# versions to the present version. + +# Replicating from old versions to new versions is necessary in an +# online upgrade scenario, where the . + +# The previous versions we currently test are: +# - version 5.1.17 and earlier trees +# - mysql-5.1-wl2325-xxx trees (AKA alcatel trees) +# - mysql-5.1-telco-6.1 trees (AKA ndb trees) +# For completeness, we also test mysql-5.1-new_rpl, which is supposed +# to be the "correct" version. + +# All binlogs were generated with the same commands (listed at the end +# of this test for reference). The binlogs contain the following +# events: Table_map, Write_rows, Update_rows, Delete_rows Query, Xid, +# User_var, Int_var, Rand, Begin_load, Append_file, Execute_load. + +# Related bugs: BUG#27779, BUG#31581, BUG#31582, BUG#31583, BUG#32407 + + +--disable_warnings +DROP TABLE IF EXISTS t1, t2, t3; + + +--echo ==== Read modern binlog (version 5.1.23) ==== + +# Read binlog. +--exec $MYSQL_BINLOG suite/binlog/std_data/binlog_old_version_5_1_23.000001 | $MYSQL +# Show result. +SELECT * FROM t1 ORDER BY a; +SELECT * FROM t2 ORDER BY a; +SELECT COUNT(*) FROM t3; +# Reset. +DROP TABLE t1, t2, t3; + + +--echo ==== Read binlog from version 5.1.17 ==== + +# Read binlog. +--exec $MYSQL_BINLOG suite/binlog/std_data/binlog_old_version_5_1_17.000001 | $MYSQL +# Show result. +SELECT * FROM t1 ORDER BY a; +SELECT * FROM t2 ORDER BY a; +SELECT COUNT(*) FROM t3; +# Reset. +DROP TABLE t1, t2, t3; + + +--echo ==== Read binlog from alcatel tree (mysql-5.1-wl2325-5.0-drop6) ==== + +# In this version, it was not possible to switch between row-based and +# statement-based binlogging without restarting the server. So, we +# have two binlogs; one for row based and one for statement based +# replication. + +# Read rbr binlog. +--exec $MYSQL_BINLOG suite/binlog/std_data/binlog_old_version_5_1-wl2325_row.000001 | $MYSQL +# Read stm binlog. +--exec $MYSQL_BINLOG suite/binlog/std_data/binlog_old_version_5_1-wl2325_stm.000001 | $MYSQL +# Show result. +SELECT * FROM t1 ORDER BY a; +SELECT * FROM t2 ORDER BY a; +SELECT COUNT(*) FROM t3; +# Reset. +DROP TABLE t1, t2, t3; + + +--echo ==== Read binlog from ndb tree (mysql-5.1-telco-6.1) ==== + +# Read binlog. +--exec $MYSQL_BINLOG suite/binlog/std_data/binlog_old_version_5_1-telco.000001 | $MYSQL +# Show resulting tablea. +SELECT * FROM t1 ORDER BY a; +SELECT * FROM t2 ORDER BY a; +SELECT COUNT(*) FROM t3; +# Reset. +DROP TABLE t1, t2, t3; + + +#### The following commands were used to generate the binlogs #### +# +#source include/master-slave.inc; +# +## ==== initialize ==== +#USE test; +#CREATE TABLE t1 (a int, b char(50)) ENGINE = MyISAM; +#CREATE TABLE t2 (a int, b char(50)) ENGINE = InnoDB; +#CREATE TABLE t3 (a char(20)); +# +# +## ==== row based tests ==== +#SET BINLOG_FORMAT='row'; +# +## ---- get write, update, and delete rows events ---- +#INSERT INTO t1 VALUES (0, 'one'), (1, 'two'); +#UPDATE t1 SET a=a+1; +#DELETE FROM t1 WHERE a=2; +# +# +## ==== statement based tests ==== +#SET BINLOG_FORMAT = 'statement'; +# +## ---- get xid events ---- +#BEGIN; +#INSERT INTO t2 VALUES (3, 'first stm in trx'); +#INSERT INTO t1 VALUES (3, 'last stm in trx: next event should be xid'); +#COMMIT; +# +## ---- get user var events ---- +#SET @x = 4; +#INSERT INTO t1 VALUES (@x, 'four'); +# +## ---- get rand event ---- +#INSERT INTO t1 VALUES (RAND() * 1000000, 'random'); +# +## ---- get intvar event ---- +#INSERT INTO t1 VALUES (LAST_INSERT_ID(), 'last_insert_id'); +# +## ---- get begin, append and execute load events ---- +## double the file until we have more than 2^17 bytes, so that the +## event has to be split and we can use Append_file_log_event. +# +#SET SQL_LOG_BIN=0; +#CREATE TABLE temp (a char(20)); +#LOAD DATA INFILE '../std_data_ln/words.dat' INTO TABLE temp; +#INSERT INTO temp SELECT * FROM temp; +#INSERT INTO temp SELECT * FROM temp; +#INSERT INTO temp SELECT * FROM temp; +#INSERT INTO temp SELECT * FROM temp; +#INSERT INTO temp SELECT * FROM temp; +#INSERT INTO temp SELECT * FROM temp; +#INSERT INTO temp SELECT * FROM temp; +#INSERT INTO temp SELECT * FROM temp; +#SELECT a FROM temp INTO OUTFILE 'big_file.dat'; +#DROP TABLE temp; +#SET SQL_LOG_BIN=1; +# +#LOAD DATA INFILE 'big_file.dat' INTO TABLE t3; +# +#SELECT * FROM t1 ORDER BY a; +#SELECT * FROM t2 ORDER BY a; +#SELECT COUNT(*) FROM t3; diff --git a/sql/log_event.cc b/sql/log_event.cc index 31c14bbd81d..45478020a36 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1071,6 +1071,29 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len, } else { + /* + In some previuos versions (see comment in + Format_description_log_event::Format_description_log_event(char*,...)), + event types were assigned different id numbers than in the + present version. In order to replicate from such versions to the + present version, we must map those event type id's to our event + type id's. The mapping is done with the event_type_permutation + array, which was set up when the Format_description_log_event + was read. + */ + if (description_event->event_type_permutation) + { + IF_DBUG({ + int new_event_type= + description_event->event_type_permutation[event_type]; + DBUG_PRINT("info", + ("converting event type %d to %d (%s)", + event_type, new_event_type, + get_type_str((Log_event_type)new_event_type))); + }); + event_type= description_event->event_type_permutation[event_type]; + } + switch(event_type) { case QUERY_EVENT: ev = new Query_log_event(buf, event_len, description_event, QUERY_EVENT); @@ -2771,7 +2794,7 @@ int Start_log_event_v3::do_apply_event(Relay_log_info const *rli) Format_description_log_event:: Format_description_log_event(uint8 binlog_ver, const char* server_ver) - :Start_log_event_v3() + :Start_log_event_v3(), event_type_permutation(0) { binlog_version= binlog_ver; switch (binlog_ver) { @@ -2896,7 +2919,7 @@ Format_description_log_event(const char* buf, const Format_description_log_event* description_event) - :Start_log_event_v3(buf, description_event) + :Start_log_event_v3(buf, description_event), event_type_permutation(0) { DBUG_ENTER("Format_description_log_event::Format_description_log_event(char*,...)"); buf+= LOG_EVENT_MINIMAL_HEADER_LEN; @@ -2911,6 +2934,65 @@ Format_description_log_event(const char* buf, number_of_event_types* sizeof(*post_header_len), MYF(0)); calc_server_version_split(); + + /* + In some previous versions, the events were given other event type + id numbers than in the present version. When replicating from such + a version, we therefore set up an array that maps those id numbers + to the id numbers of the present server. + + If post_header_len is null, it means malloc failed, and is_valid + will fail, so there is no need to do anything. + + The trees which have wrong event id's are: + mysql-5.1-wl2325-5.0-drop6p13-alpha, mysql-5.1-wl2325-5.0-drop6, + mysql-5.1-wl2325-5.0, mysql-5.1-wl2325-no-dd (`grep -C2 + BEGIN_LOAD_QUERY_EVENT /home/bk/ * /sql/log_event.h`). The + corresponding version (`grep mysql, configure.in` in those trees) + strings are 5.2.2-a_drop6p13-alpha, 5.2.2-a_drop6p13c, + 5.1.5-a_drop5p20, 5.1.2-a_drop5p5. + */ + if (post_header_len && + (strncmp(server_version, "5.1.2-a_drop5", 13) == 0 || + strncmp(server_version, "5.1.5-a_drop5", 13) == 0 || + strncmp(server_version, "5.2.2-a_drop6", 13) == 0)) + { + if (number_of_event_types != 22) + { + DBUG_PRINT("info", (" number_of_event_types=%d", + number_of_event_types)); + /* this makes is_valid() return false. */ + my_free(post_header_len, MYF(MY_ALLOW_ZERO_PTR)); + post_header_len= NULL; + DBUG_VOID_RETURN; + } + static const uint8 perm[23]= + { + UNKNOWN_EVENT, START_EVENT_V3, QUERY_EVENT, STOP_EVENT, ROTATE_EVENT, + INTVAR_EVENT, LOAD_EVENT, SLAVE_EVENT, CREATE_FILE_EVENT, + APPEND_BLOCK_EVENT, EXEC_LOAD_EVENT, DELETE_FILE_EVENT, + NEW_LOAD_EVENT, + RAND_EVENT, USER_VAR_EVENT, + FORMAT_DESCRIPTION_EVENT, + TABLE_MAP_EVENT, + PRE_GA_WRITE_ROWS_EVENT, + PRE_GA_UPDATE_ROWS_EVENT, + PRE_GA_DELETE_ROWS_EVENT, + XID_EVENT, + BEGIN_LOAD_QUERY_EVENT, + EXECUTE_LOAD_QUERY_EVENT, + }; + event_type_permutation= perm; + /* + Since we use (permuted) event id's to index the post_header_len + array, we need to permute the post_header_len array too. + */ + uint8 post_header_len_temp[23]; + for (int i= 1; i < 23; i++) + post_header_len_temp[perm[i] - 1]= post_header_len[i - 1]; + for (int i= 0; i < 22; i++) + post_header_len[i] = post_header_len_temp[i]; + } DBUG_VOID_RETURN; } diff --git a/sql/log_event.h b/sql/log_event.h index 4a75f330203..31c1ab7173a 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -2106,12 +2106,16 @@ public: /* The list of post-headers' lengthes */ uint8 *post_header_len; uchar server_version_split[3]; + const uint8 *event_type_permutation; Format_description_log_event(uint8 binlog_ver, const char* server_ver=0); Format_description_log_event(const char* buf, uint event_len, const Format_description_log_event *description_event); - ~Format_description_log_event() { my_free((uchar*)post_header_len, MYF(0)); } + ~Format_description_log_event() + { + my_free((uchar*)post_header_len, MYF(MY_ALLOW_ZERO_PTR)); + } Log_event_type get_type_code() { return FORMAT_DESCRIPTION_EVENT;} #ifndef MYSQL_CLIENT bool write(IO_CACHE* file);