@@ -503,55 +503,63 @@ func parseBinaryDateTime(num uint64, data []byte, loc *time.Location) (driver.Va
503
503
return nil , fmt .Errorf ("Invalid DATETIME-packet length %d" , num )
504
504
}
505
505
506
- func formatBinaryDate (num uint64 , data []byte ) (driver.Value , error ) {
507
- switch num {
508
- case 0 :
509
- return []byte ("0000-00-00" ), nil
506
+ func formatBinaryDateTime (src []byte , withTime bool ) (driver.Value , error ) {
507
+ const zeroDateTimeMicros = "0000-00-00 00:00:00.000000"
508
+ srclen := len (src )
509
+ var dst []byte
510
+ if withTime {
511
+ if srclen == 11 {
512
+ dst = []byte (zeroDateTimeMicros )
513
+ } else {
514
+ dst = []byte (zeroDateTimeMicros [:19 ])
515
+ }
516
+ } else {
517
+ dst = []byte (zeroDateTimeMicros [:10 ])
518
+ }
519
+ switch srclen {
520
+ case 11 :
521
+ microsecs := binary .LittleEndian .Uint32 (src [7 :11 ])
522
+ dst [20 ] += byte ((microsecs / 100000 ) % 10 )
523
+ dst [21 ] += byte ((microsecs / 10000 ) % 10 )
524
+ dst [22 ] += byte ((microsecs / 1000 ) % 10 )
525
+ dst [23 ] += byte ((microsecs / 100 ) % 10 )
526
+ dst [24 ] += byte ((microsecs / 10 ) % 10 )
527
+ dst [25 ] += byte (microsecs % 10 )
528
+ fallthrough
529
+ case 7 :
530
+ hour := src [4 ]
531
+ minute := src [5 ]
532
+ second := src [6 ]
533
+ dst [11 ] += (hour / 10 ) % 10
534
+ dst [12 ] += hour % 10
535
+ dst [14 ] += (minute / 10 ) % 10
536
+ dst [15 ] += minute % 10
537
+ dst [17 ] += (second / 10 ) % 10
538
+ dst [18 ] += second % 10
539
+ fallthrough
510
540
case 4 :
511
- return [] byte ( fmt . Sprintf (
512
- "%04d-%02d-%02d" ,
513
- binary . LittleEndian . Uint16 ( data [: 2 ]),
514
- data [ 2 ],
515
- data [ 3 ],
516
- )), nil
517
- }
518
- return nil , fmt . Errorf ( "Invalid DATE-packet length %d" , num )
519
- }
520
-
521
- func formatBinaryDateTime ( num uint64 , data [] byte ) (driver. Value , error ) {
522
- switch num {
541
+ year := binary . LittleEndian . Uint16 ( src [: 2 ])
542
+ month := src [ 2 ]
543
+ day := src [ 3 ]
544
+ dst [ 0 ] += byte (( year / 1000 ) % 10 )
545
+ dst [ 1 ] += byte (( year / 100 ) % 10 )
546
+ dst [ 2 ] += byte (( year / 10 ) % 10 )
547
+ dst [ 3 ] += byte ( year % 10 )
548
+ dst [ 5 ] += ( month / 10 ) % 10
549
+ dst [ 6 ] += month % 10
550
+ dst [ 8 ] += ( day / 10 ) % 10
551
+ dst [ 9 ] += day % 10
552
+ return dst , nil
523
553
case 0 :
524
- return []byte ("0000-00-00 00:00:00" ), nil
525
- case 4 :
526
- return []byte (fmt .Sprintf (
527
- "%04d-%02d-%02d 00:00:00" ,
528
- binary .LittleEndian .Uint16 (data [:2 ]),
529
- data [2 ],
530
- data [3 ],
531
- )), nil
532
- case 7 :
533
- return []byte (fmt .Sprintf (
534
- "%04d-%02d-%02d %02d:%02d:%02d" ,
535
- binary .LittleEndian .Uint16 (data [:2 ]),
536
- data [2 ],
537
- data [3 ],
538
- data [4 ],
539
- data [5 ],
540
- data [6 ],
541
- )), nil
542
- case 11 :
543
- return []byte (fmt .Sprintf (
544
- "%04d-%02d-%02d %02d:%02d:%02d.%06d" ,
545
- binary .LittleEndian .Uint16 (data [:2 ]),
546
- data [2 ],
547
- data [3 ],
548
- data [4 ],
549
- data [5 ],
550
- data [6 ],
551
- binary .LittleEndian .Uint32 (data [7 :11 ]),
552
- )), nil
554
+ return dst , nil
553
555
}
554
- return nil , fmt .Errorf ("Invalid DATETIME-packet length %d" , num )
556
+ var mode string
557
+ if withTime {
558
+ mode = "DATETIME"
559
+ } else {
560
+ mode = "DATE"
561
+ }
562
+ return nil , fmt .Errorf ("invalid %s-packet length %d" , mode , srclen )
555
563
}
556
564
557
565
/******************************************************************************
0 commit comments