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

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

     

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

    2SQL语句解析的思路和过程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()的代码,lexmatch*()来检测下一个token是否满足匹配条件,用eat*()来讲满足条件的token处理掉:

    public void eatDelim(char d);

    public string eatId();

    public int eatIntConstant()

    public void eatKeyword(string w)

    public string eatStringConstant()

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

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

    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

  • 相关阅读:
    Kibana安装
    elasticsearch安装
    分布式_zookeeper
    通信协议_三次握手_四次挥手
    Spring中的IOC_源码_随笔
    Spring设计模式_策略模式/其他
    Spring设计模式_工厂模式
    spring设计模式_代理模式
    docker常用指令01
    ubuntu18下安装docker
  • 原文地址:https://www.cnblogs.com/attilax/p/5191589.html
Copyright © 2011-2022 走看看