@@ -322,14 +322,8 @@ impl Parser {
322
322
let rows = if self . parse_keyword ( "UNBOUNDED" ) {
323
323
None
324
324
} else {
325
- let rows = self . parse_literal_int ( ) ?;
326
- if rows < 0 {
327
- parser_err ! ( format!(
328
- "The number of rows must be non-negative, got {}" ,
329
- rows
330
- ) ) ?;
331
- }
332
- Some ( rows as u64 )
325
+ let rows = self . parse_literal_uint ( ) ?;
326
+ Some ( rows)
333
327
} ;
334
328
if self . parse_keyword ( "PRECEDING" ) {
335
329
Ok ( SQLWindowFrameBound :: Preceding ( rows) )
@@ -968,9 +962,9 @@ impl Parser {
968
962
Ok ( n) => Ok ( Value :: Double ( n) ) ,
969
963
Err ( e) => parser_err ! ( format!( "Could not parse '{}' as f64: {}" , n, e) ) ,
970
964
} ,
971
- Token :: Number ( ref n) => match n. parse :: < i64 > ( ) {
965
+ Token :: Number ( ref n) => match n. parse :: < u64 > ( ) {
972
966
Ok ( n) => Ok ( Value :: Long ( n) ) ,
973
- Err ( e) => parser_err ! ( format!( "Could not parse '{}' as i64 : {}" , n, e) ) ,
967
+ Err ( e) => parser_err ! ( format!( "Could not parse '{}' as u64 : {}" , n, e) ) ,
974
968
} ,
975
969
Token :: SingleQuotedString ( ref s) => Ok ( Value :: SingleQuotedString ( s. to_string ( ) ) ) ,
976
970
Token :: NationalStringLiteral ( ref s) => {
@@ -982,13 +976,13 @@ impl Parser {
982
976
}
983
977
}
984
978
985
- /// Parse a literal integer/long
986
- pub fn parse_literal_int ( & mut self ) -> Result < i64 , ParserError > {
979
+ /// Parse an unsigned literal integer/long
980
+ pub fn parse_literal_uint ( & mut self ) -> Result < u64 , ParserError > {
987
981
match self . next_token ( ) {
988
- Some ( Token :: Number ( s) ) => s. parse :: < i64 > ( ) . map_err ( |e| {
989
- ParserError :: ParserError ( format ! ( "Could not parse '{}' as i64 : {}" , s, e) )
982
+ Some ( Token :: Number ( s) ) => s. parse :: < u64 > ( ) . map_err ( |e| {
983
+ ParserError :: ParserError ( format ! ( "Could not parse '{}' as u64 : {}" , s, e) )
990
984
} ) ,
991
- other => parser_err ! ( format! ( "Expected literal int, found {:?} ", other) ) ,
985
+ other => self . expected ( " literal int", other) ,
992
986
}
993
987
}
994
988
@@ -1167,34 +1161,28 @@ impl Parser {
1167
1161
}
1168
1162
}
1169
1163
1170
- pub fn parse_precision ( & mut self ) -> Result < usize , ParserError > {
1171
- //TODO: error handling
1172
- Ok ( self . parse_optional_precision ( ) ?. unwrap ( ) )
1173
- }
1174
-
1175
- pub fn parse_optional_precision ( & mut self ) -> Result < Option < usize > , ParserError > {
1164
+ pub fn parse_optional_precision ( & mut self ) -> Result < Option < u64 > , ParserError > {
1176
1165
if self . consume_token ( & Token :: LParen ) {
1177
- let n = self . parse_literal_int ( ) ?;
1178
- //TODO: check return value of reading rparen
1166
+ let n = self . parse_literal_uint ( ) ?;
1179
1167
self . expect_token ( & Token :: RParen ) ?;
1180
- Ok ( Some ( n as usize ) )
1168
+ Ok ( Some ( n) )
1181
1169
} else {
1182
1170
Ok ( None )
1183
1171
}
1184
1172
}
1185
1173
1186
1174
pub fn parse_optional_precision_scale (
1187
1175
& mut self ,
1188
- ) -> Result < ( Option < usize > , Option < usize > ) , ParserError > {
1176
+ ) -> Result < ( Option < u64 > , Option < u64 > ) , ParserError > {
1189
1177
if self . consume_token ( & Token :: LParen ) {
1190
- let n = self . parse_literal_int ( ) ?;
1178
+ let n = self . parse_literal_uint ( ) ?;
1191
1179
let scale = if self . consume_token ( & Token :: Comma ) {
1192
- Some ( self . parse_literal_int ( ) ? as usize )
1180
+ Some ( self . parse_literal_uint ( ) ?)
1193
1181
} else {
1194
1182
None
1195
1183
} ;
1196
1184
self . expect_token ( & Token :: RParen ) ?;
1197
- Ok ( ( Some ( n as usize ) , scale) )
1185
+ Ok ( ( Some ( n) , scale) )
1198
1186
} else {
1199
1187
Ok ( ( None , None ) )
1200
1188
}
@@ -1609,7 +1597,7 @@ impl Parser {
1609
1597
if self . parse_keyword ( "ALL" ) {
1610
1598
Ok ( None )
1611
1599
} else {
1612
- self . parse_literal_int ( )
1600
+ self . parse_literal_uint ( )
1613
1601
. map ( |n| Some ( ASTNode :: SQLValue ( Value :: Long ( n) ) ) )
1614
1602
}
1615
1603
}
0 commit comments