Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
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
转载于:https://www.cnblogs.com/attilax/p/5191589.html
Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python相关推荐
- Java解析SQL生成语法树_Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python...
Atitit.sql ast 表达式 语法树 语法 解析原理与实现java php c#.net js python 1.1.Sql语法树ast如下图锁死 2.SQL语句解析的思路和过程 2.1.le ...
- 什么是php的ast结构,什么是AST?Vue源码中AST语法树的解析
这篇文章给大家介绍的内容是关于什么是AST?Vue源码中AST语法树的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是AST AST是指抽象语法树(abstract syn ...
- atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js
atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js 1.1. 复合变量,也就是类似$$a的变量,它会进行两次的解释. 1 1.2. 数据库里面的复合变量1 ...
- 抽象语法树的简单原理
抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示.它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码 ...
- CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]
文章目录 CAD图像读取与显示说明 官方实体说明 实体 圆弧 dxf记录信息 代码实现 测试 优化多段线的凸度 dxf记录信息 代码实现 测试 椭圆 dxf记录信息 代码实现 测试 引用 图片引用 文 ...
- python compiler.ast_ast --- 抽象语法树 — Python 3.7.9 文档
ast --- 抽象语法树¶ ast 模块帮助 Python 程序处理 Python 语法的抽象语法树.抽象语法或许会随着 Python 的更新发布而改变:该模块能够帮助理解当前语法在编程层面的样貌. ...
- python 抽象语法树_抽象语法树(Abstract Syntax Tree)
一般来说,程序中的一段源代码在执行之前会经历下面三个步骤 1 分词/词法分析 这个过程会将由字符组成的字符串分解成有意义的代码快,这些代码块被称为词法单元.例如 var a = 4:会被分解成 var ...
- Java解析SQL生成语法树_04. Hive源码 — HQL解析(抽象语法树的生成和语义分析)
HQL的解析过程主要在Driver中的compile方法,这一些主要看这个方法中的代码. 1. compile中的主要内容 public int compile(String command, boo ...
- java AST 表达式_java 编译时注解-AST 抽象语法树简介
AST 语法入门 以前使用 Lombok 一直觉得是一个很棒的设计,可以同时兼顾注解的遍历和运行的性能. 运行时注解一直因为性能问题被人诟病. 自己尝试写过一些框架,但是耗费了比较多的精力,因为 AS ...
- java抽象语法树_抽象语法树AST的全面解析(一)
Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...
最新文章
- HTML的BODY内标签介绍
- boost::phoenix模块实现自适应回声服务器相关的测试程序
- 从根本上了解异步编程体系
- python爬虫实践目的_Python编写爬虫实践
- Adobe Flash Player 10 插件无法注册
- 什么是数据挖掘 有什么作用
- 【plantuml】程序员绘图工具
- 自动化测试(AT)与探索性测试(ET)
- doom3的UI系统
- 0813Python总结-tcp,udp及黏包,struck模块
- CVTE校招嵌入式经历
- 测试高薪必备:3步教测试人员破解子查询
- 网易云音乐接入微信状态
- 通向终极自由之路的圣多纳释放法
- 如何写出高质量的文章:从战略到战术
- 【CXY】JAVA基础 之 异常追踪栈
- JS获取图片的EXIF信息+纠正图片方向
- C/C++要点全掌握(二)——堆栈、指针
- CAS . . . .
- 【大话QT之十四】QT实现多语言切换
热门文章
- 在mybatis里面设置不同数据库运行环境和适应性问题
- 排序 --- 6.2 Merge Two Sorted Lists || 6.3 Merge k Sorted Lists --- 图解
- c语言随机生成算式的对错判断,蔡奇宏软件工程第二次作业--四则运算
- java代码使用Get请求或者Post请求获取网络内容
- 使用poi生成word文档(最全例子)
- Spring源码之ApplicationContext(三)加载BeanFactory
- 【渝粤教育】国家开放大学2018年春季 0471-22T畜牧学 参考试题
- 【渝粤题库】陕西师范大学202281 中央银行学II 作业(专升本)
- owncloud个人私有云 一键安装包操作指南
- [转]OPENGL中GLU和GLUT工具箱