Skip to content

Commit 4875dad

Browse files
authored
fix: Fix stack overflow in parse_subexpr (#1410)
1 parent aa714e3 commit 4875dad

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

src/parser/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -897,12 +897,12 @@ impl<'a> Parser<'a> {
897897

898898
/// Parse a new expression.
899899
pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
900-
let _guard = self.recursion_counter.try_decrease()?;
901900
self.parse_subexpr(self.dialect.prec_unknown())
902901
}
903902

904903
/// Parse tokens until the precedence changes.
905904
pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
905+
let _guard = self.recursion_counter.try_decrease()?;
906906
debug!("parsing expr");
907907
let mut expr = self.parse_prefix()?;
908908
debug!("prefix: {:?}", expr);

tests/sqlparser_common.rs

+7
Original file line numberDiff line numberDiff line change
@@ -8980,6 +8980,13 @@ fn parse_deeply_nested_parens_hits_recursion_limits() {
89808980
assert_eq!(ParserError::RecursionLimitExceeded, res.unwrap_err());
89818981
}
89828982

8983+
#[test]
8984+
fn parse_deeply_nested_unary_op_hits_recursion_limits() {
8985+
let sql = format!("SELECT {}", "+".repeat(1000));
8986+
let res = parse_sql_statements(&sql);
8987+
assert_eq!(ParserError::RecursionLimitExceeded, res.unwrap_err());
8988+
}
8989+
89838990
#[test]
89848991
fn parse_deeply_nested_expr_hits_recursion_limits() {
89858992
let dialect = GenericDialect {};

0 commit comments

Comments
 (0)