Skip to content

Commit ba463fa

Browse files
committed
feat: implement improved parsing for signed integers
1 parent d31b302 commit ba463fa

File tree

1 file changed

+10
-26
lines changed

1 file changed

+10
-26
lines changed

src/parser/mod.rs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11231,25 +11231,19 @@ impl<'a> Parser<'a> {
1123111231

1123211232
/// Parse an optionally signed integer literal.
1123311233
fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
11234-
let next_token = self.next_token();
11235-
let (sign, number_token) = match next_token.token {
11236-
Token::Minus => {
11237-
let number_token = self.next_token();
11238-
(-1, number_token)
11239-
}
11240-
Token::Plus => {
11241-
let number_token = self.next_token();
11242-
(1, number_token)
11243-
}
11244-
_ => (1, next_token),
11245-
};
11234+
if !self.consume_token(&Token::Minus) {
11235+
return i64::try_from(self.parse_literal_uint()?)
11236+
.map_err(|_| ParserError::ParserError("Integer overflow".to_string()));
11237+
}
1124611238

11247-
match number_token.token {
11239+
self.advance_token();
11240+
let next_token = self.get_current_token();
11241+
match &next_token.token {
1124811242
Token::Number(s, _) => {
11249-
let value = Self::parse::<i64>(s, number_token.span.start)?;
11250-
Ok(sign * value)
11243+
let positive_value = Self::parse::<i64>(s.clone(), next_token.span.start)?;
11244+
Ok(-positive_value)
1125111245
}
11252-
_ => self.expected("number", number_token),
11246+
_ => self.expected_ref("literal int", next_token),
1125311247
}
1125411248
}
1125511249

@@ -17385,16 +17379,6 @@ mod tests {
1738517379
DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
1738617380
);
1738717381

17388-
// Test positive scale with explicit plus sign
17389-
dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
17390-
let data_type = parser.parse_data_type().unwrap();
17391-
assert_eq!(
17392-
DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
17393-
data_type
17394-
);
17395-
// Note: Explicit '+' sign is not preserved in output, which is correct
17396-
assert_eq!("NUMERIC(10,5)", data_type.to_string());
17397-
});
1739817382
}
1739917383

1740017384
#[test]

0 commit comments

Comments
 (0)