概述
2026 年 7 月 22 日,DuckDB 团队发布了 DuckDB 1.5.5——这是 1.5 (Variegata) 系列的第六个补丁版本。虽然官方公告简洁地将其描述为"bugfixes and performance improvements",但从 GitHub 的完整变更日志来看,这次更新涵盖了 超过 50 个 PR,涉及安全性、性能、稳定性等多个维度。

安全补丁:修复多个越界读取漏洞
本次更新最引人注目的部分是 多项安全修复。DuckDB 团队修复了数个可能导致越界读取(out-of-bounds read)的安全漏洞:
JSON 路径越界读取
由 @jmestwa-coder 修复的 fix out-of-bounds read in json path ReadKey lookahead 问题。当 DuckDB 解析复杂的 JSON 嵌套结构时,如果 JSON 路径查询超出实际数据边界,可能导致内存越界访问。
-- 演示 JSON 路径查询的安全处理
SELECT json_extract('{"a": {"b": 1}}', '$.a.b.c.d') AS safe_result;
-- 1.5.5 之前:可能触发未定义行为
-- 1.5.5 之后:安全返回 NULL 或抛出明确错误
字符串转换越界读取
同一位贡献者还修复了 fix out-of-bounds read in string to struct cast 和 fix out-of-bounds read in dictionary string decompression 两个问题。这些漏洞在处理特殊编码字符串或字典压缩数据时可能被触发。
其他安全修复
fix out-of-bounds read on empty byte array decimals— 空字节数组的十进制处理backport the out-of-bounds security fixes made in #23100— 从主分支回溯移植的安全修复
建议所有生产环境用户立即升级至 1.5.5。
核心性能改进
Parquet 处理优化
DuckDB 在 1.5.5 中对 Parquet 文件处理进行了多项改进:
- 拒绝不一致的 DATA_PAGE_V2:
parquet: reject DATA_PAGE_V2 pages with inconsistent compressed_page_size - 修复 RLE 损坏误报:
Fix false RLE corruption error - 改进 RLE 损坏错误消息:
Improve rle corruption error messages - 修复行组过滤后的聚合统计:
Fix min/max aggregate stats when row groups filtered - 修复 128 位 DECIMAL 交换问题:
Fix swapped min/max for multi-row-group 128-bit DECIMAL in RETURN_STATS
-- 示例:利用改进的 Parquet 统计信息加速查询
CREATE TABLE parquet_stats AS
SELECT * FROM parquet_scan('s3://bucket/data/*.parquet')
WHERE date >= '2026-01-01';
-- 1.5.5 中的 min/max 统计更准确,分区裁剪更高效
内存管理改进
- 修复 TemporaryMemoryManager 死锁:
Fix deadlock in TemporaryMemoryManager— 这是一个严重问题,在高并发场景下可能导致数据库挂起 - 修复外部哈希聚合段错误:
Fix segfault in external hash aggregate when radix bits grow after going external— 大数据集排序分组不再崩溃 - 修复缓存驱逐节点内存泄漏:
Fix eviction node memleak when external file write fails
# Python 示例:内存管理改进后的大数据处理
import duckdb
con = duckdb.connect(":memory:", config={
'temp_directory': '/tmp/duckdb_temp',
'max_memory': '8GB',
'threads': '4'
})
# 1.5.5 中,即使临时写入失败也不会泄漏内存
result = con.execute("""
SELECT category, SUM(revenue)
FROM read_parquet('large_dataset/*.parquet')
GROUP BY category
ORDER BY SUM(revenue) DESC
""").fetchdf()
功能增强
窗口函数改进
@hawkfish 贡献了三个重要的窗口函数修复:
- 有序 FIRST_VALUE 边框处理:
Issue #23457: Ordered FIRST_VALUE Framing - CUME_DIST 下溢修复:
Issue #23641: CUME_DIST Underflow - RANGE ZERO 边界情况:
Issue #23664: RANGE ZERO
-- 示例:改进的窗口函数行为
SELECT
date,
revenue,
FIRST_VALUE(revenue) OVER (
ORDER BY date
RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW
) AS week_first,
CUME_DIST() OVER (ORDER BY revenue) AS revenue_rank
FROM sales_data;
Common Aggregate CTEs
新增了对公共表表达式中聚合函数的支持:Issue #23383: Common Aggregate CTEs。这允许你在 CTE 中预聚合数据,然后在后续查询中进一步操作。
-- Common Aggregate CTE 示例
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) AS month,
SUM(amount) AS total_sales,
COUNT(*) AS order_count
FROM orders
GROUP BY DATE_TRUNC('month', order_date)
)
SELECT
month,
total_sales,
SUM(total_sales) OVER (ORDER BY month) AS cumulative_sales
FROM monthly_sales;
Variant 类型改进
- 正确获取完全展平 variant 的类型值统计:
Correctly get typed value stats for fully shredded variants - Lambda 绑定传播到 try 运算符:
Propagate lambda bindings into try operator - 正确提升 SUGGEST_NEW 到 REQUIRE_NEW:针对 variant / geometry 列
扩展生态更新
1.5.5 同时更新了多个核心扩展:
| 扩展 | 更新内容 |
|---|---|
| Iceberg | 版本提升,支持更多特性 |
| Unity Catalog | 包含回填修复 |
| HTTPFS | 请求体长度日志、传输错误显示 |
| Postgres/MySQL/SQLite | 兼容性更新 |
| Lance | Rust 1.97 构建修复 |
| Quack | 升级到最新 HEAD |
| DuckLake | 版本提升 |
-- HTTPFS 扩展改进:更好的错误诊断
INSTALL httpfs;
LOAD httpfs;
-- 现在可以看到请求体长度和传输错误
SELECT * FROM read_json_auto('https://api.example.com/data.json');
-- 日志中会显示请求体长度和任何传输错误
ADBC 与 CAPI 改进
- ADBC URI 方案支持:
[ADBC] Add support for duckdb:// URI scheme in URI option - ADBC Statistics API 支持:
fix(adbc): support the ADBC Statistics API - CAPI 标量子查询崩溃修复:
Fix/capi scalar bind subquery crash - CAPI 缺失语句类型:
Add missing statement types to capi
# ADBC duckdb:// URI 方案示例
import adbc_database
import adbc_dbapi
with adbc_database.open("duckdb://my_database.db") as database:
with adbc_dbapi.connect(database) as connection:
with connection.cursor() as cursor:
cursor.execute("SELECT version()")
print(cursor.fetchone())
并发与事务改进
- 修复并发 ALTER + INSERT 崩溃:
Fix concurrent ALTER and INSERT crash— 这是高并发场景下的关键修复 - 修复 DROP COLUMN 元数据损坏:
Fix DROP COLUMN corrupting per-column metadata block bookkeeping - 依赖管理器改进:
Register oid of dependencies in the DependencyManager和Use correct start time when verifying dependencies
-- 1.5.5 中,以下并发操作不再导致崩溃
BEGIN;
ALTER TABLE my_table ADD COLUMN new_field VARCHAR;
INSERT INTO my_table VALUES (1, 'data');
COMMIT;
升级指南
安装 DuckDB 1.5.5
# pip 安装
pip install duckdb==1.5.5
# Conda 安装
conda install -c conda-forge duckdb=1.5.5
# CLI 安装
curl -L https://github.com/duckdb/duckdb/releases/download/v1.5.5/duckdb_cli-linux-amd64.zip -o duckdb.zip
unzip duckdb.zip
chmod +x duckdb
验证安装
import duckdb
print(duckdb.__version__) # 应输出 1.5.5
与传统数据库对比
| 特性 | DuckDB 1.5.5 | PostgreSQL | MySQL | Pandas |
|---|---|---|---|---|
| 安装复杂度 | 零依赖,单二进制 | 需配置服务端 | 需配置服务端 | 需 Python 环境 |
| 并行执行 | 自动多线程 | 有限并行 | 有限并行 | 单线程 |
| Parquet 原生支持 | ✅ 直接查询 | ❌ 需扩展 | ❌ 需扩展 | ✅ 通过 pyarrow |
| JSON 处理 | 完整路径查询 | JSONB | JSON | ✅ 通过 json 模块 |
| 内存占用 | 按需分配 | 连接级分配 | 连接级分配 | 全量加载 |
| 安全补丁频率 | 每个补丁版本 | 季度更新 | 季度更新 | N/A |
| 窗口函数 | 完整 SQL 标准 | 完整 | 部分 | 需手动实现 |
变现建议
对于企业用户和数据团队,DuckDB 1.5.5 的升级带来以下商业价值:
1. 降低基础设施成本
通过更高效的 Parquet 处理和内存管理,相同查询可在更少资源上完成。对于日均 TB 级数据分析的团队,预计可节省 20-40% 的计算成本。
2. 提高数据管道可靠性
修复并发 ALTER + INSERT 崩溃和 TemporaryMemoryManager 死锁问题,意味着 ETL 管道的失败率将显著降低。对于依赖定时数据管道的业务,每次管道失败可能意味着 数千美元的业务损失。
3. 安全合规
修复多个越界读取漏洞对于需要满足安全审计要求的企业至关重要。在金融、医疗等受监管行业,未及时修补的安全漏洞可能导致合规罚款。
4. 加速分析洞察
改进的窗口函数性能和 Common Aggregate CTEs 支持,使得复杂分析查询的执行速度更快。数据分析师可以更快地迭代分析方案,将洞察产出时间从小时级缩短到分钟级。
5. 无缝迁移
对于正在使用 PostgreSQL/MySQL 进行 OLAP 分析的团队,1.5.5 的 CAPI 和 ADBC 改进使得迁移更加平滑。可以先用 DuckDB 做分析层,再逐步迁移核心负载。
总结
DuckDB 1.5.5 虽然是一个补丁版本,但其涵盖的内容远不止"修修 bug"那么简单。从安全修复到性能优化,从窗口函数改进到并发处理增强,这个版本为生产环境用户提供了重要的稳定性和安全性提升。
强烈建议所有运行 1.5.x 系列的用户尽快升级。
完整变更日志:GitHub Releases v1.5.5 安装指南:DuckDB Installation