DuckDB v2.0 führt einen neuen PEG-basierten SQL-Parser ein und ersetzt damit den vom PostgreSQL abgeleiteten Parser, der seit dem ersten Commit des Projekts im Jahr 2018 verwendet wurde. Der bisherige mit Bison generierte LALR(1)-Parser wurde aufgrund von Shift/Reduce- und Reduce/Reduce-Konflikten zunehmend schwieriger zu erweitern, während sich Duck SQL weiterentwickelte. Der neue Parser, der mit Parsing Expression Grammars erstellt wurde, beseitigt diese Konflikte durch explizite Anordnung der Alternativen und ermöglicht Erweiterbarkeit zur Laufzeit.
Der Parser verarbeitet SQL-Abfragen in drei Stufen: Tokenizer, Parser und Transformer. Der Tokenizer zerlegt die Eingabe in Tokens wie Schlüsselwörter und Bezeichner. Der Parser validiert die Syntax anhand der Duck-SQL-Grammatik und erzeugt einen Parse-Baum. Der Transformer wandelt diesen in das interne AST von DuckDB für den Binder um.
Die Entwicklung begann mit einem Forschungsprototyp, der nur eine Teilmenge von SQL verarbeiten konnte. Er wurde schrittweise erweitert und als experimentelle Funktion in DuckDB v1.5 eingeführt. Die vollständige Grammatik unterstützt nun alle Anweisungs- und Ausdruckstypen, korrekte Operatorpräzedenz, ordnungsgemäße Schlüsselwortklassifizierung und Kompatibilität mit bestehenden AST-Strukturen.
Während sich die Implementierung erheblich ändert, bleibt Duck SQL selbst unverändert. Der neue Parser verbessert auch die Fehlerberichterstattung und bietet besseren Kontext bei Syntaxfehlern. Dieser Übergang entspricht ähnlichen Schritten anderer Systeme wie Python 3.9, das ebenfalls PEG-basiertes Parsen für mehr Flexibilität übernommen hat.
Quelle: Hacker News · Zusammengefasst von HeadlinesBriefing