都是数据库解析器, 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 | SELEC * FROM t; | |||
| Resolution | SELECT x FROM t; |
💡 简单记忆:
Parser:“写得对不对”(语法) Resolution:“东西有没有”(语义)
这两个阶段共同构成了 SQL 执行的前端处理(Frontend Processing),之后才会进入优化(Optimization)和执行(Execution)阶段。