java实现dbms_Apache顶级项目ShardingSphere — SQL Parser的设计与实现

SQL Parser

作者:陆敬尚

京东数科ShardingSphere团队原创,转载请获得授权

导语: SQL作为现代计算机行业的数据处理事实标准,是目前最重要的数据处理接口之一,从传统的DBMS(如MySQL,Oracle)到主流的计算框架(如spark,flink)都提供了SQL的解析引擎,因此想对SQL进行精细化的操作,一定离不开SQL Parser。Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,需要对SQL进行精细化的操作,如改写,加密等,因此也实现了SQL Parser,并提供独立的Parser引擎。

先来认识一下传统数据库中一条SQL处理流程是怎样的,接受网络包 -》数据库协议解析网络包的到SQL -》SQL语法解析为抽象语法树 -》把语法树转换成关系代数表达式树(逻辑执行计划) -》再转换成物理算子树(物理执行计划) -》遍历物理算子树执行相应算子的实现获取数据并返回。

一、工作原理

SQL Parser 的功能是把一条SQL解析为抽象语法树(AST),SQL Parser需要编译原理相关的知识,简单介绍一下。

SQL Parser 包含词法解析(Lexer)和语法解析(Parser),词法解析的作用是把一个SQL 分割成一个一个不可分割的单元,例子:

原始SQL:select id,name from table1 where name="xxx";

词法解析器输入是原始SQL,并且暴露一个接口nextToken(),每次调用nextToken()都会返回一个Token,伪代码如下:

6cd5fdcdb75a74f17f80852683530c96.png

语法分析器的作用是使用Lexer的输出(调用nextToken()),构造出AST,以上面的SQL为例,解析器得出的语法树如下:

faaa7f80467ead1084e86dc98856608a.png

1、Lexer 原理

Lexer 也称为分词,从左向右扫描SQL,将其分割成一个个的toke(不可分割的,具有独立意义的单元,类似英语中的单词)。

Lexer的实现一般都是构造DFA(确定性有限状态自动机)来实现的,以一个例子说明。

状态转移图如下,这是一个能够识别标识符,数字和一般运算符的词法解析器。

4cec985cec90d25b7bca16714451f7fe.png

代码实现可以使用传统的while case的模板实现,伪代码如下:

6baf7146a069817bb51427fa72ad745d.png

2、Parser 原理

Parser阶段有两种类型方法来实现,一种是自顶向下分析法,另一种是
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值