Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python

1.1. Sql语法树 ast 如下图锁死1

2. SQL语句解析的思路和过程3

2.1. lexer作为一个工具,完成了对SQL字符串的切割,将语句转化成一个tokens数组。3

2.2. Parser完成了SQL解析的后序部分:使用一个lexer对象作为工具,切出tokens,然后解析语义,绑定相关的系统接口。3

2.3. 关系数据和XML数据库下其抽象语法树分别为: 如图 5

3. 参考6

1.1. Sql语法树 ast 如下图锁死

2. SQL语句解析的思路和过程

2.1. lexer作为一个工具,完成了对SQL字符串的切割,将语句转化成一个tokens数组。

2.2. Parser完成了SQL解析的后序部分:使用一个lexer对象作为工具,切出tokens,然后解析语义,绑定相关的系统接口。

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

在这里先要回顾下simpledb的支持的SQL的语法,这个影响了它在解析字符串时使用的方法。

由代码和上面的语法树看出来,simpledb在解析SQL语句的时候,严格按照语法中支持的类型,“卡住”关键字,从中解析出字段列表fieldlist,表名列表tablelist,以及谓词列表predicates,然后将这些查询中实际用到的数据,包装成相应的对象,SQL语句的解析就初步完成

作为SQL语句解析的入口,有如下的updateCMD方法,根据SQL语句首个token的不同,进行了分支:

public object updateCmd()

{

if (lex.matchKeyword("insert"))

return insert();

else if (lex.matchKeyword("delete"))

return delete();

else if (lex.matchKeyword("update"))

return modify();

else

return create();

}

补充一点,注意下上面的query()的代码,lex用match*()来检测下一个token是否满足匹配条件,用eat*()来讲满足条件的token处理掉:

public void eatDelim(char d);

public string eatId();

public int eatIntConstant()

public void eatKeyword(string w)

public string eatStringConstant()

数据相关的,均有返回值,返回处理后的结果;数据无关的,没有返回值,实际只是利用nextToken移动position指针。

关于tablelist、fieldlist的构建,使用了递归的方式实现:

private List<string> fieldList()

{

List<string> l = new List<string>();

l.Add(field());

if (lex.matchDelim(','))

{

lex.eatDelim(',');

l.AddRange(fieldList());

}

return l;

}

谓词 predicates也是用了递归的形式:

private Predicate predicate()

{

Predicate pred = new Predicate(term());

if (lex.matchKeyword("and"))

{

lex.eatKeyword("and");

pred.conjoinWith(predicate());

}

return pred;

}

略有不同的是,在谓词连接的时候,使用了Predicate类的conjoinwith方法,实际上,predicate对象下,维护了一个条件列表terms,这个方法就是把谓词中的各个term转存到一起。

本文和前一节只是扼要地描述了SQL语句解析的思路和过程,可以看到解析的结果就是生成了各种查询data,这些data会传递给query模块,由query模块利用这些得到的data,完成数据的查询。

2.3. 关系数据和XML数据库下其抽象语法树分别为: 如图

对于查询语句select name from Name where person_id =1和for $i in doc(“Name.xml”) where $i/person/id=1 return $i/person/name其在关系数据和XML数据库下其抽象语法树分别为:

 (图1:select name from Name where person_id=1 的抽象语法树)

 (图2:for $i in doc(“Name.xml”) where $i/person/id=1 return $i/person/name的抽象语法树)

3. 参考

基于AST抽象语法树的SQL注入检测 (1) - 百科教程网_经验分享平台[上学吧经验教程频道].html

再读simpledb 之 SQL语句解析(2) - 郝玉琨 - 博客园.html

从Oracle到SQL Server-SQL智能翻译器-Oracle-第七城市.html

Query Lanaguage On NoSQL..html

SQLite教程 - 查询处理及优化 - SQLite - 数据库技术 - 9SSSD.COM.html

SQLite教程 - 浅析Lemon - SQLite - 数据库技术 - 9SSSD.COM.html

Hive SQL 编译过程详解 - OPEN 开发经验库.html (imp

Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python的更多相关文章

  1. atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js

    atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js 1.1. 复合变量,也就是类似$$a的变量,它会进行两次的解释. 1 1.2. 数据库里面的复合变量1 ...

  2. Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c#

    Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c# 1. 加密算法的参数::算法/模式/填充 1 2. 标准加密api使用流程1 2.1. Md5——16bi ...

  3. AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解

    AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast  阅读约 27 分钟 抽象语法树(AST),是一 ...

  4. JSP编译成Servlet(二)语法树的遍历——访问者模式

    语法树可以理解成是一种数据结构,假如某些语句已经被解析成一棵语法树,那么接下来就是要对此语法树进行处理,但考虑到不将处理操作与数据结构混合在一块,我们需要一种方法将其分离.其实对于语法树的处理最典型的 ...

  5. [Hive]HiveSQL解析原理

    Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和 ...

  6. Atitit. 构造ast 语法树的总结attilax oao 1. Ast结构树形12. ast view (自是个160k的jar )22.1. 多条语句ast结构22.2. 变量定义 int b,c; 的ast结构22.3. 方法调用meth1(a=1,b=2,c=3);  的ast结构23. 误解的问题33.1. 语法书子能是个二叉树,实际上多叉树越好..33.2. 非要不个ast放到个s

    Atitit. 构造ast 语法树的总结attilax oao 1. Ast结构树形1 2. ast view (自是个160k的jar )2 2.1. 多条语句ast结构2 2.2. 变量定义 in ...

  7. Atitit. 构造ast 语法树的总结attilax v2 q0f

    Atitit. 构造ast 语法树的总结attilax v2 q0f 1. Ast结构树形1 2. ast view (自是个160k的jar )2 2.1. 多条语句ast结构2 2.2. 变量定义 ...

  8. Atitit. 构造ast 语法树的总结attilax oao

    Atitit. 构造ast 语法树的总结attilax oao 1. 能那更加有意义的名字来命名ast节点... 1 2. 如何命名表达式名称..使用实际对象名称,而不是操作符号表达式更好 1 2.1 ...

  9. atitit..sql update语法的词法分析,与语法ast构建

    atitit..sql update语法的词法分析,与语法ast构建 1. 要使用sql udpate语法的dsl ,需要写个解释器.. 1 2. 词法分析的实现 1 2.1. 扫描器的实现 SqlU ...

随机推荐

  1. react 利用react-hammerjs插件实现滑动特效和点击特效

    react-hammerjs是一款由hammer.js的JS插件来实现在react中实现手势滑动的事件插件, 它有各种各样的手势支持效果,这里我们就使用下它最简单的3种效果来实现我们要的动画 分别是点 ...

  2. 计蒜客 18487.Divisions-大数的所有因子个数-Miller_Rabin+Pollard_rho-超快的(大数质因解+因子个数求解公式) (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 F)

    这一场两个和大数有关的题目,都用到了米勒拉宾算法,有点东西,备忘一下. 题目传送门 F. Divisions 传送门 这个题是求一个数的所有因子个数,但是数据比较大,1e18,所以是大数的题目,正常的 ...

  3. mac-command-line-doing

    创建文件夹 mkdir myDirectory 新建文件 touch a.html 编辑文件 vim a.html 删除文件 rm a.html 删除整个文件夹 rm -rf myDirectory ...

  4. 【BZOJ2276】Temperature

    题面 Description The Byteotian Institute of Meteorology (BIM) measures the air temperature daily. The ...

  5. Unity3d之MonoBehavior的各个函数的执行顺序,回调,顺序,次数等

    Update 当MonoBehaviour启用时,其Update在每一帧被调用.仅调用一次(每帧) LateUpdate 当Behaviour启用时,  每帧调用一次: FixedUpdate 当Mo ...

  6. JSP(待更新)

    1.概念: 所谓JSP就是在HTML中嵌入大量的java代码而已.

  7. 利用Yum彻底移除docker

    yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-la ...

  8. ubuntu常用 命令

    卸载软件 ,比如chrome sudo apt-get remove google-chrome-stable

  9. TCP为什么要三次握手,不是两次四次

    转载:   http://blog.chinaunix.net/uid-20726927-id-2455485.html 在革命战争影片中,经常会看到英勇的解放军战士背着步话机在喊“长江长江,我是黄河 ...

  10. CentOS7环境下SSH端口修改笔记

    CentOS7环境下SSH端口修改笔记 说明: CentOS7服务器环境,默认SSH端口为22,考虑到安全方面问题,欲修改端口为62231(机器内网IP为192.168.1.31) ssh配置文件和i ...