Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
2.1. lexer作为一个工具,完成了对SQL字符串的切割,将语句转化成一个tokens数组。3
2.2. Parser完成了SQL解析的后序部分:使用一个lexer对象作为工具,切出tokens,然后解析语义,绑定相关的系统接口。3
2.3. 关系数据和XML数据库下其抽象语法树分别为: 如图 5
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的更多相关文章
- atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js
atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js 1.1. 复合变量,也就是类似$$a的变量,它会进行两次的解释. 1 1.2. 数据库里面的复合变量1 ...
- Atitit.加密算法 des aes 各个语言不同的原理与解决方案java php c#
Atitit.加密算法 des aes 各个语言不同的原理与解决方案java php c# 1. 加密算法的参数::算法/模式/填充 1 2. 标准加密api使用流程1 2.1. Md5——16bi ...
- AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast 阅读约 27 分钟 抽象语法树(AST),是一 ...
- JSP编译成Servlet(二)语法树的遍历——访问者模式
语法树可以理解成是一种数据结构,假如某些语句已经被解析成一棵语法树,那么接下来就是要对此语法树进行处理,但考虑到不将处理操作与数据结构混合在一块,我们需要一种方法将其分离.其实对于语法树的处理最典型的 ...
- [Hive]HiveSQL解析原理
Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和 ...
- 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 ...
- 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. 变量定义 ...
- Atitit. 构造ast 语法树的总结attilax oao
Atitit. 构造ast 语法树的总结attilax oao 1. 能那更加有意义的名字来命名ast节点... 1 2. 如何命名表达式名称..使用实际对象名称,而不是操作符号表达式更好 1 2.1 ...
- atitit..sql update语法的词法分析,与语法ast构建
atitit..sql update语法的词法分析,与语法ast构建 1. 要使用sql udpate语法的dsl ,需要写个解释器.. 1 2. 词法分析的实现 1 2.1. 扫描器的实现 SqlU ...
随机推荐
- 请教一下16aspx上的源代码要如何在自己的服务器上运行
很正常呀,,我下载的也有运行不成功的你要去他们16aspx论坛发帖子问这里很少有人回答你这样的问题
- HDU 6112.今夕何夕-蔡勒公式 (2017"百度之星"程序设计大赛 - 初赛(A)1005)
1005:今夕何夕 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- POJ 1298 The Hardest Problem Ever【字符串】
Julius Caesar lived in a time of danger and intrigue. The hardest situation Caesar ever faced was ke ...
- Fiddler在fiddler option设置还是抓不了HTTPS包解决办法
1:请在“运行”,即下面这个地方输入certmgr.msc并回车,打开证书管理. 打开后,请点击操作--查找证书,如下所示: 然后输入“fiddler”查找所有相关证书,如下所示: 可以看到,我们找到 ...
- sqlldr control file compare with HEX value
when field= UTL_I18N.RAW_TO_CHAR ('e38080', 'AL32UTF8')
- Tiny4412在Ubuntu下给MiniTools添加快捷方式
解压MiniTools-Linux-20140317.tgz root@ubuntu:~/tiny4412/MiniTools-# ls -l total -rw-r--r-- root root M ...
- 如何在AutoCAD中将卫星底图变为有坐标参考信息的
这篇博文首先没有图,主要是博主太懒了,不想再截图,我把过程说清楚也可以的.特此说明. (1)将下载好的瓦片拼接好大的地图 (2)将其导入到ArcGIS中,定义其地理坐标,如WGS84:然后将其其投影为 ...
- JAVA之接口与实现
/** * * 功能:接口与实现 * 接口也体现了多态性 */package com.test; public class test5 { /** * @param args */ ...
- 在Hadoop监控页面怎样查看Hive的完整SQL
如图.这里仅仅能看到简单的一段SQL.差点儿看不出详细在运行什么任务. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFvemhhb2t1bg==/fo ...
- EffectiveJava(8)覆盖equals是要遵守的约定
覆盖equals是要遵守的约定 1.覆盖种类: -类的每个1实例本质上都是唯一的 -不关心类是否提供了"逻辑相等"的测试功能(Random测试是否能随机相同数字) -超类已经覆盖了 ...