max_temp_directory_size in connect config is reported but not enforced
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 30/100
Hướng nghiên cứu
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.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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
- Ngôn ngữ chính
- Python
- Star
- 191
- Fork
- 120
- Merge trung bình
- 1 ngày 30 phút
- Pull request đã merge (30 ngày)
- 41
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của duckdb/duckdb-python
-
Type stubs omit the `connection` keyword on module-level `read_json` and `write_csv`Có thể đã có người làm @tojacob03 đã nhận 20 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 90/100
duckdb/duckdb-python#627 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
`read_json` accepts a list of paths at runtime but the type stub only allows a single path.Có thể đã có người làm @aleks-drozy đã nhận 78 ngày trước. Đang mởneeds triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
duckdb/duckdb-python#576 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Missing ROW_GROUPS_PER_FILE argument in write_parquet functionCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởneeds triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
duckdb/duckdb-python#386 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
duckdb/duckdb-python#691 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 3/5 Nửa ngày Mức phù hợp với người mới 45/100
duckdb/duckdb-python#666 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của duckdb/duckdb-python
Issue tương tự
-
get_page_thumbnail modifies cached page images, affecting later thumbnails and picture exportsĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
docling-project/docling-mcp#147 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 80/100
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
autowarefoundation/autoware_carla_scenario#405 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 79/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
mohitmishra786/readprism#322 ·
Maintainer thường phản hồi trong vòng 1 ngày