暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL数据库SQL解析器浅析

原创 chirpyli 2025-06-09
116

PostgreSQL 的 SQL 解析器实现基于 Flex + Bison 构建的 LL(1) / LALR(1) 语法分析器,遵循经典的 Lex-Yacc 模式。解析器的主要目标是将 SQL 文本转换为 抽象语法树(Abstract Syntax Tree, AST),以便后续进行语义分析、重写和执行。

🧠 整体架构概览

1. 输入:SQL字符串

  • 用户输入的SQL查询字符串(如 "SELECT * FROM table"
  • raw_parser函数接收并处理

2. 词法分析(Lexer)

  • 使用Flex编写的扫描器 scan.l将SQL分解为标记(tokens)
  • 支持关键字识别(如 SELECT, FROM、标识符、常量、运算符等)
  • 处理引号、注释、Unicode 转义等特殊字符

3. 语法分析(Parser)

  • 使用Bison编写的语法分析器gram.y根据SQL语法定义构建 AST
  • 遵循PostgreSQL定义的SQL语法结构
  • 输出 未分析的原始 AST 列表(List of Raw Parse Trees)

4. 输出:Raw Parse Tree

  • 返回类型为 List *,每个元素是一个 Node * 类型的 AST 结构
  • AST是一种中间表示形式,尚未经过语义检查或优化
  • 后续由analyze.c等模块进行进一步处理

🔍 核心组件详解

1. Flex扫描器

功能:

  • 将输入文本拆分为token
  • 识别SQL关键字(如SELECT、INSERT、WHERE等)
  • 处理各种常量(字符串、数字、布尔值)
  • 处理标识符大小写(未加引号转小写)

示例:

SELECT * FROM my_table WHERE id = 1;
Token Value
SELECT keyword
* operator
FROM keyword
my_table IDENT (identifier)
WHERE keyword
id IDENT
= operator
1 integer constant

pgselectstmt.png

2. Bison语法分析器

功能:

  • 基于上下文无关文法(CFG)构建 AST
  • 使用递归下降的方式匹配语法结构
  • 支持嵌套子句、JOIN、CTE、窗口函数等复杂结构
  • 提供多种解析模式(如RAW_PARSE_TYPE_NAME用于类型解析)

示例 AST 结构(伪代码):

SelectStmt { targetList = List[A_Star("*")]; fromClause = List[RangeVar("my_table")]; whereClause = A_Expr(EQUALS, ColumnRef("id"), Integer(1)); }

3. 中间层过滤器base_yylex

功能:

  • 实现前瞻逻辑(Lookahead),解决部分需要多个 token 判断的语法问题
  • 替换 token(如 NOT → NOT_LA)

示例替换:

NOT IN (...) → NOT_LA IN NULLS FIRST → NULLS_LA FIRST WITH TIME ZONE → WITH_LA TIME

4. 入口函数 raw_parser

功能:

  • 初始化扫描器与语法分析器
  • 设置不同的解析模式(如类型名解析、PL/pgSQL 表达式解析)
  • 返回原始 AST 列表
List *raw_parser(const char *str, RawParseMode mode);

📌 解析流程图解

+-------------------+
|     SQL String    |
+-------------------+
         ↓
+-------------------+
|   Flex Scanner    | → Tokens: SELECT, FROM, IDENT, ...
+-------------------+
         ↓
+-------------------+
| Intermediate Filter |
| (Lookahead logic) |
+-------------------+
         ↓
+-------------------+
|   Bison Parser    | → Raw AST (List of Node *)
+-------------------+
         ↓
+-------------------+
| Semantic Analyzer | → Analyzed Query Tree
+-------------------+

关键特性总结

特性 描述
语言模型 基于 LALR(1) 文法设计,使用 Bison 实现
词法扫描 Flex 编写的扫描器,支持 Unicode、大小写处理、转义等
AST 构造 输出 List<Node *>,表示未分析的原始语法树
多种解析模式 支持RAW_PARSE_DEFAULTRAW_PARSE_TYPE_NAME, RAW_PARSE_PLPGSQL_EXPR

总结

它是 PostgreSQL 查询处理流程的第一步,理解它的结构和工作原理对于深入掌握 PostgreSQL 内核开发、SQL 引擎定制、语法扩展等具有重要意义。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论