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 |

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_DEFAULT、RAW_PARSE_TYPE_NAME, RAW_PARSE_PLPGSQL_EXPR等 |
✅ 总结
它是 PostgreSQL 查询处理流程的第一步,理解它的结构和工作原理对于深入掌握 PostgreSQL 内核开发、SQL 引擎定制、语法扩展等具有重要意义。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




