Skip to content

Commit 7041319

Browse files
Fixed crash
1 parent 3ac5670 commit 7041319

File tree

3 files changed

+12
-6
lines changed

3 files changed

+12
-6
lines changed

src/parser/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14987,6 +14987,7 @@ impl<'a> Parser<'a> {
1498714987

1498814988
/// A table name or a parenthesized subquery, followed by optional `[AS] alias`
1498914989
pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
14990+
let _guard = self.recursion_counter.try_decrease()?;
1499014991
if self.parse_keyword(Keyword::LATERAL) {
1499114992
// LATERAL must always be followed by a subquery or table function.
1499214993
if self.consume_token(&Token::LParen) {

tests/sqlparser_common.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11005,6 +11005,13 @@ fn parse_deeply_nested_parens_hits_recursion_limits() {
1100511005
assert_eq!(ParserError::RecursionLimitExceeded, res.unwrap_err());
1100611006
}
1100711007

11008+
#[test]
11009+
fn parse_update_deeply_nested_parens_hits_recursion_limits() {
11010+
let sql = format!("\nUPDATE\n\n\n\n\n\n\n\n\n\n{}", "(".repeat(1000));
11011+
let res = parse_sql_statements(&sql);
11012+
assert_eq!(ParserError::RecursionLimitExceeded, res.unwrap_err());
11013+
}
11014+
1100811015
#[test]
1100911016
fn parse_deeply_nested_unary_op_hits_recursion_limits() {
1101011017
let sql = format!("SELECT {}", "+".repeat(1000));

tests/sqlparser_snowflake.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3202,21 +3202,19 @@ fn parse_view_column_descriptions() {
32023202

32033203
#[test]
32043204
fn test_parentheses_overflow() {
3205-
// TODO: increase / improve after we fix the recursion limit
3206-
// for real (see https://github.com/apache/datafusion-sqlparser-rs/issues/984)
32073205
let max_nesting_level: usize = 25;
32083206

3209-
// Verify the recursion check is not too wasteful... (num of parentheses - 2 is acceptable)
3210-
let slack = 2;
3207+
// Verify the recursion check is not too wasteful (num of parentheses within budget)
3208+
let slack = 3;
32113209
let l_parens = "(".repeat(max_nesting_level - slack);
32123210
let r_parens = ")".repeat(max_nesting_level - slack);
32133211
let sql = format!("SELECT * FROM {l_parens}a.b.c{r_parens}");
32143212
let parsed =
32153213
snowflake_with_recursion_limit(max_nesting_level).parse_sql_statements(sql.as_str());
32163214
assert_eq!(parsed.err(), None);
32173215

3218-
// Verify the recursion check triggers... (num of parentheses - 1 is acceptable)
3219-
let slack = 1;
3216+
// Verify the recursion check triggers (one more paren exceeds the budget)
3217+
let slack = 2;
32203218
let l_parens = "(".repeat(max_nesting_level - slack);
32213219
let r_parens = ")".repeat(max_nesting_level - slack);
32223220
let sql = format!("SELECT * FROM {l_parens}a.b.c{r_parens}");

0 commit comments

Comments
 (0)