TECHNOLOGY
DuckDB 2.0.0 LTS released with server mode, triggers and a new SQL parser
The DuckDB team has released version 2.0.0, a long-term support release built from close to 20,000 commits since 1.5. It adds a polished Quack client-server protocol, asynchronous I/O, a VARIANT type, triggers and an agent mode for the CLI.
Image: DuckDB
The DuckDB team has released DuckDB 2.0.0, codenamed "Cinnamon Teal" after a reddish-brown duck found in the western Americas. The team calls it its biggest feature release so far, built from close to 20,000 commits since DuckDB 1.5. It is a long-term support (LTS) release, supported until at least October 2027.
The team says DuckDB 1.0 was about stability and backward compatibility, while 2.0 is mainly about new features.
The biggest change is that DuckDB can now run as a server. DuckDB has always been an in-process database, meaning it runs inside your own application. The Quack protocol, first introduced in version 1.5.3 in May, lets any DuckDB process serve its databases to clients. Version 2.0 polishes it with performance and stability improvements and adds a CONNECT statement that attaches and switches to a remote database in one command.
CONNECT is not limited to Quack. It also works with other remote databases that support it, including PostgreSQL and MySQL. For these, a new remote pushdown optimizer sends queries to the remote server instead of pulling whole tables over the network. By default a Quack server listens only on localhost. To accept outside connections, the team advises putting it behind a TLS-terminating reverse proxy. The CLI also gets new -serve and -connect arguments for quick setups.
On speed, DuckDB 2.0 adds asynchronous I/O for reading Parquet and CSV files. Reads now happen in the background, with many requests in flight at once. The team says this means far more parallelism for remote reads and much faster queries on object storage such as s3://.
The VARIANT type is now fully integrated. It stores semi-structured data, like JSON, where each row can have a different shape. Unlike JSON, it is not stored as text. DuckDB 2.0 finds the common structure in the data and "shreds" it into separate pieces, so it compresses better and runs faster. This also covers reading and writing VARIANT in Parquet, with a family of variant_* functions.
The CLI has a new agent mode for coding agents such as Claude Code, Codex and Cursor. When it detects an agent is running it, it prints compact Markdown tables, says when a result was truncated, stops runaway queries early and reports errors as JSON. Long queries show their expected cost before running. In the team's own TPC-H experiments, agent mode cut the output the model had to read by 59%. You can force it on with -agent or off with -no-agent.
DuckDB's own PEG-based parser is now the default SQL parser, replacing the one derived from PostgreSQL's. PEG stands for parsing expression grammar. It tries alternatives in the order they are written, so new syntax is less likely to clash with existing rules. Extensions can now hook into the grammar and add new SQL syntax, and error messages show precise source locations. The team says the swap should be invisible. If it is not, you can go back with SET enable_legacy_parser = true.
Extension authors get a revamped C API v2 that exposes components such as file systems and table functions. The team wants field feedback before marking it stable. Organizations can also host and sign their own extension repositories. This feature is still a work in progress and its syntax may change.
SQL gains triggers, including BEFORE and AFTER triggers, FOR EACH ROW and FOR EACH STATEMENT, and transition tables. A classic use is audit tables that record what changed. Some combinations are not yet supported, and the team points to its limitations page. Triggers can also maintain materialized views step by step, which the team describes as one step closer to full materialized views.
Other SQL additions include the $variable shorthand, data-modifying CTEs, NEAREST joins for similarity search, nested schemas and JSON mutation functions such as json_set and json_remove. DuckDB 2.0 also supports FETCH FIRST and UNNEST in GROUP BY.
The team lists a small set of breaking changes. The main one is storage: versions before 2.0 cannot read database files created by DuckDB 2.0. Version 2.0 can still read and write existing files, and those stay readable by older versions. The team recommends testing on a shadow system first. For mission-critical workloads, it suggests waiting for the first patch release, due in November.
Other changes: DuckDB now needs a C++17 compiler, and release builds use Clang by default. The ICU library is gone, with the icu extension now handling timezones, calendars and collations itself. The old single-arrow lambda syntax (x -> x + 1) is disabled by default and will be removed in v2.1. Amalgamation builds are deprecated, and macOS x86_64 support will end in DuckDB 2.1.
The CLI and Python clients are available now. Other clients, such as Go, R and Java, and some extensions may take a few days. Version 1.4 stays supported until late November 2026, and version 1.5 is extended until March 2027.