@@ -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 ¤t_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