sharding-sphere之SQL解析select

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sharding-sphere之SQL解析select相关的知识,希望对你有一定的参考价值。

参考技术A

mysql为例,先看一下sql的写法: 官网地址: 请点击我

sql关联查询的格式如下:

结果集合并:

sql的解析过程如官方文档sql写法解析过程一直,流程图如下:

举个例子:以mysql的查询sql为例,看看语法解析器的解析过程:

sql语法解析器的解析过程,获取 MySQLSelectParser ,并解析。和上一篇 insert 都一致。

MySQLSelectParser 的解析过程中,首先会解析sql,归并子查询,组装返回的statement,具体过程参照文章上方图,按照官方sql写法,一步一步解析,最终解析完成。

接下来一个一个看看,到底分别都是如何解析的

如果sql中有distinct,或者distinctrow,则抛异常,不支持该语句

跳过HIGH_PRIORITY,STRAIGHT_JOIN,SQL_BIG_RESULT,SQL_SMALL_RESULT,SQL_BIG_RESULT,SQL_BUFFER_RESULT,SQL_CACHE,SQL_NO_CACHE,SQL_CALC_FOUND_ROWS关键字。

选项之间 , 隔开,直到解析最后一个分词不是,结束,循坏处理。

在解释分词的时候,跳过其他的关键字,然后判断是否是 * ,或者 MAX,MIN,SUM,AVG,COUNT 函数,或者是普通返回字段,按照不同格式解析。

解析带 * 的语句逻辑,个人理解,组装StarSelectItem即可,有些逻辑不太了解,后续再更。

处理MAX,MIN,SUM,AVG,COUNT函数的逻辑如下:

根据.,()做不同的处理逻辑,解析别名,返回分词组装SelectItem。

再具体解析时,首先会获取第一分词,然后看下一个分词是不是 . ,如果是 . ,则第一分词是schema的名称,下一分词为表名称,不然第一分词是表名称。

在解析join语句时,首先判断是否是join子查询,如果是,则不支持。

在判断join结束的时候,实质是跳过 on 分词,解析on table1.a=table2.b这样的语句,分析前一个表达式和第二个表达式。

表关联结束之后,整个from语句就解析完成了,接下来的就是where语句了。

按照,分割,一个一个解析处理

不支持UNION,INTERSECT,MINUS,EXCEPT

以一下sql为例:

解析结果如图:

fyi

以上是关于sharding-sphere之SQL解析select的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL的硬解析和软解析

org.apache.spark.sql.AnalysisException:无法解析“S.SID”

sql语句之多表查询

张亮:Sharding-Sphere成长记

剖析Sharding-Sphere系列——结果归并

Sharding-Sphere系列-主从配置和分库分表