@@ -1056,6 +1056,126 @@ func TestTableMapOptMetaVisibility(t *testing.T) {
1056
1056
}
1057
1057
}
1058
1058
1059
+ func TestRowsDataExtraData (t * testing.T ) {
1060
+ // Only after mysql 8.0.16 version can be parsed from extradata to 'partition info' and 'ndb info'
1061
+ testcases := []struct {
1062
+ data []byte
1063
+ tableData []byte
1064
+ eventType EventType
1065
+ expectPartitionId uint16
1066
+ expectSourcePartitionId uint16
1067
+ expectNdbFormat byte
1068
+ expectNdbData []byte
1069
+ }{
1070
+ /*
1071
+ mysql-cluster 8.0.32
1072
+
1073
+ +-------+------+------+-----+---------+-------+
1074
+ | Field | Type | Null | Key | Default | Extra |
1075
+ +-------+------+------+-----+---------+-------+
1076
+ | p | int | NO | PRI | NULL | |
1077
+ | c | int | YES | UNI | NULL | |
1078
+ +-------+------+------+-----+---------+-------+
1079
+
1080
+ CREATE TABLE t (
1081
+ p INT PRIMARY KEY,
1082
+ c INT,
1083
+ UNIQUE KEY u (c)
1084
+ ) ENGINE NDB;
1085
+
1086
+ INSERT INTO t VALUES (1,1), (2,2), (3,3), (4,4), (5,5);
1087
+ */
1088
+ {
1089
+ data : []byte ("s\x00 \x00 \x00 \x00 \x00 \x01 \x00 \x0f \x00 \x00 \f \x00 \x01 \x00 \x00 \x04 \x80 \x00 \x04 \x00 \x00 \x00 \x02 \xff \x00 \x01 \x00 \x00 \x00 \x01 \x00 \x00 \x00 \x00 \x02 \x00 \x00 \x00 \x02 \x00 \x00 \x00 \x00 \x04 \x00 \x00 \x00 \x04 \x00 \x00 \x00 \x00 \x03 \x00 \x00 \x00 \x03 \x00 \x00 \x00 \x00 \x05 \x00 \x00 \x00 \x05 \x00 \x00 \x00 " ),
1090
+ tableData : []byte ("s\x00 \x00 \x00 \x00 \x00 \x01 \x00 \a bdteste\x00 \x01 t\x00 \x02 \x03 \x03 \x00 \x02 \x01 \x01 \x00 " ),
1091
+ eventType : WRITE_ROWS_EVENTv2 ,
1092
+ expectPartitionId : 0x0 ,
1093
+ expectSourcePartitionId : 0x0 ,
1094
+ expectNdbFormat : 0x0 ,
1095
+ expectNdbData : []byte ("\x01 \x00 \x00 \x04 \x80 \x00 \x04 \x00 \x00 \x00 " ),
1096
+ },
1097
+ /*
1098
+ mysql 8.0.16
1099
+
1100
+ +-------+------+------+-----+---------+-------+
1101
+ | Field | Type | Null | Key | Default | Extra |
1102
+ +-------+------+------+-----+---------+-------+
1103
+ | id | int | YES | | NULL | |
1104
+ +-------+------+------+-----+---------+-------+
1105
+
1106
+ CREATE TABLE test (id INTEGER)
1107
+ PARTITION BY RANGE (id) (
1108
+ PARTITION p0 VALUES LESS THAN (1),
1109
+ PARTITION p1 VALUES LESS THAN (2),
1110
+ PARTITION p2 VALUES LESS THAN (3),
1111
+ PARTITION p3 VALUES LESS THAN (4),
1112
+ PARTITION p4 VALUES LESS THAN (5)
1113
+ );
1114
+
1115
+ INSERT INTO test (id) VALUES(3);
1116
+ UPDATE test set id = 1 WHERE id = 3;
1117
+ */
1118
+ {
1119
+ data : []byte ("p\x03 \x00 \x00 \x00 \x00 \x01 \x00 \x05 \x00 \x01 \x03 \x00 \x01 \xff \x00 \x03 \x00 \x00 \x00 " ),
1120
+ tableData : []byte ("p\x03 \x00 \x00 \x00 \x00 \x01 \x00 \x04 test\x00 \x04 test\x00 \x01 \x03 \x00 \x01 \x01 \x01 \x00 " ),
1121
+ eventType : WRITE_ROWS_EVENTv2 ,
1122
+ expectPartitionId : 0x3 ,
1123
+ expectSourcePartitionId : 0x0 ,
1124
+ expectNdbFormat : 0x0 ,
1125
+ expectNdbData : []byte (nil ),
1126
+ },
1127
+ {
1128
+ data : []byte ("p\x03 \x00 \x00 \x00 \x00 \x01 \x00 \a \x00 \x01 \x01 \x00 \x03 \x00 \x01 \xff \xff \x00 \x03 \x00 \x00 \x00 \x00 \x01 \x00 \x00 \x00 " ),
1129
+ tableData : []byte ("p\x03 \x00 \x00 \x00 \x00 \x01 \x00 \x04 test\x00 \x04 test\x00 \x01 \x03 \x00 \x01 \x01 \x01 \x00 " ),
1130
+ eventType : UPDATE_ROWS_EVENTv2 ,
1131
+ expectPartitionId : 0x1 ,
1132
+ expectSourcePartitionId : 0x3 ,
1133
+ expectNdbFormat : 0x0 ,
1134
+ expectNdbData : []byte (nil ),
1135
+ },
1136
+ // mysql 5.7 and mariadb 14(15) does not surpot extra data
1137
+ {
1138
+ data : []byte ("m\x00 \x00 \x00 \x00 \x00 \x01 \x00 \x02 \x00 \x01 \xff \xfe \x03 \x00 \x00 \x00 " ),
1139
+ tableData : []byte ("m\x00 \x00 \x00 \x00 \x00 \x01 \x00 \x04 test\x00 \x04 test\x00 \x01 \x03 \x00 \x01 " ),
1140
+ eventType : WRITE_ROWS_EVENTv2 ,
1141
+ expectPartitionId : 0x0 ,
1142
+ expectSourcePartitionId : 0x0 ,
1143
+ expectNdbFormat : 0x0 ,
1144
+ expectNdbData : []byte (nil ),
1145
+ },
1146
+ {
1147
+ data : []byte ("m\x00 \x00 \x00 \x00 \x00 \x01 \x00 \x02 \x00 \x01 \xff \xff \xfe \x03 \x00 \x00 \x00 \xfe \x01 \x00 \x00 \x00 " ),
1148
+ tableData : []byte ("m\x00 \x00 \x00 \x00 \x00 \x01 \x00 \x04 test\x00 \x04 test\x00 \x01 \x03 \x00 \x01 " ),
1149
+ eventType : UPDATE_ROWS_EVENTv2 ,
1150
+ expectPartitionId : 0x0 ,
1151
+ expectSourcePartitionId : 0x0 ,
1152
+ expectNdbFormat : 0x0 ,
1153
+ expectNdbData : []byte (nil ),
1154
+ },
1155
+ }
1156
+
1157
+ for _ , tc := range testcases {
1158
+ tableMapEvent := new (TableMapEvent )
1159
+ tableMapEvent .tableIDSize = 6
1160
+ err := tableMapEvent .Decode (tc .tableData )
1161
+ require .NoError (t , err )
1162
+
1163
+ rowsEvent := new (RowsEvent )
1164
+ rowsEvent .tableIDSize = 6
1165
+ rowsEvent .tables = make (map [uint64 ]* TableMapEvent )
1166
+ rowsEvent .tables [tableMapEvent .TableID ] = tableMapEvent
1167
+ rowsEvent .Version = 2
1168
+ rowsEvent .eventType = tc .eventType
1169
+
1170
+ err = rowsEvent .Decode (tc .data )
1171
+ require .NoError (t , err )
1172
+ require .Equal (t , tc .expectPartitionId , rowsEvent .PartitionId )
1173
+ require .Equal (t , tc .expectSourcePartitionId , rowsEvent .SourcePartitionId )
1174
+ require .Equal (t , tc .expectNdbFormat , rowsEvent .NdbFormat )
1175
+ require .Equal (t , tc .expectNdbData , rowsEvent .NdbData )
1176
+ }
1177
+ }
1178
+
1059
1179
func TestTableMapHelperMaps (t * testing.T ) {
1060
1180
/*
1061
1181
CREATE TABLE `_types` (
0 commit comments