SQL血缘解析原理

根据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.mzph.cn/news/91253.shtml

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

相关文章

[vue-admin-template实战笔记]

1.克隆项目 git clone gitgitee.com:panjiachen/vue-admin-template.git 2.安装依赖 npm install 3.运行项目就会自动打开网页,并且热部署插件 npm run dev 4.查看代码 //将vue-admin-template拖入到idea中即可查看代码 1)并且发现,常用的东西已经集…

Machine Learning(study notes)

There is no studying without going crazy Studying alwats drives us crazy 文章目录 DefineMachine LearningSupervised Learning(监督学习)Regression problemClassidication Unspervised LearningClustering StudyModel representation&#xff08…

unity 鼠标标记 左键长按生成标记右键长按清除标记,对象转化为子物体

linerender的标记参考 unity linerenderer在Game窗口中任意画线_游戏内编辑linerender-CSDN博客 让生成的标记转化为ARMarks游戏对象的子物体 LineMark.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineMark : MonoBeh…

v-model

面试题:请阐述一下 v-model 的原理 v-model即可以作用于表单元素,又可作用于自定义组件,无论是哪一种情况,它都是一个语法糖,最终会生成一个属性和一个事件 当其作用于表单元素时,vue会根据作用的表单元素…

erlang练习题(四)

题目一 传入列表 L1[K|]、L2[V|]、L3[{K,V}|_],L1和L2一一对应,L1为键列表,L2为值列表,L3为随机kv列表, 将L1和L2对应位合并成KV列表L4,再将L3和L4相加,相同key的value相加 如:L…

思科、华为、华三、锐捷网络设备巡检命令

下面为四种设备巡检命令,以便日常查阅: 华三 screen-length disable 取消分页 displayversion 查看版本 display clock 查看日期时钟 display fan 查看风扇状态 display power 查看电源信息 display cpu-usage 查看CPU利用率 display memory 查看…

excel筛选后求和

需要对excel先筛选,后对“完成数量”进行求和。初始表格如下: 一、选中表内任意单元格,按ctrlshiftL,开启筛选 二、根据“部门”筛选,比如选择“一班” 筛选完毕后,选中上图单元格,然后按alt后&…

JavaScript Web APIs第一天笔记

复习: splice() 方法用于添加或删除数组中的元素。 **注意:**这种方法会改变原始数组。 删除数组: splice(起始位置, 删除的个数) 比如:1 let arr [red, green, blue] arr.splice(1,1) // 删除green元素 consol…

Unity如何生成随机数(设置种子)

文章目录 随机类整数二维向量三维向量种子其他文章 随机类 我们可以使用Random类来生成一些随机数 Random类是用于生成随机数的类之一。它可以用于生成不同类型的随机数,如整数、浮点数和向量。 整数 我们可以使用Random.Range来生成指定范围内的随机整数或浮点数…

两台服务器间进行文件传输

目录 方法1:使用SCP 方法2:使用rsync 使用SSH密钥 两台服务器之间进行文件传输通常可以使用SCP(Secure Copy Protocol)或rsync命令。这两种方法都是在UNIX和Linux系统上常用的工具,用于安全地复制文件和目录。以下是…

[python 刷题] 875 Koko Eating Bananas

[python 刷题] 875 Koko Eating Bananas 题目: Koko loves to eat bananas. There are n piles of bananas, the ith pile has piles[i] bananas. The guards have gone and will come back in h hours. Koko can decide her bananas-per-hour eating speed of k. …

基于Yolov8的工业端面小目标计数检测(2):Gold-YOLO,遥遥领先,超越所有YOLO | 华为诺亚NeurIPS23

💡💡💡本文独家全网首发改进:提出了全新的信息聚集-分发(Gather-and-Distribute Mechanism)GD机制,Gold-YOLO,替换yolov8 head部分 实现暴力涨点 Gold-YOLO | 亲测在工业端面小目标计数涨点明显,原始mAP@0.5 0.936提升至0.945 layers parametersGFLOPs mAP50mAP…

数据库插入数据

数据库插入数据可以使用SQL语言完成,常用的语句是INSERT INTO。 例如,在一个名为“students”的表中,有三个字段(id,name,age),需要插入一条新的数据,可以使用以下语句&a…

Windows 安装CMake

CMake 简介 CMake是一个开源的、跨平台的自动化构建系統,用來管理软件构建的过程。 其用途主要包括: 1. 跨平台编译:CMake支援Windows,Mac OS,Linux等多种操作系統,且支援多数主流编译器如GCC&#xff0…

智能合约漏洞,Dyna 事件分析

智能合约漏洞,Dyna 事件分析 1. 漏洞简介 https://twitter.com/BlockSecTeam/status/1628319536117153794 https://twitter.com/BeosinAlert/status/1628301635834486784 2. 相关地址或交易 攻击交易 1: https://bscscan.com/tx/0x7fa89d869fd1b89e…

【STL巨头】set、map、multiset、multimap的介绍及使用

set、map、multiset、multimap的介绍及使用 一、关联式容器二、键值对键值对概念定义 三、setset的介绍set的使用set的模板参数列表set的构造set的迭代器set的容量emptysize set的修改操作insertfind && erasecountlower_bound 和 upper_bound Multiset的用法 四、mapm…

inndy_echo

inndy_echo Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)32位,只开了NX int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {char s; // [espCh…

Unity2023打包首包从78Mb到3.0Mb-震惊-我做对了什么

(全程并没有使用AssetBundle , 历史原因,Resources目录还有不少资源残留) 曾经的我在2019打包过最小包10m左右,后来发现到了Unity2020之后暴增到40m,又加上2023版本URP,1个Unity输出包可能至少55M 如下图…

华为智能高校出口安全解决方案(3)

本文承接: https://qiuhualin.blog.csdn.net/article/details/133267254?spm1001.2014.3001.5502 重点讲解华为智能高校出口安全解决方案的攻击防御&安全运维&日志审计的部署流程。 华为智能高校出口安全解决方案(3) 课程地址攻击防…

基于Vue+ELement实现增删改查案例与表单验证(附源码)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…