@@ -351,14 +351,8 @@ impl Parser {
351
351
let rows = if self . parse_keyword ( "UNBOUNDED" ) {
352
352
None
353
353
} else {
354
- let rows = self . parse_literal_int ( ) ?;
355
- if rows < 0 {
356
- parser_err ! ( format!(
357
- "The number of rows must be non-negative, got {}" ,
358
- rows
359
- ) ) ?;
360
- }
361
- Some ( rows as u64 )
354
+ let rows = self . parse_literal_uint ( ) ?;
355
+ Some ( rows)
362
356
} ;
363
357
if self . parse_keyword ( "PRECEDING" ) {
364
358
Ok ( SQLWindowFrameBound :: Preceding ( rows) )
@@ -1059,9 +1053,9 @@ impl Parser {
1059
1053
Ok ( n) => Ok ( Value :: Double ( n) ) ,
1060
1054
Err ( e) => parser_err ! ( format!( "Could not parse '{}' as f64: {}" , n, e) ) ,
1061
1055
} ,
1062
- Token :: Number ( ref n) => match n. parse :: < i64 > ( ) {
1056
+ Token :: Number ( ref n) => match n. parse :: < u64 > ( ) {
1063
1057
Ok ( n) => Ok ( Value :: Long ( n) ) ,
1064
- Err ( e) => parser_err ! ( format!( "Could not parse '{}' as i64 : {}" , n, e) ) ,
1058
+ Err ( e) => parser_err ! ( format!( "Could not parse '{}' as u64 : {}" , n, e) ) ,
1065
1059
} ,
1066
1060
Token :: SingleQuotedString ( ref s) => Ok ( Value :: SingleQuotedString ( s. to_string ( ) ) ) ,
1067
1061
Token :: NationalStringLiteral ( ref s) => {
@@ -1073,13 +1067,13 @@ impl Parser {
1073
1067
}
1074
1068
}
1075
1069
1076
- /// Parse a literal integer/long
1077
- pub fn parse_literal_int ( & mut self ) -> Result < i64 , ParserError > {
1070
+ /// Parse an unsigned literal integer/long
1071
+ pub fn parse_literal_uint ( & mut self ) -> Result < u64 , ParserError > {
1078
1072
match self . next_token ( ) {
1079
- Some ( Token :: Number ( s) ) => s. parse :: < i64 > ( ) . map_err ( |e| {
1080
- ParserError :: ParserError ( format ! ( "Could not parse '{}' as i64 : {}" , s, e) )
1073
+ Some ( Token :: Number ( s) ) => s. parse :: < u64 > ( ) . map_err ( |e| {
1074
+ ParserError :: ParserError ( format ! ( "Could not parse '{}' as u64 : {}" , s, e) )
1081
1075
} ) ,
1082
- other => parser_err ! ( format! ( "Expected literal int, found {:?} ", other) ) ,
1076
+ other => self . expected ( " literal int", other) ,
1083
1077
}
1084
1078
}
1085
1079
@@ -1258,34 +1252,28 @@ impl Parser {
1258
1252
}
1259
1253
}
1260
1254
1261
- pub fn parse_precision ( & mut self ) -> Result < usize , ParserError > {
1262
- //TODO: error handling
1263
- Ok ( self . parse_optional_precision ( ) ?. unwrap ( ) )
1264
- }
1265
-
1266
- pub fn parse_optional_precision ( & mut self ) -> Result < Option < usize > , ParserError > {
1255
+ pub fn parse_optional_precision ( & mut self ) -> Result < Option < u64 > , ParserError > {
1267
1256
if self . consume_token ( & Token :: LParen ) {
1268
- let n = self . parse_literal_int ( ) ?;
1269
- //TODO: check return value of reading rparen
1257
+ let n = self . parse_literal_uint ( ) ?;
1270
1258
self . expect_token ( & Token :: RParen ) ?;
1271
- Ok ( Some ( n as usize ) )
1259
+ Ok ( Some ( n) )
1272
1260
} else {
1273
1261
Ok ( None )
1274
1262
}
1275
1263
}
1276
1264
1277
1265
pub fn parse_optional_precision_scale (
1278
1266
& mut self ,
1279
- ) -> Result < ( Option < usize > , Option < usize > ) , ParserError > {
1267
+ ) -> Result < ( Option < u64 > , Option < u64 > ) , ParserError > {
1280
1268
if self . consume_token ( & Token :: LParen ) {
1281
- let n = self . parse_literal_int ( ) ?;
1269
+ let n = self . parse_literal_uint ( ) ?;
1282
1270
let scale = if self . consume_token ( & Token :: Comma ) {
1283
- Some ( self . parse_literal_int ( ) ? as usize )
1271
+ Some ( self . parse_literal_uint ( ) ?)
1284
1272
} else {
1285
1273
None
1286
1274
} ;
1287
1275
self . expect_token ( & Token :: RParen ) ?;
1288
- Ok ( ( Some ( n as usize ) , scale) )
1276
+ Ok ( ( Some ( n) , scale) )
1289
1277
} else {
1290
1278
Ok ( ( None , None ) )
1291
1279
}
@@ -1725,15 +1713,15 @@ impl Parser {
1725
1713
if self . parse_keyword ( "ALL" ) {
1726
1714
Ok ( None )
1727
1715
} else {
1728
- self . parse_literal_int ( )
1716
+ self . parse_literal_uint ( )
1729
1717
. map ( |n| Some ( ASTNode :: SQLValue ( Value :: Long ( n) ) ) )
1730
1718
}
1731
1719
}
1732
1720
1733
1721
/// Parse an OFFSET clause
1734
1722
pub fn parse_offset ( & mut self ) -> Result < ASTNode , ParserError > {
1735
1723
let value = self
1736
- . parse_literal_int ( )
1724
+ . parse_literal_uint ( )
1737
1725
. map ( |n| ASTNode :: SQLValue ( Value :: Long ( n) ) ) ?;
1738
1726
self . expect_one_of_keywords ( & [ "ROW" , "ROWS" ] ) ?;
1739
1727
Ok ( value)
0 commit comments