GaussDB 数据库架构师修炼(十八) SQL引擎-解析器
1 什么是SQL解析
SQL解析是SQL查询处理中的第一个模块。对输入的原始SQL语句,SQL解析将SQL查询语句转换为等效的关系代数运算,它通常以基于关系代数的查询树来表示。查询树会作为后续查询优化模块的输入。
SQL解析又可划分为三个子模块,包括词法分析、语法分析和语义分析,三个模 块按照顺序执行:
词法分析:提取出SQL语句中的关键词、常量等成分。
语法分析:将词法分析提取的成分构建为一棵语法分析树。
语义分析:检查语法分析树的语义正确性, 并将其转化为基于关系代数式表达的查询树。
2 词法分析
SQL解析的第一步是对SQL查询进行词法分析。
词法分析模块会按照查询语句的词法规则(通常使用正则表达式定义) ,将查询语句拆解为token 序列,并提取关键词、标识、常量等,并对不同类别的单词进行类别标记。
3 语法分析
1)根据词法分析输出的原子节点构建语法分析树。
2)首先根据语法规则判断SQL语句是否符合语法限制。如果符合语法规则,则按照语法规则识别出SQL查询中的语法类节点, 并结合词法分析输出的原子节点(关键词等)构建出一棵语法分析树
在SQL解析中,关键字(也称为关键词)是一种特殊定义的字符串。关键字分为 保留关键字和非保留关键字。
- 1)保留关键字是在SQL中具有特殊含义的单词 ,通常用于表示SQL查询语句的不同部分,如操作类型或条件。例如SELECT 、CREATE 、ALL 、GROUP BY 、IS 、NOT 、WHERE等。特别要注意的是保留关键字不可被用作列名、表名等其他标识, 但添加双引号后可支持,例如"SELECT"。
2)非保留关键字只是在特定的环境里有特殊的含义, 而在其他环境里是可以用作标识符的。例如 ABORT 、ADD 、AT 、BLOB 、COLVIEW 、COPY等。这些关键字不支持直接作为列别名使用, 但可以作为列名和表名。 GaussDB还存在一些特别的非保留关键字在一些情况下有特殊限制。
3)移进规约
对于自下而上的上下文无关语法分析器中, 栈保留正在处理的字符。 移进指将输入字符压入栈顶, 而规约指根据文法规则将栈顶的若干字符替换为一个非终结符(匹配到某个语法规则)。
移进-规约冲突:在某一时刻,可以移进,也可以规约。GaussDB会选择移进,继续向下匹配。
规约-规约冲突:所处理的字符串可以匹配到多个规则,分析器无法判断到底该选择哪项规则。这种就需 要指定优先级等策略辅助确定规则。
4 语义分析
语义分析要对语法分析所输出的语法分析树进行语义上的正确性检查, 并将语法分析树转化为方 便查询优化阶段处理的查询树。
正确性检查包括:
对关系进行检查:查询中出现的关系是否存在于关系模式
对属性的检查:查询中涉及的属性是否能在数据库关系中找到匹配项
对数据类型的检查:查询中的运算是否与涉及的属性类型相匹配
正确性检查完毕后,则将语法树逻辑等价转化为基于关系代数式,表达的查询树以便后面的查询优化。
(Π)表示投影; (X)表示笛卡尔积; (σ)表示选择; (^)表示逻辑与
转化后的关系代数查询树