@@ -284,7 +284,11 @@ protected Serializable deserializeCell(ColumnType type, int meta, int length, Bi
284
284
case TIME :
285
285
return deserializeTime (eventDataReader );
286
286
case TIME_V2 :
287
- return deserializeTimeV2 (meta , eventDataReader );
287
+ if (deserializeWithNewTimeV2 ) {
288
+ return deserializeTimeV2New (meta , eventDataReader );
289
+ } else {
290
+ return deserializeTimeV2 (meta , eventDataReader );
291
+ }
288
292
case TIMESTAMP :
289
293
return deserializeTimestamp (eventDataReader );
290
294
case TIMESTAMP_V2 :
@@ -587,6 +591,64 @@ protected Serializable deserializeTimeV2New(int meta, ByteArrayInputStream input
587
591
return result ;
588
592
}
589
593
594
+ protected Serializable deserializeTimeV2New (int meta , BinaryLogEventDataReader eventDataReader ) throws IOException {
595
+ long result ;
596
+ long intPart ;
597
+ long fracPart ;
598
+
599
+ switch (meta ) {
600
+ case 1 : case 2 :
601
+ intPart = eventDataReader .readLongBE (3 ) - TIMEF_INT_OFS ;
602
+ fracPart = eventDataReader .readUnsignedByte ();
603
+
604
+
605
+ if (intPart < 0 && fracPart != 0 ) {
606
+ /*
607
+ Negative values are stored with reverse fractional part order,
608
+ for binary sort compatibility.
609
+
610
+ Disk value intpart fracPart Time value Memory value
611
+ 800000.00 0 0 00:00:00.00 0000000000.000000
612
+ 7FFFFF.FF -1 255 -00:00:00.01 FFFFFFFFFF.FFD8F0
613
+ 7FFFFF.9D -1 99 -00:00:00.99 FFFFFFFFFF.F0E4D0
614
+ 7FFFFF.00 -1 0 -00:00:01.00 FFFFFFFFFF.000000
615
+ 7FFFFE.FF -1 255 -00:00:01.01 FFFFFFFFFE.FFD8F0
616
+ 7FFFFE.F6 -2 246 -00:00:01.10 FFFFFFFFFE.FE7960
617
+
618
+ Formula to convert fractional part from disk format
619
+ (now stored in "fracPart" variable) to absolute value: "0x100 - fracPart".
620
+ To reconstruct in-memory value, we shift
621
+ to the next integer value and then substruct fractional part.
622
+ */
623
+ intPart ++; /* Shift to the next integer value */
624
+ fracPart -= 0x100 ; /* -(0x100 - fracPart) */
625
+ }
626
+ result = (intPart << 24 ) + (fracPart * 10000 );
627
+ break ;
628
+ case 3 : case 4 :
629
+ intPart = eventDataReader .readLongBE (3 ) - TIMEF_INT_OFS ;
630
+ fracPart = eventDataReader .readLongBE (2 );
631
+ if (intPart < 0 && fracPart != 0 ) {
632
+ /*
633
+ Fix reverse fractional part order: "0x10000 - fracPart".
634
+ See comments for FSP=1 and FSP=2 above.
635
+ */
636
+ intPart ++; /* Shift to the next integer value */
637
+ fracPart -= 0x10000 ; /* -(0x10000-fracPart) */
638
+ }
639
+ result = (intPart << 24 ) + (fracPart * 100 );
640
+ break ;
641
+ case 5 : case 6 :
642
+ result = eventDataReader .readLongBE (6 ) - TIMEF_OFS ;
643
+ break ;
644
+ default :
645
+ intPart = eventDataReader .readLongBE (3 ) - TIMEF_INT_OFS ;
646
+ result = intPart << 24 ;
647
+ }
648
+
649
+ return result ;
650
+ }
651
+
590
652
protected Serializable deserializeTimestamp (ByteArrayInputStream inputStream ) throws IOException {
591
653
long timestamp = inputStream .readLong (4 ) * 1000 ;
592
654
if (deserializeDateAndTimeAsLong ) {
0 commit comments