PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

51.3. 词法语法解析阶段 #

51.3.1. 解析器
51.3.2. 语义转换处理

解析阶段主要由两大部分工序组成:

51.3.1. 解析器 #

解析器负责核验传入的纯文本查询字符串在语法层面是否完全合规。如果语法正确,将构建一棵抽象语法解析树(Parse Tree);若语法存在缺陷则立即抛出错误信息中断执行。

词法分析器(Lexer)定义在源码 scan.l 中,负责识别标识符、SQL 关键字、操作符及字面常量,将其切割转化为标记(Token)流传递给语法解析器。gram.y 中定义了标准 SQL 语法产生式规则及规约触发动作(Action)。在源码编译构建期间,工具链会自动将 scan.l 编译转换为 C 代码文件 scan.c,将 gram.y 编译转换为 gram.c。严禁直接手动修改生成的 C 文件,它们在下次编译时会被自动重新覆盖。

51.3.2. 语义转换处理 #

原始解析器仅依据 SQL 的纯句法规则生成解析树,在此期间绝不发起任何系统目录表检索,因此并不理解所涉对象的深层语义。解析器执行完毕后,语义转换处理流程介入:核验查询中引用的数据表、字段、函数与操作符究竟是否存在于当前数据库中,并在节点中补充具体列的物理数据类型及类型转换规则。该阶段生成的强类型数据结构被称为查询树(Query Tree)。

将词法语法解析与语义分析明确解耦的核心原因在于:系统目录的检索必须在合法的事务上下文中执行,而系统绝不希望在刚刚收到网络文本时就草率开启新事务。纯语法解析阶段足以精准识别事务控制命令(如 BEGIN、ROLLBACK 等),这些命令无需进一步查询系统目录即可直接调度执行。唯有确认接收到的是常规数据操作语句(如 SELECT、UPDATE)时,后台才正式启动事务并调用语义转换流程。