@@ -20,7 +20,6 @@ use super::dialect::keywords;
20
20
use super :: dialect:: Dialect ;
21
21
use super :: sqlast:: * ;
22
22
use super :: sqltokenizer:: * ;
23
- use chrono:: { offset:: FixedOffset , DateTime , NaiveDate , NaiveDateTime , NaiveTime } ;
24
23
25
24
#[ derive( Debug , Clone , PartialEq ) ]
26
25
pub enum ParserError {
@@ -922,37 +921,29 @@ impl Parser {
922
921
/// Parse a literal value (numbers, strings, date/time, booleans)
923
922
fn parse_value ( & mut self ) -> Result < Value , ParserError > {
924
923
match self . next_token ( ) {
925
- Some ( t) => {
926
- match t {
927
- Token :: SQLWord ( k) => match k. keyword . as_ref ( ) {
928
- "TRUE" => Ok ( Value :: Boolean ( true ) ) ,
929
- "FALSE" => Ok ( Value :: Boolean ( false ) ) ,
930
- "NULL" => Ok ( Value :: Null ) ,
931
- _ => {
932
- return parser_err ! ( format!(
933
- "No value parser for keyword {}" ,
934
- k. keyword
935
- ) ) ;
936
- }
937
- } ,
938
- //TODO: parse the timestamp here (see parse_timestamp_value())
939
- Token :: Number ( ref n) if n. contains ( '.' ) => match n. parse :: < f64 > ( ) {
940
- Ok ( n) => Ok ( Value :: Double ( n) ) ,
941
- Err ( e) => parser_err ! ( format!( "Could not parse '{}' as f64: {}" , n, e) ) ,
942
- } ,
943
- Token :: Number ( ref n) => match n. parse :: < i64 > ( ) {
944
- Ok ( n) => Ok ( Value :: Long ( n) ) ,
945
- Err ( e) => parser_err ! ( format!( "Could not parse '{}' as i64: {}" , n, e) ) ,
946
- } ,
947
- Token :: SingleQuotedString ( ref s) => {
948
- Ok ( Value :: SingleQuotedString ( s. to_string ( ) ) )
949
- }
950
- Token :: NationalStringLiteral ( ref s) => {
951
- Ok ( Value :: NationalStringLiteral ( s. to_string ( ) ) )
924
+ Some ( t) => match t {
925
+ Token :: SQLWord ( k) => match k. keyword . as_ref ( ) {
926
+ "TRUE" => Ok ( Value :: Boolean ( true ) ) ,
927
+ "FALSE" => Ok ( Value :: Boolean ( false ) ) ,
928
+ "NULL" => Ok ( Value :: Null ) ,
929
+ _ => {
930
+ return parser_err ! ( format!( "No value parser for keyword {}" , k. keyword) ) ;
952
931
}
953
- _ => parser_err ! ( format!( "Unsupported value: {:?}" , t) ) ,
932
+ } ,
933
+ Token :: Number ( ref n) if n. contains ( '.' ) => match n. parse :: < f64 > ( ) {
934
+ Ok ( n) => Ok ( Value :: Double ( n) ) ,
935
+ Err ( e) => parser_err ! ( format!( "Could not parse '{}' as f64: {}" , n, e) ) ,
936
+ } ,
937
+ Token :: Number ( ref n) => match n. parse :: < i64 > ( ) {
938
+ Ok ( n) => Ok ( Value :: Long ( n) ) ,
939
+ Err ( e) => parser_err ! ( format!( "Could not parse '{}' as i64: {}" , n, e) ) ,
940
+ } ,
941
+ Token :: SingleQuotedString ( ref s) => Ok ( Value :: SingleQuotedString ( s. to_string ( ) ) ) ,
942
+ Token :: NationalStringLiteral ( ref s) => {
943
+ Ok ( Value :: NationalStringLiteral ( s. to_string ( ) ) )
954
944
}
955
- }
945
+ _ => parser_err ! ( format!( "Unsupported value: {:?}" , t) ) ,
946
+ } ,
956
947
None => parser_err ! ( "Expecting a value, but found EOF" ) ,
957
948
}
958
949
}
@@ -985,86 +976,6 @@ impl Parser {
985
976
}
986
977
}
987
978
988
- pub fn parse_timezone_offset ( & mut self ) -> Result < i8 , ParserError > {
989
- match self . next_token ( ) {
990
- Some ( Token :: Plus ) => {
991
- let n = self . parse_literal_int ( ) ?;
992
- Ok ( n as i8 )
993
- }
994
- Some ( Token :: Minus ) => {
995
- let n = self . parse_literal_int ( ) ?;
996
- Ok ( -n as i8 )
997
- }
998
- other => parser_err ! ( format!(
999
- "Expecting `+` or `-` in timezone, but found {:?}" ,
1000
- other
1001
- ) ) ,
1002
- }
1003
- }
1004
-
1005
- pub fn parse_timestamp_value ( & mut self ) -> Result < Value , ParserError > {
1006
- let year = self . parse_literal_int ( ) ?;
1007
- let date = self . parse_date ( year) ?;
1008
- if let Ok ( time) = self . parse_time ( ) {
1009
- let date_time = NaiveDateTime :: new ( date, time) ;
1010
- match self . peek_token ( ) {
1011
- Some ( token) => match token {
1012
- Token :: Plus | Token :: Minus => {
1013
- let tz = self . parse_timezone_offset ( ) ?;
1014
- let offset = FixedOffset :: east ( i32:: from ( tz) * 3600 ) ;
1015
- Ok ( Value :: Timestamp ( DateTime :: from_utc ( date_time, offset) ) )
1016
- }
1017
- _ => Ok ( Value :: DateTime ( date_time) ) ,
1018
- } ,
1019
- _ => Ok ( Value :: DateTime ( date_time) ) ,
1020
- }
1021
- } else {
1022
- parser_err ! ( format!(
1023
- "Expecting time after date, but found {:?}" ,
1024
- self . peek_token( )
1025
- ) )
1026
- }
1027
- }
1028
-
1029
- pub fn parse_date ( & mut self , year : i64 ) -> Result < NaiveDate , ParserError > {
1030
- if self . consume_token ( & Token :: Minus ) {
1031
- let month = self . parse_literal_int ( ) ?;
1032
- if self . consume_token ( & Token :: Minus ) {
1033
- let day = self . parse_literal_int ( ) ?;
1034
- let date = NaiveDate :: from_ymd ( year as i32 , month as u32 , day as u32 ) ;
1035
- Ok ( date)
1036
- } else {
1037
- parser_err ! ( format!(
1038
- "Expecting `-` for date separator, found {:?}" ,
1039
- self . peek_token( )
1040
- ) )
1041
- }
1042
- } else {
1043
- parser_err ! ( format!(
1044
- "Expecting `-` for date separator, found {:?}" ,
1045
- self . peek_token( )
1046
- ) )
1047
- }
1048
- }
1049
-
1050
- pub fn parse_time ( & mut self ) -> Result < NaiveTime , ParserError > {
1051
- let hour = self . parse_literal_int ( ) ?;
1052
- self . expect_token ( & Token :: Colon ) ?;
1053
- let min = self . parse_literal_int ( ) ?;
1054
- self . expect_token ( & Token :: Colon ) ?;
1055
- // On one hand, the SQL specs defines <seconds fraction> ::= <unsigned integer>,
1056
- // so it would be more correct to parse it as such
1057
- let sec = self . parse_literal_double ( ) ?;
1058
- // On the other, chrono only supports nanoseconds, which should(?) fit in seconds-as-f64...
1059
- let nanos = ( sec. fract ( ) * 1_000_000_000.0 ) . round ( ) ;
1060
- Ok ( NaiveTime :: from_hms_nano (
1061
- hour as u32 ,
1062
- min as u32 ,
1063
- sec as u32 ,
1064
- nanos as u32 ,
1065
- ) )
1066
- }
1067
-
1068
979
/// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
1069
980
pub fn parse_data_type ( & mut self ) -> Result < SQLType , ParserError > {
1070
981
match self . next_token ( ) {
0 commit comments