@@ -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
@@ -17384,17 +17378,6 @@ mod tests {
1738417378 "DEC(5,-2)",
1738517379 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
1738617380 );
17387-
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- });
1739817381 }
1739917382
1740017383 #[test]
0 commit comments