Summary: DuckDB published a v2.0 preview codenamed Cyanoptera on August 17, with the formal release planned for fall after more than 10,000 commits since v1.5. The release replaces the SQL parser, raises the default storage format, rewrites the C API, and makes the Quack server extension stable. The article advises testing upgrades because files and maintained extensions are affected.
DuckDB put out a preview of v2.0 on August 17. The codename is “Cyanoptera”, a nod to the cinnamon teal — a reddish-brown duck found in the western Americas — and the real release is due this fall. More than 10,000 commits have piled up since v1.5 arrived in March. This goes well beyond adding features: a brand-new SQL parser, a new default storage format, a rewritten C API, and a handful of deliberate breaking changes. For a database that has stayed in-process from the very first day, the message is unmistakable — server mode is now the main event.
What Makes This a Major Release
The team does not dress it up: the version number is not ceremony. v2.0 swaps out the PostgreSQL-derived parser, raises the default storage format to 2.0, and rewrites the C API. Each of the three sits under the file formats and binary interfaces everything else rests on, so the authors would rather say so once than keep stacking features on shifting ground. Much of the material had already been announced in the “State of the Duck” talk at DuckCon #7; this post boils it down to a ten-item tour.
Running DuckDB as a Server
The change users will notice first is the quack extension reaching stable. Any DuckDB process can now serve its databases across the network, and another DuckDB connects over the native protocol using the new CONNECT syntax. Client/server mode has been a persistent request for years, and it is finally here: long-running services, shared access, centralized connection management — workloads that once meant wrapping DuckDB in something else now have a native answer. Triggers follow the same logic, offering row- and statement-level granularity plus OLD/NEW transition tables, which suits auditing and incremental sync on a long-lived service.
Additions at the SQL Layer
The dialect additions lean practical rather than exotic. Vector similarity search gains APPROX NEAREST joins, turning top-k into a single join clause. DML can now live inside CTEs: INSERT, UPDATE, DELETE, and COPY work as pipeline steps. Schemas nest. Variables get a $x syntax that fits anywhere an expression does. JSON documents can at last be modified in place, with json_set, json_insert, json_replace, and json_remove all present. Recursive CTEs pick up USING KEY aggregation, which is enough to express iterative algorithms in plain SQL. And a new VARIANT type lets semi-structured data be queried without shredding it into columns first.
Three Major Efforts Inside the Engine
Start with asynchronous I/O. The engine now reads and writes asynchronously throughout — Parquet went first, CSV and DuckDB’s own format followed, and asynchronous Parquet writes arrived alongside new MMAP and DIRECT_IO modes. The I/O layer can now scale separately from query processing, which explains why remote reads from object stores come out ahead.
Second, the parser. The PostgreSQL-derived parser is gone, replaced by a modern, extensible, PEG-based one: extensions can hook into the grammar itself, error messages report precise source locations, and the design aims at compatibility with the old syntax. A dedicated follow-up post on it appeared on August 20.
Third, storage format 2.0. Column metadata is loaded lazily, so wide tables open faster; DICT_FSST string compression is enabled by default; deletes take up less space; and corruption validation on read is substantially stricter. The ICU dependency has been removed outright — timezones, calendars, and collations now come built in from IANA data compressed to roughly 45 kB, and microbenchmarks run 2.2x to 2.6x faster.
As for raw speed, the rewritten recursive CTE engine finishes a million-edge single-source reachability query in 0.12 seconds, down from 4.90 — roughly 40x. The planner also learned to exploit partitioning in DuckLake, Iceberg, and Hive-partitioned Parquet, and row-group pruning now skips data across far more filter types, Parquet Bloom filters included.
Implications for Data Teams
Three takeaways. First, DuckDB is maturing from a laptop tool for analysts into something deployable: internal dashboards and agent backends that leaned on a stock PostgreSQL instance now have a lighter option. Second, the storage format and C API changes are big ones — test before upgrading, because existing database files and self-maintained extensions are both affected. Third, if only one thing sticks, let it be the direction: DuckDB wants to sit at every layer of your stack — laptop, object storage, and now the server.
