PostgreSQL码农集散地

都是数据库解析器, parser 和 resolution 有何区别。OceanBase老司机纠错来了

都是数据库解析器, parser 和 resolution 有何区别

就在刚刚OB老司机兹拉坦给出了纠错resolution->resolver. 

但是已经错了,就将错就错吧,解释一下parser和resolution两个不同的解析阶段。

在数据库系统中,“parser” 和 “resolution” 是两个关键的编译/执行阶段组件。它们的中文解释如下:

1. Parser(解析器)

中文名称:语法解析器 或 解析器

作用解释:
Parser 负责将用户输入的 SQL 语句(字符串形式)转换成数据库内部可理解的结构化表示,通常是语法树(Parse Tree)或抽象语法树(Abstract Syntax Tree, AST)。

通俗理解:
就像语文老师分析一句话的主谓宾一样,Parser 分析 SQL 语句是否符合语法规则(比如 SELECT * FROM table 是否写对了),并把它拆解成数据库能“读懂”的结构。

举例:
输入 SQL:

SELECTnameFROMusersWHERE age > 18;

Parser 会检查:

  • 关键字是否正确(SELECT、FROM、WHERE)
  • 表名、列名是否符合标识符规则
  • 表达式 age > 18 是否语法合法

如果语法错误(如 SELEC name),Parser 会直接报错:“语法错误”。

2. Resolution(解析 / 名称解析 / 语义解析)

中文名称:名称解析、语义解析 或 符号解析

作用解释:
Resolution 是在 Parser 之后的阶段,负责将语法树中的逻辑名称(如表名、列名、别名等)绑定到实际的数据库对象(如具体的表、列、数据库),并进行语义合法性检查。

通俗理解:
Parser 看的是“句子结构对不对”,而 Resolution 看的是“句子里提到的人和事在现实中是否存在”。
比如:“张三在清华大学读书”——语法没问题,但如果“张三”不存在,或“清华大学”没有这个人,就语义错误。

具体任务包括:

  • 检查表是否存在(users 表是否存在?)
  • 检查列是否存在(name 和 age 是否是 users 表的列?)
  • 解析列的类型(age 是整数吗?能否和 18 比较?)
  • 处理别名、作用域(如子查询中的列名归属)
  • 权限初步检查(用户是否有权访问该表?)

举例:
SQL:

SELECTnameFROMusersWHERE age > 18;

Resolution 会检查:

  • 当前数据库中是否有 users 表?
  • users 表是否有 name 和 age 列?
  • age 的数据类型是否支持与整数比较?

如果 users 表不存在,即使语法正确,也会报错:“表 users 不存在”。

总结对比:

阶段
英文
中文
关注点
错误示例
Parser
Parser
语法解析器
SQL 语句结构是否合法
SELEC * FROM t;
 → 语法错误
Resolution
Resolution
名称/语义解析
表、列等对象是否存在
SELECT x FROM t;
(x 列不存在)→ 语义错误

💡 简单记忆:

  • Parser:“写得对不对”(语法)
  • Resolution:“东西有没有”(语义)

这两个阶段共同构成了 SQL 执行的前端处理(Frontend Processing),之后才会进入优化(Optimization)和执行(Execution)阶段。