diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 977372656..935f3fc06 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -9334,6 +9334,7 @@ impl<'a> Parser<'a> { } pub fn parse_table_and_joins(&mut self) -> Result { + let _guard = self.recursion_counter.try_decrease()?; let relation = self.parse_table_factor()?; // Note that for keywords to be properly handled here, they need to be // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index fbe97171b..c33ed9142 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -8838,6 +8838,13 @@ fn parse_deeply_nested_subquery_expr_hits_recursion_limits() { assert_eq!(res, Err(ParserError::RecursionLimitExceeded)); } +#[test] +fn parse_deeply_nested_update_hits_recursion_limits() { + let sql = format!("UPDATE {}", "(".repeat(1000)); + let res = parse_sql_statements(&sql); + assert_eq!(ParserError::RecursionLimitExceeded, res.unwrap_err()); +} + #[test] fn parse_with_recursion_limit() { let dialect = GenericDialect {};