Apache Calcite原理解析(3)--解析层
1、Calcite的解析过程
1.1、解析过程
用户的操作请求经过服务层的接收和封装被传递给calcite-core模块,对SQL的处理第一层是解析层
。在这个过程中,初始的SQL字符串会被转化为Calcite内部的语法解析节点
,为进一步的语法校验和优化做准备。
语法解析过程主要可以分为3个阶段:
1、首先字符串处理器会将源语句中的字符串转换成字符流;
2、然后词法分析器
会对字符流中的一些词法进行匹配,形成词组(Token)流;
3、最后由语法分析器
将这些词组流进行语义逻辑的理解,转变为最终的抽象语法树
。
然后在解析的过程中,还会注册两个监听器,一个是负责检查语法是否存在错误的异常监听器
;另外一个是负责维护词法和语法匹配逻辑的表格管理器
。
1.2、Calcite中的解析体系
语法解析的最终结果是从SQL字符串得到一个抽象语法树,在Calcite中使用SQLNode负责封装抽象语法树中各个节点的语义信息。
在Calcite中SqlNode的实现类有40多个,每个类都代表一个节点到源码结构的映射,其大致可以分为3类,即SqlLiteral
、SqlIdentifier
、SqlCall
。
SqlLiteral
主要是封装输入的常量,也称为字面量;
SqlIdentifier
主要是封装输入的标识符,比如表名称,字段名称;
SqlCall
主要是SQL中的每个操作,比如Select对应SqlSelect,插入对应SqlInsert。
比如select idfrom t where id > 1 解析后的SQLNode树为: