From 18b4a14e0f14fad05d6df9adcaeaecc996f54b28 Mon Sep 17 00:00:00 2001 From: tomershaniii <65544633+tomershaniii@users.noreply.github.com> Date: Fri, 8 Aug 2025 12:22:30 +0300 Subject: [PATCH] Snowflake - support table function in table factor (regression) (#1996) --- src/dialect/snowflake.rs | 2 ++ tests/sqlparser_snowflake.rs | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dialect/snowflake.rs b/src/dialect/snowflake.rs index 697ba3b4..8830e09a 100644 --- a/src/dialect/snowflake.rs +++ b/src/dialect/snowflake.rs @@ -515,6 +515,8 @@ impl Dialect for SnowflakeDialect { fn is_table_factor(&self, kw: &Keyword, parser: &mut Parser) -> bool { match kw { Keyword::LIMIT if peek_for_limit_options(parser) => false, + // Table function + Keyword::TABLE if matches!(parser.peek_token_ref().token, Token::LParen) => true, _ => !RESERVED_KEYWORDS_FOR_TABLE_FACTOR.contains(kw), } } diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index eb4bda7b..bd8a6d30 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -3609,9 +3609,13 @@ fn test_sql_keywords_as_table_aliases() { #[test] fn test_sql_keywords_as_table_factor() { // LIMIT is a table factor, Snowflake does not reserve it - snowflake().one_statement_parses_to("SELECT * FROM tbl, LIMIT", "SELECT * FROM tbl, LIMIT"); + snowflake().verified_stmt("SELECT * FROM tbl, LIMIT"); // LIMIT is not a table factor snowflake().one_statement_parses_to("SELECT * FROM tbl, LIMIT 1", "SELECT * FROM tbl LIMIT 1"); + + // Table functions are table factors + snowflake().verified_stmt("SELECT 1 FROM TABLE(GENERATOR(ROWCOUNT => 10)) AS a, TABLE(GENERATOR(ROWCOUNT => 10)) AS b"); + // ORDER is reserved assert!(snowflake() .parse_sql_statements("SELECT * FROM tbl, order")