DuckDB 2.0.0 LTS вышла: протокол Quack, триггеры и режим для агентов

DuckDB 2.0.0 LTS вышла: протокол Quack, триггеры и режим для агентов

Команда DuckDB объявила о выходе DuckDB 2.0.0 LTS с кодовым именем «Cinnamon Teal» (в честь красно-коричневой утки Spatula cyanoptera из запада Америки). Релиз собран из почти 20 000 коммитов со времён DuckDB 1.5. Авторы называют его своим самым крупным по числу функций релизом на сегодня: если DuckDB 1.0 был про стабильность и обратную совместимость, то 2.0, прежде всего релиз новых возможностей.

Доступность и поддержка. CLI и Python-клиент уже доступны; остальные клиентские библиотеки (например, Go, R, Java) и часть расширений могут выйти через несколько дней из-за дополнительных правок и раундов ревью. Сейчас поддерживаются три линии: DuckDB 2.0, релиз с долгосрочной поддержкой (LTS), поддержка минимум до октября 2027 года; прежняя LTS-версия 1.4 поддерживается до конца ноября 2026 года; поддержку DuckDB 1.5 продлили до марта 2027 года, фактически сделав и её LTS-релизом.

DuckDB как сервер. С первого дня DuckDB был встраиваемой (внутрипроцессной) базой. В версии 1.5.3, вышедшей в мае, появился протокол Quack и одноимённое расширение, реализующее собственный протокол DuckDB: любой процесс DuckDB может отдавать свои базы по сети. В 2.0.0 протокол доработан, заметно выросли производительность и стабильность, и добавлена команда CONNECT, которая подключает удалённую базу и переключает на неё сеанс одной командой. Сервер запускается через CALL quack_serve(token = ...), клиент делает ATTACH 'quack:localhost' и CONNECT. По умолчанию сервер слушает только localhost; чтобы принимать подключения с других машин, его оставляют на localhost за обратным прокси с TLS, а опция allow_other_hostname, выставляющая сервер напрямую, предназначена только для тестов. CONNECT работает не только с Quack, но и с любой удалённой базой, которая это поддерживает, включая PostgreSQL и MySQL; новый оптимизатор выталкивает запросы на удалённый сервер вместо вытягивания таблиц по сети. В CLI для этого есть аргументы -serve и -connect.

Асинхронный ввод-вывод. Для чтения Parquet, CSV и собственного формата хранения DuckDB слой ввода-вывода теперь масштабируется независимо от обработки запросов: чтения идут в фоне, несколько запросов находятся в полёте одновременно. Это даёт гораздо больше параллелизма при удалённом чтении и, по словам авторов, резко ускоряет запросы к объектному хранилищу вроде s3://. Подробности и график сетевой пропускной способности, в отдельном блоге.

Тип VARIANT. Он хранит полуструктурированные данные без схемы (вроде JSON), сохраняя колоночное исполнение; авторы называют его «JSON на стероидах»: в каждой строке могут быть данные разной формы, но это не текстовый формат. VARIANT появился ещё в 1.5, а в 2.0 интегрирован полностью: DuckDB находит общую структуру данных и «дробит» её (shredding), так что данные хорошо сжимаются и быстро обрабатываются, от исполнения прямо из хранилища до чтения и записи Parquet; есть семейство функций variant_*.

Режим агента в CLI. Авторы отмечают, что кодирующие агенты (Claude Code, Codex, Cursor) всё чаще работают с CLI DuckDB от имени пользователей. CLI версии 2.0 определяет, что его запустил агент, и включает режим агента: выводит компактные таблицы в Markdown вместо таблиц с рамками, явно сообщает об усечении результата, рано останавливает «убегающие» запросы и сообщает об ошибках в JSON. Долгие запросы заранее показывают ожидаемую стоимость, чтобы агент мог решить, ждать ли. В экспериментах на TPC-H режим агента сократил объём вывода DuckDB, который приходилось читать модели, на 59%. Включить режим вручную можно флагом -agent, выключить, флагом -no-agent.

Новый SQL-парсер. Прежний парсер, унаследованный от PostgreSQL, обслуживал DuckDB с первого коммита в 2018 году; его грамматика генерировалась YACC/Bison (LALR(1)), поэтому даже небольшие добавления могли вызывать конфликты с существующими правилами. Собственный расширяемый парсер на основе PEG, появившийся в 1.5 как опция, в 2.0 становится парсером по умолчанию. Расширения могут встраиваться в саму грамматику, то есть можно ждать расширений с совершенно новым SQL-синтаксисом; сообщения об ошибках теперь указывают точное место в запросе. Парсер задуман совместимым со старым; при проблемах авторы просят заводить issue, а вернуться к прежнему парсеру можно через расширение legacy_parser командой SET enable_legacy_parser = true;.

Расширения. Обновлён C API v2: он заметно мощнее предшественника и открывает расширениям такие компоненты, как файловые системы и табличные функции. Стабильным его пока не объявляют, команда хочет сначала проверить его в реальной работе и просит отзывов. Появилась возможность регистрировать собственные доверенные репозитории расширений: репозиторий, это имя, префикс URL и один или несколько открытых RSA-ключей, которыми подписаны расширения (команды CREATE EXTENSION REPOSITORY и INSTALL AND LOAD ... FROM). При создании DuckDB скачивает ключи, закрепляет их в определении репозитория и печатает SHA-256-отпечатки для сверки. Функция ещё в разработке, синтаксис может измениться.

Основные расширения. Выпущен DuckLake 1.1 с новой спецификацией и эталонной реализацией; расширение Iceberg получило новые опции ATTACH для REST-каталога и приближается к полной реализации; расширение Delta умеет создавать таблицы Delta через CREATE TABLE (с партиционированием и свойствами), поддерживает путешествия во времени и лучше работает с VARIANT.

Триггеры. В 2.0 появились триггеры: CREATE TRIGGER с BEFORE и AFTER, FOR EACH ROW и FOR EACH STATEMENT, таблицы переходов через REFERENCING OLD/NEW TABLE, несколько триггеров на событие, RETURNING для таблиц с триггерами и DROP TRIGGER. Классический случай, таблицы аудита, куда триггер записывает изменения. Некоторые сочетания, например BEFORE ... FOR EACH ROW и UPDATE ... FOR EACH ROW, пока не поддерживаются. Триггеры могут также инкрементально обновлять материализованные представления: в примере средний возраст по национальностям хранится вместе с суммой и счётчиком, а два триггера, на вставку и на удаление, пересчитывают их через MERGE.

Ключевые факты

  • DuckDB 2.0.0 LTS «Cinnamon Teal» собран из почти 20 000 коммитов со времён 1.5; авторы называют его своим самым крупным по числу функций релизом.
  • Протокол Quack (впервые в 1.5.3, в мае) позволяет любому процессу DuckDB работать сервером; новая команда CONNECT подключает удалённую базу, включая PostgreSQL и MySQL. По умолчанию сервер слушает только localhost.
  • Асинхронный ввод-вывод для Parquet, CSV и родного формата ускоряет, по словам авторов, запросы к объектному хранилищу вроде s3://; VARIANT полностью интегрирован, включая чтение и запись Parquet.
  • CLI сам определяет запуск агентом и включает режим агента: компактный Markdown, пометки об усечении, ошибки в JSON; на TPC-H объём читаемого моделью вывода снизился на 59%.
  • PEG-парсер становится основным (вернуть старый можно через legacy_parser), добавлены триггеры и собственные репозитории расширений; 2.0 поддерживается минимум до октября 2027 года.

Почему это важно

DuckDB, популярная аналитическая база, которая с первого дня была встраиваемой. Версия 2.0 добавляет клиент-серверный режим (Quack), быстрое чтение с объектного хранилища за счёт асинхронного ввода-вывода, полностью интегрированный тип для полуструктурированных данных и триггеры. Сами авторы противопоставляют релиз версии 1.0, которая была про стабильность: 2.0, прежде всего про новые возможности. Отдельно заметен режим агента в CLI: инструмент подстраивает вывод под кодирующих агентов, которые всё чаще им управляют.

Кому это важно

Аналитикам и дата-инженерам, работающим с Parquet, CSV и данными в s3://, а также тем, кто хранит JSON-подобные данные и хочет держать их в колоночном виде. Разработчикам, которым нужен сетевой доступ к одной базе DuckDB или единая точка подключения к PostgreSQL и MySQL через CONNECT. Авторам расширений (C API v2, собственные репозитории с подписью) и тем, кто пользуется DuckDB через агентов вроде Claude Code, Codex и Cursor.

Как это применить

Установка, на странице установки; CLI и Python уже доступны, клиенты Go, R, Java и часть расширений могут появиться через несколько дней. Версию 2.0 можно взять как LTS (поддержка минимум до октября 2027); если нужно время на переход, поддержку 1.5 продлили до марта 2027, а 1.4 поддерживается до конца ноября 2026. Для Quack: CALL quack_serve(token = ...) на сервере, ATTACH 'quack:...' и CONNECT на клиенте; наружу сервер выставляют только за обратным прокси с TLS. Если новый парсер что-то ломает, включите SET enable_legacy_parser = true; и заведите issue. Режим агента включается флагом -agent и отключается -no-agent. Лицензия и стоимость в тексте анонса не обсуждаются.

Можно ли доверять

Источник, официальный анонс на сайте проекта, написанный от лица команды DuckDB без указания отдельных авторов. Это самоописание релиза: оценки вроде «самый крупный релиз» и «резко быстрее на объектном хранилище» принадлежат авторам. Цифра 59% относится только к экспериментам на TPC-H и сравнивает объём вывода с режимом агента и без него; какая модель использовалась, не указано. Цифр производительности для асинхронного ввода-вывода, VARIANT и PEG-парсера в тексте нет, только отсылка к графику и отдельному блогу. Раздел анонса о несовместимых изменениях и миграции здесь не пересказан, его стоит прочитать в оригинале.

Риски и подводные камни

Замена парсера затрагивает весь SQL: авторы задумали его совместимым, но просят сообщать о расхождениях и оставляют откат через legacy_parser. Триггеры поддерживаются не во всех сочетаниях (например, BEFORE ... FOR EACH ROW и UPDATE ... FOR EACH ROW пока нет). C API v2 ещё не объявлен стабильным, а синтаксис собственных репозиториев расширений может измениться. Для Quack напрямую открывать сервер в сеть (allow_other_hostname) нельзя нигде, кроме тестов. Часть клиентов и расширений выйдет с задержкой в несколько дней, так что обновление стоит планировать с учётом того, что вы используете.

«Это наш самый крупный по числу функций релиз на сегодня.»

— Команда DuckDB, анонс DuckDB 2.0.0 LTS