使用 PEG 的运行时可扩展 SQL 解析器

Hannes Mühleisen 和 Mark Raasveldt 的研究:

  • 背景:解析器在数据系统中虽核心但未受关注,现有系统仍用古老解析器生成器,导致解析器单一、不灵活且影响创新和用户体验。
  • 现状:SQL 规范不断增长,各系统多使用静态解析器(如基于 YACC 风格的工具),其技术可追溯到 20 世纪 60 年代,限制了系统扩展性。数据库系统正走向生态系统,社区扩展受限。
  • 解决方案:提出重新设计数据管理系统解析器,创建现代可扩展解析器,允许在运行时动态配置接受的语法,如支持新语句、添加新查询语言等。
  • PEG 解析器:一种更现代的解析方法,自顶向下,通过“packrat”记忆化技术实现线性时间复杂度,具有选择操作符等特点,优势包括无需编译步骤、更好的错误处理等,但可能需要较多内存。
  • 实验验证:实现实验性 PEG 解析器,用于解析 TPC-H 和 TPC-DS 查询。实验表明,使用cpp-peglib解析器时解析性能约慢 10 倍,但绝对耗时仍短,且优化空间大。通过实验展示了在解析器中添加新语句(如UNPIVOT)、扩展SELECT语法(如支持 SQL/PGQ 图匹配模式)和改善错误消息的过程。
  • 结论与未来工作:提议用 PEG 现代化 SQL 解析,下一步解决性能问题和细节问题,计划将 DuckDB 的解析器切换为 PEG 解析器,并已进行相关实验。
  • 致谢:感谢 Torsten Grust、Gábor Szárnyas、Daniël ten Wolde 的建议和 Carlo Piovesan 对 Postgres YACC 语法到 PEG 的翻译。
阅读 19
0 条评论