DuckDB v2.0 introduce un nuevo analizador SQL basado en PEG, reemplazando el analizador derivado de PostgreSQL utilizado desde el primer commit del proyecto en 2018. El anterior analizador LALR(1) generado con Bison se volvió cada vez más difícil de extender debido a los conflictos shift/reduce y reduce/reduce a medida que evolucionaba Duck SQL. El nuevo analizador, construido con Gramáticas de Expresión de Análisis (Parsing Expression Grammars), elimina estos conflictos al ordenar explícitamente las alternativas y permite la extensibilidad en tiempo de ejecución.
El analizador procesa las consultas SQL en tres etapas: tokenizador, analizador y transformador. El tokenizador divide la entrada en tokens como palabras clave e identificadores. El analizador valida la sintaxis contra la gramática de Duck SQL, produciendo un árbol de análisis. El transformador lo convierte en el AST interno de DuckDB para el binder.
El desarrollo comenzó con un prototipo de investigación que solo manejaba un subconjunto de SQL. Se amplió incrementalmente y se introdujo como una característica experimental en DuckDB v1.5. La gramática completa ahora admite todos los tipos de sentencias y expresiones, la precedencia correcta de operadores, la clasificación adecuada de palabras clave y la compatibilidad con las estructuras AST existentes.
Si bien la implementación cambia significativamente, Duck SQL en sí permanece sin cambios. El nuevo analizador también mejora los informes de errores, proporcionando mejor contexto para los fallos de sintaxis. Esta transición coincide con movimientos similares de otros sistemas como Python 3.9, que también adoptó el análisis basado en PEG para mayor flexibilidad.
Fuente: Hacker News · Resumido por HeadlinesBriefing