@@ -357,7 +357,7 @@ where
357357 Minute => ( 2 , false , Parsed :: set_minute) ,
358358 Second => ( 2 , false , Parsed :: set_second) ,
359359 Nanosecond => ( 9 , false , Parsed :: set_nanosecond) ,
360- Timestamp => ( usize:: MAX , false , Parsed :: set_timestamp) ,
360+ Timestamp => ( usize:: MAX , true , Parsed :: set_timestamp) ,
361361
362362 // for the future expansion
363363 Internal ( ref int) => match int. _dummy { } ,
@@ -366,8 +366,7 @@ where
366366 s = s. trim_start ( ) ;
367367 let v = if signed {
368368 if s. starts_with ( '-' ) {
369- let v = try_consume ! ( scan:: number( & s[ 1 ..] , 1 , usize :: MAX ) ) ;
370- 0i64 . checked_sub ( v) . ok_or ( OUT_OF_RANGE ) ?
369+ try_consume ! ( scan:: negative_number( & s[ 1 ..] , 1 , usize :: MAX ) )
371370 } else if s. starts_with ( '+' ) {
372371 try_consume ! ( scan:: number( & s[ 1 ..] , 1 , usize :: MAX ) )
373372 } else {
@@ -765,6 +764,7 @@ mod tests {
765764 check ( " + 42" , & [ Space ( " " ) , num ( Year ) ] , Err ( INVALID ) ) ;
766765 check ( "-" , & [ num ( Year ) ] , Err ( TOO_SHORT ) ) ;
767766 check ( "+" , & [ num ( Year ) ] , Err ( TOO_SHORT ) ) ;
767+ check ( "-9223372036854775808" , & [ num ( Timestamp ) ] , parsed ! ( timestamp: i64 :: MIN ) ) ;
768768
769769 // unsigned numeric
770770 check ( "345" , & [ num ( Ordinal ) ] , parsed ! ( ordinal: 345 ) ) ;
0 commit comments