TL;DR:DuckDB 团队正式发布 DuckDB 2.0.0 LTS 版本,代号为“Cinnamon Teal”(Spatula cyanoptera)。该版本基于自 DuckDB 1.5 以来的近 20,000 次代码提交构建,引入了成熟的 Quack 协议、异步 I/O、一等公民的 VARIANT 类型、Agent Mode、触发器及可扩展 SQL 解析器等核心特性。

与侧重稳定性和向后兼容性的 DuckDB 1.0 不同,DuckDB 2.0 是一个以功能增强为主的版本。目前有三条 DuckDB 支持线路并行:DuckDB 2.0 作为长期支持 (LTS) 版本,维护期至少持续至 2027 年 10 月;前一代 LTS 版本 1.4 支持至 2026 年 11 月底;为确保平滑过渡,DuckDB 1.5 的支持期延长至 2027 年 3 月,实质上转化为 LTS 版本。
DuckDB 服务器化与 Quack 协议
DuckDB 长期以来定位为嵌入式数据库,但在 2.0 中,通过引入并优化 Quack 协议,实现了传统的客户端-服务器架构运行模式。任何 DuckDB 进程均可通过 quack 扩展提供数据库服务。
DuckDB 2.0.0 对 Quack 协议进行了性能与稳定性优化,并新增 CONNECT 语句,允许用户在单一命令中连接并切换至远程数据库:
-- 在 DuckDB 服务器上
CALL quack_serve(token = 'my_token');
CREATE TABLE events (date DATE, name VARCHAR);
INSERT INTO events VALUES ('2027-04-07', 'DuckCon #8');
-- 在 DuckDB 客户端
ATTACH 'quack:localhost' AS qk (TOKEN 'my_token');
CONNECT qk;
SELECT * FROM events;
默认情况下,Quack 服务器仅监听 localhost。若需接受外部连接,建议将服务器置于 TLS 终止反向代理之后。CONNECT 语句不仅限于 Quack 协议,也支持 PostgreSQL 和 MySQL 等远程数据库,新的远程推送优化器可将查询直接发送至远程服务器执行。
CLI 工具同步更新了快捷参数:-serve 用于启动 Quack 服务器,-connect 用于直接连接服务器。
性能改进
异步 I/O
DuckDB 2.0 为 Parquet 和 CSV 文件读取引入了异步 I/O 机制。I/O 层现独立于查询处理层进行扩展,能够在后台发出读取请求并保持多个请求并发。这一改动显著提升了远程读取的并行度,加速了针对对象存储(如 s3://)的查询速度。
VARIANT 类型成为一等公民
VARIANT 类型用于存储无模式的半结构化数据(如 JSON),同时保持列式执行的性能优势。虽然 DuckDB 1.5 已引入该类型,但 2.0 实现了完全集成,能够自动检测数据中的常见结构并进行“碎片化”处理,支持从存储到 Parquet 读写的全链路执行及 variant_* 函数家族。
CREATE TABLE events (payload VARIANT);
INSERT INTO events VALUES
('{"user": {"id": 42, "tags": ["a", "b"]}}'::JSON::VARIANT),
('{"event": "click", "x": 10, "y": 20}'::JSON::VARIANT);
SELECT variant_type(payload), variant_keys(payload) FROM events;
CLI Agent Mode
针对 Claude Code、Codex 和 Cursor 等编码代理频繁调用 DuckDB CLI 的场景,2.0 版 CLI 新增了 Agent Mode。当检测到被代理运行时,CLI 会自动切换输出格式:使用紧凑的 Markdown 表格替代填充框,明确标识截断结果,提前停止失控查询,并以 JSON 格式报告错误。长时间运行的 SQL 查询会在执行前报告预期成本,供代理决策。实验数据显示,Agent Mode 使 TPC-H 测试中的输出量减少了 59%。用户可通过 -agent 或 -no-agent 标记手动控制此模式。
可扩展性增强
全新 PEG SQL 解析器
DuckDB 弃用了源自 PostgreSQL 的传统解析器,转而采用基于 PEG(解析表达文法)的现代可扩展解析器。新解析器支持扩展连接到语法本身,并提供带有精确源位置的错误消息。旧解析器自 2018 年起使用 YACC/Bison 生成 LALR(1) 解析器,随着 SQL 方言演进,规则冲突风险增加。PEG 语法通过按顺序尝试替代词避免了此类冲突,类似于 Python 3.9 迁移至 PEG 解析器的做法。用户可通过 SET enable_legacy_parser = true 临时回退至旧解析器。
自定义扩展仓库托管
DuckDB 2.0 更新了 C API v2,增强了文件系统与表函数的扩展能力。同时,用户可注册并托管可信的扩展存储库,使组织能够发布和签名自己的扩展:
SET allow_extension_repositories = 'allowed';
CREATE EXTENSION REPOSITORY my_repo
WITH PREFIX 'https://extensions.example.org';
INSTALL AND LOAD my_ext FROM my_repo;
该功能仍在开发中,语法可能在未来版本调整。
核心扩展更新
- DuckLake 1.1:发布了新规范及参考实现。
- Iceberg 扩展:旨在成为功能齐全的实现,新增 REST 目录 ATTACH 选项,支持从元数据位置文件导出表位置,并可控制 URL 前缀与命名空间分隔符。
- Delta 扩展:支持使用 CREATE TABLE 创建 Delta 表(含分区与属性),支持时间旅行,并改进了 VARIANT 支持。
SQL 特性
触发器支持
DuckDB 2.0 引入 CREATE TRIGGER 语句,支持 BEFORE/AFTER、行级/语句级触发器,以及通过 REFERENCING OLD/NEW TABLE 访问转换表。典型用例包括审计表记录变化。部分组合场景(如 BEFORE UPDATE FOR EACH ROW)暂不支持。触发器也被用于逐步维护物化视图,例如通过插入和删除操作分别更新总和与计数。
CREATE TRIGGER trg_audit
AFTER UPDATE ON target
REFERENCING OLD TABLE AS o NEW TABLE AS n
FOR EACH STATEMENT
INSERT INTO audit
SELECT n.id, o.val, n.val
FROM o JOIN n ON o.id = n.id;
SQL 方言扩展
- 支持
$variable简写形式替代getvariable('x')。 - 数据修改 CTEs 允许将 INSERT、UPDATE、DELETE 和 COPY 作为管道步骤。
- Top-k 相似性搜索转换为 Join 子句,便于向量与嵌入工作负载。
- 支持嵌套方案(Schema in Schema),如
finance.reports。 - 新增 JSON 突变函数:
json_set,json_insert,json_replace,json_remove。 - 支持 SQL 标准
FETCH FIRST,允许 GROUP BY 中使用 UNNEST,并确保 MERGE 和 UPDATE 在多行匹配时的语义精确性。
迁移与内部变更
DuckDB 2.0 包含少量突破性变化。最需要注意的是存储格式兼容性:2.0 之前的版本无法读取由 2.0 创建的数据库文件,但 2.0 仍可读写现有旧格式文件。建议在生产环境切换前于影子系统进行测试。对于任务关键型工作负载,官方建议等待 11 月份的首个补丁发布。
编译要求
DuckDB 2.0 不再依赖 C++11,现要求 C++17 编译器。Linux 和 macOS 上的 DuckDB 及其核心扩展默认使用 Clang 构建;Windows 上 CLI 使用 Clang,多数核心扩展仍使用 MSVC。
移除 ICU 依赖
时区感知的时间戳、日历和排序规则此前依赖 ICU 库。在 2.0 中,ICU 库被完全移除,相关功能由 icu 扩展原生实现,时区数据直接从 IANA 数据库构建并压缩至约 45 kB。原生实现速度更快且行为保持一致。
废弃项
- Lambda 语法:旧的单箭头语法 (
x -> x + 1) 默认禁用,推荐使用 Python 风格语法 (lambda x: x + 1)。旧语法将在 v2.1 中彻底移除。 - Amalgamation Builds:由于体积过大,合并源代码构建方式已被弃用。
- macOS x86_64 支持:正在逐步淘汰
osx_amd64平台支持。目前 DuckDB 及核心扩展仍受支持,但社区扩展不再为该平台构建。DuckDB 2.1 将停止支持该平台。





