max_temp_directory_size in connect config is reported but not enforced
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 30/100
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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
- Lingua principale
- Python
- Stelle
- 191
- Fork
- 120
- Merge medio
- 14h 1m
- PR unite (30g)
- 23
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 duckdb/duckdb-python
-
duckdb.experimental.spark fails to import without typing_extensions, which is not a runtime dependencyForse già presa @evertlammerts l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
duckdb/duckdb-python#653 ·
I maintainer di solito rispondono entro 1 giorno
-
Type stubs omit the `connection` keyword on module-level `read_json` and `write_csv`Forse già presa @tojacob03 l’ha presa 17 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
duckdb/duckdb-python#627 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
`read_json` accepts a list of paths at runtime but the type stub only allows a single path.Forse già presa @aleks-drozy l’ha presa 75 giorni fa. Apertaneeds triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
duckdb/duckdb-python#576 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Possible reference leak of the argument tuple in `FunctionCall()`Forse già presa Una pull request collegata a questa issue è aperta o già unita. Apertaneeds triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
duckdb/duckdb-python#534 ·
I maintainer di solito rispondono entro 1 giorno
-
Missing ROW_GROUPS_PER_FILE argument in write_parquet functionForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertaneeds triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
duckdb/duckdb-python#386 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di duckdb/duckdb-python
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
UKGovernmentBEIS/control-arena#917 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
debpalash/VoiceStudio#2937 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
aws-samples/sample-per-model-bedrock#261 ·
I maintainer di solito rispondono entro 1 giorno