@@ -682,30 +682,13 @@ impl Parser {
682
682
"NULL" => Ok ( Value :: Null ) ,
683
683
_ => return parser_err ! ( format!( "No value parser for keyword {}" , k) ) ,
684
684
} ,
685
- //TODO: parse the timestamp here
685
+ //TODO: parse the timestamp here (see parse_timestamp_value())
686
686
Token :: Number ( ref n) if n. contains ( "." ) => match n. parse :: < f64 > ( ) {
687
687
Ok ( n) => Ok ( Value :: Double ( n) ) ,
688
- Err ( e) => {
689
- let index = self . index ;
690
- self . prev_token ( ) ;
691
- if let Ok ( timestamp) = self . parse_timestamp_value ( ) {
692
- println ! ( "timstamp: {:?}" , timestamp) ;
693
- Ok ( timestamp)
694
- } else {
695
- self . index = index;
696
- parser_err ! ( format!( "Could not parse '{}' as i64: {}" , n, e) )
697
- }
698
- }
688
+ Err ( e) => parser_err ! ( format!( "Could not parse '{}' as i64: {}" , n, e) ) ,
699
689
} ,
700
690
Token :: Number ( ref n) => match n. parse :: < i64 > ( ) {
701
- Ok ( n) => {
702
- // if let Some(Token::Minus) = self.peek_token() {
703
- // self.prev_token();
704
- // self.parse_timestamp_value()
705
- // } else {
706
- Ok ( Value :: Long ( n) )
707
- // }
708
- }
691
+ Ok ( n) => Ok ( Value :: Long ( n) ) ,
709
692
Err ( e) => parser_err ! ( format!( "Could not parse '{}' as i64: {}" , n, e) ) ,
710
693
} ,
711
694
Token :: Identifier ( id) => Ok ( Value :: String ( id. to_string ( ) ) ) ,
@@ -733,13 +716,13 @@ impl Parser {
733
716
}
734
717
}
735
718
736
- /// Parse a literal integer/long
719
+ /// Parse a literal double
737
720
pub fn parse_literal_double ( & mut self ) -> Result < f64 , ParserError > {
738
721
match self . next_token ( ) {
739
722
Some ( Token :: Number ( s) ) => s. parse :: < f64 > ( ) . map_err ( |e| {
740
- ParserError :: ParserError ( format ! ( "Could not parse '{}' as i64 : {}" , s, e) )
723
+ ParserError :: ParserError ( format ! ( "Could not parse '{}' as f64 : {}" , s, e) )
741
724
} ) ,
742
- other => parser_err ! ( format!( "Expected literal int , found {:?}" , other) ) ,
725
+ other => parser_err ! ( format!( "Expected literal number , found {:?}" , other) ) ,
743
726
}
744
727
}
745
728
@@ -820,19 +803,17 @@ impl Parser {
820
803
self . consume_token ( & Token :: Colon ) ?;
821
804
let min = self . parse_literal_int ( ) ?;
822
805
self . consume_token ( & Token :: Colon ) ?;
806
+ // On one hand, the SQL specs defines <seconds fraction> ::= <unsigned integer>,
807
+ // so it would be more correct to parse it as such
823
808
let sec = self . parse_literal_double ( ) ?;
824
- let _ = ( sec. fract ( ) * 1000.0 ) . round ( ) ;
825
- if let Ok ( true ) = self . consume_token ( & Token :: Period ) {
826
- let ms = self . parse_literal_int ( ) ?;
827
- Ok ( NaiveTime :: from_hms_milli (
828
- hour as u32 ,
829
- min as u32 ,
830
- sec as u32 ,
831
- ms as u32 ,
832
- ) )
833
- } else {
834
- Ok ( NaiveTime :: from_hms ( hour as u32 , min as u32 , sec as u32 ) )
835
- }
809
+ // On the other, chrono only supports nanoseconds, which should(?) fit in seconds-as-f64...
810
+ let nanos = ( sec. fract ( ) * 1_000_000_000.0 ) . round ( ) ;
811
+ Ok ( NaiveTime :: from_hms_nano (
812
+ hour as u32 ,
813
+ min as u32 ,
814
+ sec as u32 ,
815
+ nanos as u32 ,
816
+ ) )
836
817
}
837
818
838
819
/// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
0 commit comments