1212
1313//! SQL Parser
1414
15- use bigdecimal:: BigDecimal ;
1615use log:: debug;
1716
1817use super :: ast:: * ;
@@ -1422,13 +1421,12 @@ impl Parser {
14221421 return parser_err ! ( format!( "No value parser for keyword {}" , k. keyword) ) ;
14231422 }
14241423 } ,
1425- Token :: Number ( ref n) if n. contains ( '.' ) => match n. parse :: < BigDecimal > ( ) {
1426- Ok ( n) => Ok ( Value :: Decimal ( n) ) ,
1427- Err ( e) => parser_err ! ( format!( "Could not parse '{}' as decimal: {}" , n, e) ) ,
1428- } ,
1429- Token :: Number ( ref n) => match n. parse :: < u64 > ( ) {
1430- Ok ( n) => Ok ( Value :: Long ( n) ) ,
1431- Err ( e) => parser_err ! ( format!( "Could not parse '{}' as u64: {}" , n, e) ) ,
1424+ // The call to n.parse() returns a bigdecimal when the
1425+ // bigdecimal feature is enabled, and is otherwise a no-op
1426+ // (i.e., it returns the input string).
1427+ Token :: Number ( ref n) => match n. parse ( ) {
1428+ Ok ( n) => Ok ( Value :: Number ( n) ) ,
1429+ Err ( e) => parser_err ! ( format!( "Could not parse '{}' as number: {}" , n, e) ) ,
14321430 } ,
14331431 Token :: SingleQuotedString ( ref s) => Ok ( Value :: SingleQuotedString ( s. to_string ( ) ) ) ,
14341432 Token :: NationalStringLiteral ( ref s) => {
@@ -1441,6 +1439,16 @@ impl Parser {
14411439 }
14421440 }
14431441
1442+ pub fn parse_number_value ( & mut self ) -> Result < Value , ParserError > {
1443+ match self . parse_value ( ) ? {
1444+ v @ Value :: Number ( _) => Ok ( v) ,
1445+ _ => {
1446+ self . prev_token ( ) ;
1447+ self . expected ( "literal number" , self . peek_token ( ) )
1448+ }
1449+ }
1450+ }
1451+
14441452 /// Parse an unsigned literal integer/long
14451453 pub fn parse_literal_uint ( & mut self ) -> Result < u64 , ParserError > {
14461454 match self . next_token ( ) {
@@ -1847,7 +1855,7 @@ impl Parser {
18471855 modes : self . parse_transaction_modes ( ) ?,
18481856 } )
18491857 } else {
1850- self . expected ( "variable name " , self . peek_token ( ) )
1858+ self . expected ( "equals sign or TO " , self . peek_token ( ) )
18511859 }
18521860 }
18531861
@@ -2187,16 +2195,13 @@ impl Parser {
21872195 if self . parse_keyword ( "ALL" ) {
21882196 Ok ( None )
21892197 } else {
2190- self . parse_literal_uint ( )
2191- . map ( |n| Some ( Expr :: Value ( Value :: Long ( n) ) ) )
2198+ Ok ( Some ( Expr :: Value ( self . parse_number_value ( ) ?) ) )
21922199 }
21932200 }
21942201
21952202 /// Parse an OFFSET clause
21962203 pub fn parse_offset ( & mut self ) -> Result < Expr , ParserError > {
2197- let value = self
2198- . parse_literal_uint ( )
2199- . map ( |n| Expr :: Value ( Value :: Long ( n) ) ) ?;
2204+ let value = Expr :: Value ( self . parse_number_value ( ) ?) ;
22002205 self . expect_one_of_keywords ( & [ "ROW" , "ROWS" ] ) ?;
22012206 Ok ( value)
22022207 }
0 commit comments