SQL血缘解析原理

news2024/11/25 8:17:01

根据sql解析获取到表到表, 字段到字段间的关系,即血缘关系。实际上这是从sql文本获取到数据流的过程。
大致步骤如下:

1.sql文本进行词法分析
2.sql语法分析获取到AST抽象语法树
3.访问AST抽象语法树根据语法结构推测出数据的流向,例如create as select from 这种结构,数据就是从from的表流向select出来的ResultSet中间结果集最后流程create的表中, 字段可以使用字段名进行匹配,如果可以连接到元数据库是可以查询到表和字段的,如果仅仅根据sql文本分析,那么一般只能根据select中的字段名结合语法进行猜测。

一般来说,步骤1,2比较底层会有很多工具为我们完成, 像antlr(开源语法分析器),druid(基于antlr),使用这些工具可以直接从sql获取到AST语法树, 然后我们直接进入第3个步骤遍历语法树获取自己想要的信息即可。比如在解析create table A as select * from table B; 后判断出语句为create from句式,从语法树中获取create的表A和from的表B,这样表级别的血缘关系就获取到了。

下面以antlr为例对这三个步骤进行详细的说明:

  1. sql文本进行Lexer词法分析
    词法分析是将sql文本字符序列转换为单词(Token)序列的过程。
    进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。
    比如,sql中的关键字select, from, table等,antlr根据一个规则g4文件去识别这些关键字。
    g4文件是antlr生成词法解析规则和语法解析规则的基础。该文件是我们自定义的,文件名后缀需要是.g4。g4文件描述了Token及Token间语法。antlr根据g4文件的描述先进行词法解析,将字符串解析为单词(Token)序列。
    借个图做个示例:
    在这里插入图片描述

  2. sql语法分析parse获取到AST抽象语法树
    语法分析器根据g4文件描述的规则将收到的Tokens组织起来,并转换成为目标语言语法定义所允许的序列,并组装为AST抽象语法树结构。
    例如下面的sql可以被解析为下图中的ast语法树。
    create table stu_tj row format delimited as SELECT b.id,b.name FROM (select oldId id ,name from stu WHERE id =‘2’) b ;
    在这里插入图片描述

  3. 访问AST抽象语法树根据语法结构推测出数据的流向。
    语法树中包含了sql的全部信息, 可以从中获取到所需信息。但是,访问代码并不好写,因为语法树中封装的对象类型很多,不同的类型需要不同的访问方式,一般使用visitor访问者模式进行访问。大部分的业务代码就在这里访问sql解析后的AST语法树(Abstract Syntax Tree),然后获取源表和目标表之间的对应关系,即所谓血缘关系。

例如create as select from 这种结构,数据就是从from的表流向select出来的ResultSet中间结果集最后流程create的表中, 字段可以使用字段名结合语法进行匹配推理。

在这里插入图片描述
druid提供了visitor接口访问AST语法树,需要借用visitor设计模式,调用accept方法即可访问AST语法树,注意accept方法是调用入参对象的接口方法。druid已实现的visitor功能不够全,无法处理别名等一些需求,需要自己实现visitor。可以直接继承

SQLASTVisitorAdapter 也可以根据不同数据库类型继承不同的visitor。
// 自定义访问者 继承SQLASTVisitorAdapter
class SQLCustomedVisitor extends SQLASTVisitorAdapter { 
protected boolean hasLimit = false; 
@Override 
public boolean visit(SQLLimit x) { 
System.out.println(x.getRowCount()); 
hasLimit = true; 
return false; 
} 
public boolean isHasLimit() { return hasLimit; } 
}

不同数据库类型继承不同的visitor 
https://github.com/alibaba/druid/wiki/SQL_Parser_Demo_visitor
public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlASTVisitor {

    public MySqlSchemaStatVisitor() {
        super (JdbcConstants.MYSQL);
    }

    public boolean visit(SQLSelectStatement x) {
        if (repository != null
                && x.getParent() == null) {
            repository.resolve(x);
        }

        return true;
    }
}

参考

https://www.jianshu.com/p/21f2afca65e8
https://baike.baidu.com/item/antlr/9368750
https://zhuanlan.zhihu.com/p/121545985
https://github.com/alibaba/druid/wiki/SQL_Parser_Demo_visitor
https://github.com/alibaba/druid/wiki/SQL-Parser
https://blog.csdn.net/shy_snow/article/details/133373567

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1048642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用x64dbg手动脱UPX壳(UPX4.1.0)

本文选用的壳是4.1.0的UPX壳 将加壳的exe文件拖入x64dbg 打开符号,进入第一个sample.exe 进入后在第一个位置下断点,按下F9运行 继续按下F9 单步运行到此处,发现只有RSP变红,根据ESP定律,进行下面的操作 所谓定律就像…

【配置conda环境】新版pycharm导入新版anaconda环境

最近下载了新版pycharm和新版anaconda,并且在命令行创建了环境,想着在pycharm里面导入环境。结果现在的导入方式发生了变化。 之前是通过导入Python.exe进行的。 现在: 当我们点击进去之后,会发现找不到python.exe了。 具体什么…

设置基站IP及设置基站连接服务器

基站状态指示灯 基站正常连接上服务器,基站指示灯如下, 第一个灯是电源指示灯常亮; 第二个灯为运行指示灯,程序正常运行第二个灯一直闪烁; 第三个灯为为网络指示灯,网络连接正常会常亮,网络…

B树和B+树的介绍和对比,以及MySQL为何选择B+树

在计算机科学中,B树和B树是常用的数据结构,用于在大规模数据集上进行高效的插入、删除和查找操作。它们在数据库管理系统、文件系统等许多实际应用中发挥着重要作用。本文将深入介绍B树和B树的结构特点、实际应用方面以及它们的优缺点,并最后…

Vue安装并使用Vue-CLI构建SPA项目并实现路由

目录 前言 一、Vue CLI简介 1.什么是Vue CLI 2.Vue CLI的特点 二、SPA项目搭建 1.安装Vue CLI 2.使用脚手架vue-cli来构建项目 ​编辑 3.项目结构说明 4.什么是*.vue文件 三、基于SPA完成路由并嵌套路由 1.基于SPA完成路由 1. 1在src下的components 创建自定义组件…

今天面了个腾讯拿38K的人,让我见识到了测试的天花板

6年测试经验,技术应该是能达到资深测试的水准,不仅能熟练地开发业务,而且还能熟悉项目开发,测试,调试和发布的流程,还应该能全面掌握数据库等方面的技能,如果技能再高些的话,甚至熟悉…

【小余送书第一期】《数据要素安全流通》参与活动,即有机会中奖哦!!

目录 1、背景介绍 2、本书编撰背景 3、本书亮点 4、本书主要内容 5、活动须知 1、背景介绍 随着大数据、云计算、人工智能等新兴技术的迅猛发展,数据已经成为我国经济社会发展的五大生产要素之一,《网络安全法》《个人信息保护法》《数据安全法》的…

新品上市 | 纳米级分选磁珠重磅来袭~(含试用福利)

细胞疗法在近年医药研发中发展十分迅速,是一种全新的药物开发模式,在癌症、传染病和自身免疫等疾病的治疗方面显示出了巨大的潜力。今年6月30日,中国药监局(NMPA)批准了由南京驯鹿生物申报,驯鹿生物和信达生…

VBA 将TXT的多行文本文件进行处理,以ID为单位处理成 一行

VBA 将TXT的多行文本文件进行处理,以ID为单位处理成 一行 序言 由于需要将TXT文件与Excel文件进行对比,但两种文件格式差异比较大,于是通过VBA写了一下小工具,以便日后方便使用。 TXT文件如下 VBA代码如下 ********************…

六、如何让卡片一直对着摄像头

上期我们创建了卡片,那么如何让卡片一直面向浏览器。这个交互有一部分公司还是很需要的,今天我们就来讲讲,先看效果图 在animate.js里面增加卡片Mesh的LookAt,代码如下 import camera from "./camera"; import rendere…

codesys【虚轴】

1概述:codesys里有3个轴: 自由编码器,虚轴,实轴。 流程:【高速输入:采集AB脉冲】带》【自由编码器】带》【虚轴】带》【实轴】 1虚轴: 用法和实轴一样。 一般用于,一拖多。 2编…

索尼 toio™应用创意开发征文|检测工业平台震动

虽然索尼toio Q宝机器人主要是为儿童教育娱乐开发的,但我认为它在工业等领域也有一定应用潜力。例如,工业领域经常会有某些平面在实际作业中持续震动,导致零件过疲劳、平台失去稳定等问题。而这样的平台往往位于机器内部,从外部很…

asp.net core mvc Razor +dapper 增删改查,分页(保姆教程)

说明:本demo使用sqlserver数据库,dapper orm框架 完成一张学生信息表的增删改查,前端部分使用的是Razor视图, Linq分页 HtmlHelper。(代码随便写的,具体可以自己优化) //实现效果如下&#xff0…

Python爬虫教程——解析网页中的元素

前言: 嗨喽~大家好呀,这里是小曼呐 ~ 在我们理解了网页中标签是如何嵌套,以及网页的构成之后, 我们就是可以开始学习使用python中的第三方库BeautifulSoup筛选出一个网页中我们想要得到的数据。 接下来我们了解一下爬取网页信息…

Java 实现前端数据的导出操作

前端 <el-button class"export" type"primary" icon"el-icon-download" click"exportData()">导出</el-button>exportData() {//data 操作data 变成后端需要的格式let data {capacityVos: resultVo}this.$confirm("…

28 drf-Vue个人向总结-1

文章目录 前后端分离开发展示项目项补充知识开发问题浏览器解决跨域问题 drf 小tips设置资源root目录使用自定义的user表设置资源路径media数据库补充删除表中数据单页面与多页面模式过滤多层自关联后端提交的数据到底是什么jwt token登录设置普通的 token 原理使用流程解析 jw…

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…

git之merge和rebase的区别

准备 创建仓库 test-01文件 test-02文件 创建test01分支和test02分支 这里我们使用idea打开源代码 test02分支同操作 大致操作 test01分支对文件test01文件操作&#xff1a; 1.添加内容&#xff1a;test01第一次修改1 2.git commit 3.添加内容&#xff1a; test01第二次…

Arduino驱动DFPlayer Mini MP3模块

文章目录 Mini MP3模块简介产品参数引脚定义实验准备程序下载实物接线总结 Mini MP3模块 简介 DFPlayer Mini是一款小巧且价格低廉的MP3模块&#xff0c;可以直接接驳扬声器。模块配合供电电池、扬声器、按键可以单独使用&#xff0c;也可以通过串口控制&#xff0c;作为Ardui…

7.1 为什么要用函数

主要内容&#xff1a; 这段文字主要讲述了为什么要使用函数来进行程序设计&#xff0c;以及函数在程序设计中的重要性和作用。以下是这段文字的主要内容和要点&#xff1a; ### 1. **简化和清晰度** - 当程序规模较大&#xff0c;功能较多时&#xff0c;如果所有代码都写在主…