1
0
Fork 0

Adding upstream version 25.24.5.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 21:55:31 +01:00
parent a0663ae805
commit 7af32ea9ec
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
80 changed files with 61531 additions and 59444 deletions

View file

@ -8,6 +8,7 @@ from sqlglot.helper import find_new_name, name_sequence
if t.TYPE_CHECKING:
from sqlglot._typing import E
from sqlglot.generator import Generator
@ -628,16 +629,28 @@ def eliminate_full_outer_join(expression: exp.Expression) -> exp.Expression:
expression_copy = expression.copy()
expression.set("limit", None)
index, full_outer_join = full_outer_joins[0]
full_outer_join.set("side", "left")
expression_copy.args["joins"][index].set("side", "right")
expression_copy.args.pop("with", None) # remove CTEs from RIGHT side
return exp.union(expression, expression_copy, copy=False)
tables = (expression.args["from"].alias_or_name, full_outer_join.alias_or_name)
join_conditions = full_outer_join.args.get("on") or exp.and_(
*[
exp.column(col, tables[0]).eq(exp.column(col, tables[1]))
for col in full_outer_join.args.get("using")
]
)
full_outer_join.set("side", "left")
anti_join_clause = exp.select("1").from_(expression.args["from"]).where(join_conditions)
expression_copy.args["joins"][index].set("side", "right")
expression_copy = expression_copy.where(exp.Exists(this=anti_join_clause).not_())
expression_copy.args.pop("with", None) # remove CTEs from RIGHT side
expression.args.pop("order", None) # remove order by from LEFT side
return exp.union(expression, expression_copy, copy=False, distinct=False)
return expression
def move_ctes_to_top_level(expression: exp.Expression) -> exp.Expression:
def move_ctes_to_top_level(expression: E) -> E:
"""
Some dialects (e.g. Hive, T-SQL, Spark prior to version 3) only allow CTEs to be
defined at the top-level, so for example queries like: