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…

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来生成指定范围内的随机整数或浮点数…

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…

孤举者难起,众行者易趋,openGauss 5.1.0版本正式发布!

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

Java获取给定月份的前N个月份和前N个季度

描述: 在项目开发过程中,遇到这样一个需求,即:给定某一月份,得到该月份前面的几个月份以及前面的几个季度。例如:给定2023-09,获取该月份前面的前3个月,即2023-08、2023-07、2023-0…

基于微信小程的流浪动物领养小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

IDEA 使用

目录 Git.gitignore 不上传取消idea自动 add file to git本地已经有一个开发完成的项目,这个时候想要上传到仓库中 Git .gitignore 不上传 在项目根目录下创建 .gitignore 文件夹,并添加内容: .gitignore取消idea自动 add file to git 在…

layuiselect设置为不可下拉选取

$("#exam").siblings(".layui-form-select").find("dl").remove(); 或 layuiSelectDisable($("#exam")); // 设置selet元素不可下拉选择function layuiSelectDisable(selectElem) {try {var dlElem selectElem.siblings(".layu…

通俗讲解深度学习轻量网络MobileNet-v1/v2/v3

MobileNet网络是由google团队在2017年提出的,专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络,在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%,但模型参数只有VGG的1/32)。MobileNet网络…

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序…