Skip to content

Commit 00c80b1

Browse files
authored
Fix: Parse joins with derived tables in UPDATE (#6632)
1 parent 7f2a74c commit 00c80b1

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

sqlglot/parser.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3184,7 +3184,12 @@ def _parse_update(self) -> exp.Update:
31843184
elif self._match(TokenType.RETURNING, advance=False):
31853185
kwargs["returning"] = self._parse_returning()
31863186
elif self._match(TokenType.FROM, advance=False):
3187-
kwargs["from_"] = self._parse_from(joins=True)
3187+
from_ = self._parse_from(joins=True)
3188+
table = from_.this if from_ else None
3189+
if isinstance(table, exp.Subquery) and self._match(TokenType.JOIN, advance=False):
3190+
table.set("joins", list(self._parse_joins()) or None)
3191+
3192+
kwargs["from_"] = from_
31883193
elif self._match(TokenType.WHERE, advance=False):
31893194
kwargs["where"] = self._parse_where()
31903195
elif self._match(TokenType.ORDER_BY, advance=False):

tests/dialects/test_snowflake.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -561,10 +561,6 @@ def test_snowflake(self):
561561
self.validate_identity(
562562
"""SELECT TO_TIMESTAMP('2025-01-16T14:45:30.123+0500', 'yyyy-mm-DD"T"hh24:mi:ss.ff3TZHTZM')"""
563563
)
564-
self.validate_identity(
565-
"UPDATE sometesttable u FROM (SELECT 5195 AS new_count, '01bee1e5-0000-d31e-0000-e80ef02b9f27' query_id ) b SET qry_hash_count = new_count WHERE u.sample_query_id = b.query_id",
566-
"UPDATE sometesttable AS u SET qry_hash_count = new_count FROM (SELECT 5195 AS new_count, '01bee1e5-0000-d31e-0000-e80ef02b9f27' AS query_id) AS b WHERE u.sample_query_id = b.query_id",
567-
)
568564
self.validate_identity(
569565
"SELECT * REPLACE (CAST(col AS TEXT) AS scol) FROM t",
570566
"SELECT * REPLACE (CAST(col AS VARCHAR) AS scol) FROM t",
@@ -4408,3 +4404,15 @@ def test_ceil(self):
44084404
"duckdb": "SELECT ROUND(CEIL(1.234 * POWER(10, CAST(1.5 AS INT))) / POWER(10, CAST(1.5 AS INT)), CAST(1.5 AS INT))"
44094405
},
44104406
)
4407+
4408+
def test_update_statement(self):
4409+
self.validate_identity("UPDATE test SET t = 1 FROM t1")
4410+
self.validate_identity("UPDATE test SET t = 1 FROM t2 JOIN t3 ON t2.id = t3.id")
4411+
self.validate_identity(
4412+
"UPDATE test SET t = 1 FROM (SELECT id FROM test2) AS t2 JOIN test3 AS t3 ON t2.id = t3.id"
4413+
)
4414+
4415+
self.validate_identity(
4416+
"UPDATE sometesttable u FROM (SELECT 5195 AS new_count, '01bee1e5-0000-d31e-0000-e80ef02b9f27' query_id ) b SET qry_hash_count = new_count WHERE u.sample_query_id = b.query_id",
4417+
"UPDATE sometesttable AS u SET qry_hash_count = new_count FROM (SELECT 5195 AS new_count, '01bee1e5-0000-d31e-0000-e80ef02b9f27' AS query_id) AS b WHERE u.sample_query_id = b.query_id",
4418+
)

0 commit comments

Comments
 (0)