@@ -397,6 +397,75 @@ func TestParseByteDateTime(t *testing.T) {
397397 }
398398}
399399
400+ func TestParseByteDateTimeFail (t * testing.T ) {
401+ cases := []struct {
402+ name string
403+ str string
404+ wantErr string
405+ }{
406+ {
407+ name : "parse invalid time" ,
408+ str : "hello" ,
409+ wantErr : "invalid time bytes: hello" ,
410+ },
411+ {
412+ name : "parse year" ,
413+ str : "000!-00-00 00:00:00.000000" ,
414+ wantErr : "not [0-9]" ,
415+ },
416+ {
417+ name : "parse month" ,
418+ str : "0000-!0-00 00:00:00.000000" ,
419+ wantErr : "not [0-9]" ,
420+ },
421+ {
422+ name : `parse "-" after parsed year` ,
423+ str : "0000:00-00 00:00:00.000000" ,
424+ wantErr : "bad value for field: `:`" ,
425+ },
426+ {
427+ name : `parse "-" after parsed month` ,
428+ str : "0000-00:00 00:00:00.000000" ,
429+ wantErr : "bad value for field: `:`" ,
430+ },
431+ {
432+ name : `parse " " after parsed date` ,
433+ str : "0000-00-00+00:00:00.000000" ,
434+ wantErr : "bad value for field: `+`" ,
435+ },
436+ {
437+ name : `parse ":" after parsed date` ,
438+ str : "0000-00-00 00-00:00.000000" ,
439+ wantErr : "bad value for field: `-`" ,
440+ },
441+ {
442+ name : `parse ":" after parsed hour` ,
443+ str : "0000-00-00 00:00-00.000000" ,
444+ wantErr : "bad value for field: `-`" ,
445+ },
446+ {
447+ name : `parse "." after parsed sec` ,
448+ str : "0000-00-00 00:00:00?000000" ,
449+ wantErr : "bad value for field: `?`" ,
450+ },
451+ }
452+
453+ for _ , cc := range cases {
454+ t .Run (cc .name , func (t * testing.T ) {
455+ got , err := parseByteDateTime ([]byte (cc .str ), time .UTC )
456+ if err == nil {
457+ t .Fatal ("want error" )
458+ }
459+ if cc .wantErr != err .Error () {
460+ t .Fatalf ("want `%s`, but got `%s`" , cc .wantErr , err )
461+ }
462+ if ! got .IsZero () {
463+ t .Fatal ("want zero time" )
464+ }
465+ })
466+ }
467+ }
468+
400469func BenchmarkParseDateTime (b * testing.B ) {
401470 str := "2020-05-13 21:30:45"
402471 loc := time .FixedZone ("test" , 8 * 60 * 60 )
0 commit comments