max_temp_directory_size in connect config is reported but not enforced
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 30/100
Línea de trabajo
Run the reproduction script first to confirm the two runs differ: the apply_set=False run should succeed while the apply_set=True run raises OutOfMemoryException. Then trace how the max_temp_directory_size key in the config= mapping passed to duckdb.connect is applied during connection initialization, and compare that with the path SET max_temp_directory_size takes. Done means the connect-time 1-byte cap rejects the spill just as the SET run does, and the same script passes both cases.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What happens?
Passing max_temp_directory_size through duckdb.connect(config=...) makes current_setting('max_temp_directory_size') report the requested value, but spilling is not bounded by it. Executing the same value with SET max_temp_directory_size after the connection is created enforces the cap.
This can silently let a Python process consume the filesystem space that the connect-time configuration was intended to reserve.
To Reproduce
This self-contained script generates its own Parquet input and runs the same external sort twice:
import tempfile
from pathlib import Path
import duckdb
def run(apply_set: bool) -> None:
root = Path(tempfile.mkdtemp())
source = root / "source.parquet"
output = root / "output.parquet"
with duckdb.connect() as connection:
connection.sql(
"""
SELECT
i AS row_id,
i % 17 AS group_id,
repeat(md5(i::VARCHAR), 32) AS payload
FROM range(49152) t(i)
"""
).write_parquet(str(source), row_group_size=2048)
with duckdb.connect(
str(root / "test.duckdb"),
config={
"memory_limit": "64MB",
"threads": 2,
"temp_directory": str(root / "tmp"),
"preserve_insertion_order": False,
"max_temp_directory_size": "1B",
},
) as connection:
if apply_set:
connection.execute("SET max_temp_directory_size = '1B'")
print("apply_set", apply_set)
print(
"setting",
connection.execute(
"SELECT current_setting('max_temp_directory_size')"
).fetchone(),
)
try:
connection.read_parquet(str(source)).order(
"group_id, payload, row_id"
).write_parquet(str(output), row_group_size=2048)
print("sort succeeded")
except Exception as error:
print(type(error).__name__, str(error).splitlines()[0])
run(apply_set=False)
run(apply_set=True)
Output with DuckDB 1.5.6:
apply_set False
setting ('1 byte',)
sort succeeded
apply_set True
setting ('1 byte',)
OutOfMemoryException Out of Memory Error: failed to offload data block of size 32.0 KiB (0 bytes/1 byte used).
Expected: both runs reject the spill at the 1-byte cap.
The behavior also reproduces with DuckDB 1.5.2. This is specific to initialization through the Python config mapping, so there is no equivalent plain-SQL/CLI connect-time reproduction; the post-connect SQL SET is the working comparison.
Environment
- OS: macOS 27.0, arm64
- DuckDB Package Version: 1.5.6 (latest stable; also 1.5.2)
- Python Version: 3.13.14
- Full Name: Simon Thelin
- Affiliation: Odyssey
- Latest build tested: stable release
- Data set: not applicable; the reproduction generates its input
- All code and relevant configuration are included
- Lenguaje dominante
- Python
- Estrellas
- 191
- Forks
- 120
- Merge medio
- 1 d 20 min
- PR fusionados (30 d)
- 41
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
-
duckdb.experimental.spark fails to import without typing_extensions, which is not a runtime dependencyPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
duckdb/duckdb-python#653 ·
Los mantenedores suelen responder en 1 día
-
Type stubs omit the `connection` keyword on module-level `read_json` and `write_csv`Posiblemente ocupada @tojacob03 la tomó hace 19 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
duckdb/duckdb-python#627 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
`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 77 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
-
Possible reference leak of the argument tuple in `FunctionCall()`Posiblemente 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 76/100
duckdb/duckdb-python#534 ·
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
Todos los issues de duckdb/duckdb-python
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
SACGF/variantgrid#2341 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 2 días
-
comp/cli P3 type/security
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
NousResearch/hermes-agent#141420 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
CKV_GCP_18 (GKEPublicControlPlane) passes when master_authorized_networks_config is absent, control plane is internet-reachablePosiblemente ocupada @Varshith-Kali la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
bridgecrewio/checkov#7753 ·
Los mantenedores suelen responder en 1 día