Skip to content

Commit 124452f

Browse files
committed
Made AbstractRowsEventDataDeserializer more consistent with the way MySQL does the same internally (#44)
1 parent 9e82860 commit 124452f

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/AbstractRowsEventDataDeserializer.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,20 +77,23 @@ protected Serializable[] deserializeRow(long tableId, BitSet includedColumns, By
7777
}
7878
int index = i - numberOfSkippedColumns;
7979
if (!nullColumns.get(index)) {
80+
// mysql-5.6.24 sql/log_event.cc log_event_print_value (line 1980)
8081
int typeCode = types[i] & 0xFF, meta = metadata[i], length = 0;
81-
if (typeCode == ColumnType.STRING.getCode() && meta > 256) {
82-
int meta0 = meta >> 8, meta1 = meta & 0xFF;
83-
if ((meta0 & 0x30) != 0x30) { // long CHAR field
84-
typeCode = meta0 | 0x30;
85-
length = meta1 | (((meta0 & 0x30) ^ 0x30) << 4);
86-
} else {
87-
if (meta0 == ColumnType.SET.getCode() || meta0 == ColumnType.ENUM.getCode() ||
88-
meta0 == ColumnType.STRING.getCode()) {
89-
typeCode = meta0;
90-
length = meta1;
82+
if (typeCode == ColumnType.STRING.getCode()) {
83+
if (meta >= 256) {
84+
int meta0 = meta >> 8, meta1 = meta & 0xFF;
85+
if ((meta0 & 0x30) != 0x30) {
86+
typeCode = meta0 | 0x30;
87+
length = meta1 | (((meta0 & 0x30) ^ 0x30) << 4);
9188
} else {
92-
throw new IOException("Unexpected meta " + meta + " for column of type " + typeCode);
89+
// mysql-5.6.24 sql/rpl_utility.h enum_field_types (line 278)
90+
if (meta0 == ColumnType.ENUM.getCode() || meta0 == ColumnType.SET.getCode()) {
91+
typeCode = meta0;
92+
}
93+
length = meta1;
9394
}
95+
} else {
96+
length = meta;
9497
}
9598
}
9699
result[index] = deserializeCell(ColumnType.byCode(typeCode), meta, length, inputStream);

0 commit comments

Comments
 (0)