Optimizer drops LEFT JOIN when a cast collapses distinct join keys
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 30/100
Direzione di ricerca
The bug is in _is_joined_on_all_unique_outputs in the sqlglot optimizer; read that function to see how it compares join keys by .name. Run the provided Python repro to confirm the dropped rows, then adjust the uniqueness check to account for casts. Done means the optimized SQL keeps the LEFT JOIN and returns three rows.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
The optimizer removes a LEFT JOIN when its right-hand key is a cast of a distinct column. Distinct timestamps can become the same date after the cast, so removing the join changes the number of rows returned.
Reproduced on main at 6de2df31b0ae8b21155828f575a14dc8903c1b9b, with Python 3.12 and DuckDB 2.0.0. Both the read and write dialects are DuckDB.
import duckdb
from sqlglot import parse_one
from sqlglot.optimizer import optimize
sql = """
SELECT days.day
FROM (VALUES (DATE '2026-10-30'), (DATE '2026-10-31')) AS days(day)
LEFT JOIN (
SELECT DISTINCT events.occurred_at
FROM (VALUES
(TIMESTAMP '2026-10-30 09:00:00'),
(TIMESTAMP '2026-10-30 18:00:00')
) AS events(occurred_at)
) AS event_times ON days.day = CAST(event_times.occurred_at AS DATE)
ORDER BY days.day
"""
optimized = optimize(parse_one(sql, read="duckdb"), dialect="duckdb").sql("duckdb")
with duckdb.connect() as conn:
original = conn.execute(sql).fetchall()
rewritten = conn.execute(optimized).fetchall()
print("original:", [str(row[0]) for row in original])
print("optimized:", [str(row[0]) for row in rewritten])
print(optimized)
Output:
original: ['2026-10-30', '2026-10-30', '2026-10-31']
optimized: ['2026-10-30', '2026-10-31']
The optimized query should preserve all three rows: both events match October 30, and October 31 has no match. The generated SQL currently has no join. TRY_CAST and replacing DISTINCT with GROUP BY events.occurred_at also reproduce the issue.
The cause appears to be _is_joined_on_all_unique_outputs: it compares join_keys by .name, and Cast.name returns the underlying column name without proving that the cast preserves uniqueness.
DuckDB references: casts and join semantics.
Found with Codex assistance.
- Lingua principale
- Python
- Stelle
- 9.8k
- Fork
- 1.4k
- Merge medio
- 14h
- PR unite (30g)
- 212
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di tobymao/sqlglot
-
Redshift DISTKEY / SORTKEY / DISTSTYLE break transpilation to other dialectsForse già presa @zgurung l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 25/100
I maintainer di solito rispondono entro 1 giorno
-
qualify (postgres): outer columns should take precedence over inner table aliasesForse già presa @subotac l’ha presa oggi. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
I maintainer di solito rispondono entro 1 giorno
-
[BUG] REGEXP_REPLACE with omitted replacement crashes the generator (KeyError: 'replacement')Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 48/100
tobymao/sqlglot#8934 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Teradata dialect: Consider CASE_INSENSITIVE normalization strategyForse già presa @EduardoAndradeSLima l’ha presa oggi. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 57/100
I maintainer di solito rispondono entro 1 giorno
-
BigQuery `SELECT * EXCEPT(col)` -> postgres still emits set-op `EXCEPT` (psql syntax error; RAISE silent)Forse già presa @lss680455-create l’ha presa 1 giorno fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 67/100
tobymao/sqlglot#8928 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di tobymao/sqlglot
Issue simili
-
LLVM versionsAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
I maintainer di solito rispondono entro 1 giorno
-
Translate docs/ to SpanishApertadocumentation good first issue language
Difficoltà 2/5 1-3 ore Idoneità per principianti 91/100
-
good first issue help wanted translation
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
I maintainer di solito rispondono entro 1 giorno
-
Fix duplicated word in speculative decoding docsForse già presa @ddlw l’ha presa oggi. Apertacommunity-request
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 89/100
NVIDIA/Megatron-LM#9118 ·
I maintainer di solito rispondono entro 2 giorni