@@ -503,55 +503,63 @@ func parseBinaryDateTime(num uint64, data []byte, loc *time.Location) (driver.Va
503503 return nil , fmt .Errorf ("Invalid DATETIME-packet length %d" , num )
504504}
505505
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
510540 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
523553 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
553555 }
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 )
555563}
556564
557565/******************************************************************************
0 commit comments