DuckDB v2.0 は、新しい PEG ベースの SQL パーサーを導入し、2018 年のプロジェクト初回コミット以来使用されてきた PostgreSQL 由来のパーサーを置き換えます。従来の Bison が生成する LALR(1) パーサーは、Duck SQL の進化に伴い、shift/reduce および reduce/reduce の競合により拡張がますます困難になっていました。Parsing Expression Grammars を用いて構築された新しいパーサーは、選択肢を明示的に順序付けることでこれらの競合を解消し、ランタイムでの拡張性を実現します。
パーサーは、トークナイザー、パーサー、トランスフォーマーの 3 つの段階で SQL クエリを処理します。トークナイザーは入力をキーワードや識別子などのトークンに分割します。パーサーは Duck SQL の文法に照らして構文を検証し、構文木を生成します。トランスフォーマーはそれをバインダー用の DuckDB 内部 AST に変換します。
開発は、SQL のサブセットのみを扱う研究プロトタイプから始まりました。それは段階的に拡張され、DuckDB v1.5 で実験的機能として導入されました。完全な文法は現在、すべてのステートメントおよび式の型、正しい演算子の優先順位、適切なキーワード分類、既存の AST 構造との互換性をサポートしています。
実装は大きく変わりますが、Duck SQL 自体は変更されません。新しいパーサーはエラー報告も改善し、構文エラーに対してより良いコンテキストを提供します。この移行は、より高い柔軟性のために PEG ベースの構文解析を採用した Python 3.9 など、他のシステムによる同様の動きと一致しています。
出典: Hacker News · 要約:HeadlinesBriefing