DuckDB 团队正式宣布发布 DuckDB 2.0.0 LTS(长期支持)版本,代号“Cinnamon Teal”。这是该数据库迄今为止功能最丰富的版本,自 1.5 版本以来累计近 20,000 次提交。DuckDB 2.0 将作为 LTS 版本获得至少至 2027 年 10 月的支持。

产品线与支持策略

随着 2.0 的发布,DuckDB 目前维持三条产品线:DuckDB 2.0(LTS,支持至 2027 年 10 月)、DuckDB 1.4(LTS,支持至 2026 年 11 月下旬)以及因过渡需要而延长支持期至 2027 年 3 月的 DuckDB 1.5。

核心功能升级

Quack 协议与客户端-服务器模式

DuckDB 2.0 大幅改进了 Quack 协议的性能与稳定性,并引入新的 CONNECT 语句,允许通过单命令附加并切换到远程数据库。该语句不仅适用于 Quack,还兼容 PostgreSQL 和 MySQL,配合远程下推优化器,可直接将查询发送至远程服务器而非拉取全表数据。CLI 新增 -serve 和 -connect 参数,简化了本地测试环境的搭建。

异步 I/O 与性能优化

针对 Parquet 和 CSV 文件读取,2.0 引入了异步 I/O 机制。I/O 层独立于查询处理层扩展,可在后台并发处理多个读取请求,显著提升了在 S3 等对象存储上的查询速度。

VARIANT 类型全面集成

VARIANT 类型在 2.0 中实现全面集成,用于高效存储半结构化数据(如 JSON)。系统会自动检测数据结构并进行“拆解”,以实现列式执行的高压缩率和快速查询,支持端到端的拆解读写及一系列 variant_* 函数。

Agent 模式

为适配 Claude Code、Cursor 等 AI 编程助手,CLI 新增 Agent 模式。检测到 Agent 运行时,系统将输出紧凑的 Markdown 表格,提前终止失控查询,并以 JSON 格式报告错误。实验显示,该模式可使模型需处理的输出量减少 59%。

PEG 解析器成为默认值

基于 PEG 的现代可扩展解析器取代了源自 PostgreSQL 的旧解析器,成为默认选项。新解析器支持扩展挂钩语法,提供更精确的错误位置信息,并避免了传统 LALR(1) 解析器的冲突问题。用户仍可通过 legacy_parser 扩展回退至旧解析器。

触发器支持

DuckDB 2.0 正式支持 SQL 触发器,包括 BEFORE/AFTER、FOR EACH ROW/STATEMENT 等类型,支持转换表及 RETURNING 子句。触发器可用于审计日志或增量维护物化视图。

自定义扩展仓库

企业现可注册和托管可信扩展仓库,通过 RSA 公钥签名确保安全性,使内部扩展能像内置扩展一样安装加载。该功能目前处于进行中状态,语法未来可能调整。

生态与扩展更新

  • DuckLake 1.1:发布新规范及参考实现。
  • Iceberg 扩展:增加 REST 目录 ATTACH 选项,支持从命名空间或元数据文件加载表信息。
  • Delta 扩展:支持通过 CREATE TABLE 创建 Delta 表,包含分区、时间旅行及改进的 VARIANT 支持。

破坏性变更与迁移指南

存储格式兼容性:DuckDB 2.0 创建的数据库文件无法被旧版本读取。虽然 2.0 可读写旧文件,但建议在生产环境升级前进行影子测试,关键业务可等待后续补丁版本。

编译与环境要求:

  • 编译器要求提升至 C++17。
  • Linux 和 macOS 上的发布构建默认切换至 Clang;Windows CLI 使用 Clang,核心扩展仍多用 MSVC。
  • 移除对 ICU 库的依赖,时区、日历和排序规则由 icu 扩展本机实现,时区数据压缩至约 45 kB。

语法与平台调整:

  • 旧式单箭头 Lambda 语法(x -> x + 1)默认禁用,改用 Python 风格(lambda x: x + 1),该旧语法将在 v2.1 中彻底移除。
  • 弃用捆扎构建(amalgamation build)。
  • 逐步淘汰 osx_amd64 平台支持,社区扩展已停止为该平台构建,DuckDB 2.1 将完全停止支持。

此外,2.0 还支持 SQL 标准的 FETCH FIRST,允许在 GROUP BY 中使用 UNNEST,并明确了 MERGE 和 UPDATE ... FROM 在多行匹配下的语义。