Skip to content

Commit 1c9ad37

Browse files
committed
feat: enhance signed integer parsing to handle explicit '+' sign
1 parent 427988e commit 1c9ad37

1 file changed

Lines changed: 22 additions & 10 deletions

File tree

src/parser/mod.rs

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

1123211232
/// Parse an optionally signed integer literal.
1123311233
fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
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()));
11234+
let is_negative = self.consume_token(&Token::Minus);
11235+
11236+
if !is_negative {
11237+
let _ = self.consume_token(&Token::Plus);
1123711238
}
1123811239

11239-
self.advance_token();
11240-
let next_token = self.get_current_token();
11241-
match &next_token.token {
11240+
let current_token = self.peek_token_ref();
11241+
match &current_token.token {
1124211242
Token::Number(s, _) => {
11243-
let positive_value = Self::parse::<i64>(s.clone(), next_token.span.start)?;
11244-
Ok(-positive_value)
11243+
let s = s.clone();
11244+
let span_start = current_token.span.start;
11245+
self.advance_token();
11246+
let value = Self::parse::<i64>(s, span_start)?;
11247+
Ok(if is_negative { -value } else { value })
1124511248
}
11246-
_ => self.expected_ref("literal int", next_token),
11249+
_ => self.expected_ref("number", current_token),
1124711250
}
1124811251
}
1124911252

@@ -17360,7 +17363,6 @@ mod tests {
1736017363
DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
1736117364
);
1736217365

17363-
// Additional negative scale test cases
1736417366
test_parse_data_type!(
1736517367
dialect,
1736617368
"NUMERIC(10,-5)",
@@ -17378,6 +17380,16 @@ mod tests {
1737817380
"DEC(5,-2)",
1737917381
DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
1738017382
);
17383+
17384+
dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
17385+
let data_type = parser.parse_data_type().unwrap();
17386+
assert_eq!(
17387+
DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
17388+
data_type
17389+
);
17390+
// Note: Explicit '+' sign is not preserved in output, which is correct
17391+
assert_eq!("NUMERIC(10,5)", data_type.to_string());
17392+
});
1738117393
}
1738217394

1738317395
#[test]

0 commit comments

Comments
 (0)