From 16f7d6cf64701dc160c4162ad79fed6ea7b9878c Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 23 Jun 2025 18:09:57 +0100 Subject: [PATCH] Fix join precedence for non-snowflake queries --- src/parser/mod.rs | 2 +- tests/sqlparser_common.rs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 44bf58d0..99aa3bd0 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12467,7 +12467,7 @@ impl<'a> Parser<'a> { }; let mut relation = self.parse_table_factor()?; - if self.peek_parens_less_nested_join() { + if dialect_of!(self is SnowflakeDialect) && self.peek_parens_less_nested_join() { let joins = self.parse_joins()?; relation = TableFactor::NestedJoin { table_with_joins: Box::new(TableWithJoins { relation, joins }), diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 52054604..71cf4398 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -15356,3 +15356,25 @@ fn check_enforced() { "CREATE TABLE t (a INT, b INT, c INT, CHECK (a > 0) NOT ENFORCED, CHECK (b > 0) ENFORCED, CHECK (c > 0))", ); } + +#[test] +fn join_precedence() { + all_dialects_except(|d| d.is::()).verified_query_with_canonical( + "SELECT * + FROM t1 + NATURAL JOIN t5 + INNER JOIN t0 ON (t0.v1 + t5.v0) > 0 + WHERE t0.v1 = t1.v0", + // canonical string without parentheses + "SELECT * FROM t1 NATURAL JOIN t5 INNER JOIN t0 ON (t0.v1 + t5.v0) > 0 WHERE t0.v1 = t1.v0", + ); + TestedDialects::new(vec![Box::new(SnowflakeDialect {})]).verified_query_with_canonical( + "SELECT * + FROM t1 + NATURAL JOIN t5 + INNER JOIN t0 ON (t0.v1 + t5.v0) > 0 + WHERE t0.v1 = t1.v0", + // canonical string with parentheses + "SELECT * FROM t1 NATURAL JOIN (t5 INNER JOIN t0 ON (t0.v1 + t5.v0) > 0) WHERE t0.v1 = t1.v0", + ); +}