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的主要内容,如果未能解决你的问题,请参考以下文章