Join behavior inconsistency with duckdb 2.0
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 68/100
Línea de trabajo
Start with the relation API implementation reached through duckdb/_relation.py and reproduce the two join forms with the provided registered pandas DataFrames. Trace how equality-expression joins alter relation binding or table qualification, and add a regression test showing that table_one, table_two, and table_three remain selectable. The issue is done when the equality-expression query selects from all three tables without a BinderException.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What happens?
When I join three tables with condition = 'column', I can select from all three joined tables
When I join with a condition table['column'] == table['column'], I can't select from all three tables using their table names
To Reproduce
#!/usr/bin/env python
# coding: utf-8
# In[1]:
import duckdb
import pandas as pd
from duckdb import col
duckdb.__version__
# '2.0.0'
# In[2]:
# Table 1's id1 is a foreign key referenced by both table 2 and table 3
table_1_df = pd.DataFrame({
"id1": [1,2,3,4,5],
"data": [1,2,3,4,5],
})
# Table 2 and table 3 share a data column name, so table references and aliases are needed
table_2_df = pd.DataFrame({
"id2": list("abcde"),
"id1": [1,2,3,4,5],
"data": [1,2,3,4,5],
})
table_3_df = pd.DataFrame({
"id3": list("fghij"),
"id1": [1,2,3,4,5],
"data": [1,2,3,4,5],
})
con = duckdb.connect()
con.register("table_one", table_1_df)
table_1 = con.table("table_one")
con.register("table_two", table_2_df)
table_2 = con.table("table_two")
con.register("table_three", table_3_df)
table_3 = con.table("table_three")
# In[3]:
# When a join USING(id1) query is created, all is well
using_query = (table_1
.join(table_2, condition= 'id1')
.join(table_3, how="left", condition='id1')
)
using_query.select(
col("table_one", "id1"),
col("table_two", "data").alias("data2"),
col("table_three", "data").alias("data3"),
)
# id1
# BIGINT data2
# BIGINT data3
# BIGINT
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 5 5
# In[4]:
# When a join with an equality expression is used, it does not work
condition_query = (table_1
.join(table_2, condition= lambda left,right: left['id1'] == right['id1'])
.join(table_3, how="left", condition=lambda left,right: left['id1'] == right['id1'])
)
condition_query.select(
col("table_one", "id1"),
col("table_two", "data").alias("data2"),
col("table_three", "data").alias("data3"),
)
# ---------------------------------------------------------------------------
# BinderException Traceback (most recent call last)
# Cell In[4], line 7
# 3 .join(table_2, condition= lambda left,right: left['id1'] == right['id1'])
# 4 .join(table_3, how="left", condition=lambda left,right: left['id1'] == right['id1'])
# 5 )
# 6
# ----> 7 condition_query.select(
# 8 col("table_one", "id1"),
# 9 col("table_two", "data").alias("data2"),
# 10 col("table_three", "data").alias("data3"),
# File ~/develop/jds-sql/.venv/lib/python3.12/site-packages/duckdb/_relation.py:3017, in _closed_as_relation.<locals>.guarded(*args, **kwargs)
# 3015 raise _duckdb.ConnectionException(message) from None
# 3016 except _duckdb.Error as error:
# -> 3017 raise _trimmed(error) from error.__cause__
# BinderException: Binder Error: Referenced table "table_one" not found!
# Candidate tables: "table_three"
OS:
Ubuntu
DuckDB Package Version:
2.0.0
Python Version:
3.12.3
Full Name:
Janet Carson
Affiliation:
Echodyne
What is the latest build you tested with? If possible, we recommend testing with the latest nightly build.
I have tested with a stable release
Did you include all relevant data sets for reproducing the issue?
Yes
Did you include all code required to reproduce the issue?
- Yes, I have
Did you include all relevant configuration to reproduce the issue?
- Yes, I have
- Lenguaje dominante
- Python
- Estrellas
- 203
- Forks
- 124
- Merge medio
- 13 h 36 min
- PR fusionados (30 d)
- 61
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de duckdb/duckdb-python
-
`read_json` accepts a list of paths at runtime but the type stub only allows a single path.Posiblemente ocupada @aleks-drozy la tomó hace 95 días. Abiertoneeds triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
duckdb/duckdb-python#576 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Missing ROW_GROUPS_PER_FILE argument in write_parquet functionPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abiertoneeds triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
duckdb/duckdb-python#386 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 66/100
duckdb/duckdb-python#737 ·
Los mantenedores suelen responder en 1 día
-
needs triage
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
duckdb/duckdb-python#736 ·
Los mantenedores suelen responder en 1 día
-
nanobind: leaked ... when a DuckDB type is referenced in overload signature and numpy is importedAbiertoneeds triage
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
duckdb/duckdb-python#732 · 5 comentarios · 3 reacciones ·
Los mantenedores suelen responder en 1 día
Todos los issues de duckdb/duckdb-python
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
fritzprix/libr-agent#2612 ·
Los mantenedores suelen responder en 1 día
-
needs-triage presubmit-gate
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
gke-labs/kube-agents#5001 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
simonw/sqlite-utils#928 ·
Los mantenedores suelen responder en 3 días
-
colorado
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
freelawproject/juriscraper#2405 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
cline/mcp-marketplace#3576 ·