File tree Expand file tree Collapse file tree 3 files changed +12
-6
lines changed
Expand file tree Collapse file tree 3 files changed +12
-6
lines changed Original file line number Diff line number Diff 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) {
Original file line number Diff line number Diff 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]
1100911016fn parse_deeply_nested_unary_op_hits_recursion_limits() {
1101011017 let sql = format!("SELECT {}", "+".repeat(1000));
Original file line number Diff line number Diff line change @@ -3202,21 +3202,19 @@ fn parse_view_column_descriptions() {
32023202
32033203#[ test]
32043204fn 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}" ) ;
You can’t perform that action at this time.
0 commit comments