DuckDB v2.0 sustituye su analizador SQL por uno basado en PEG

Fuentes: DuckDB v2.0: Your Database Deserves a Better Parser

DuckDB v2.0 reemplaza el analizador sintáctico (parser) SQL derivado de PostgreSQL que utilizaba desde su primer commit en 2018 por uno nuevo basado en PEG (Parsing Expression Grammars). El cambio no altera el dialecto SQL que acepta DuckDB —al que los autores denominan informalmente DuckSQL y que mantiene una fuerte influencia de PostgreSQL—, sino únicamente el mecanismo interno que decide si una consulta es sintácticamente válida antes de pasar al binder y al optimizador.

El parser original se apoyaba en una gramática YACC/Bison que generaba un analizador LALR(1). Con el tiempo, añadir nuevas construcciones como GROUP BY ALL o SELECT * EXCLUDE (...) resultaba cada vez más complejo: pequeñas modificaciones provocaban conflictos shift/reduce o reduce/reduce entre reglas. En 2024 el equipo publicó un artículo de investigación en CIDR donde exploraba el uso de PEG como base para un parser extensible en tiempo de ejecución, inicialmente como prototipo capaz de procesar solo un subconjunto del lenguaje.

La nueva gramática define reglas ordenadas —por ejemplo SelectFrom <- SelectFromClause / FromSelectClause— en las que la primera alternativa que coincide gana, lo que elimina los conflictos típicos de LALR. PEG ya se introdujo como prototipo en DuckDB v1.2 para el autocompletado del CLI y se habilitó como función experimental opcional en v1.5. En v2.0 se convierte en el parser de producción, capaz de aceptar todo DuckSQL y producir el mismo AST que espera el resto del sistema. Como referencia análoga, el artículo menciona que Python también migró de un parser LL(1) a uno basado en PEG en la versión 3.9 por la misma flexibilidad para ampliar el lenguaje.