SQL解析利器General SQL Parser

SQLFlow:使用sqlparser解析血缘关系 在SQLFlow:在线解析SQL血缘关系(SQL Data Lineage)文章中,介绍了SQLFlow的基本使用。 经过研究发现,SQLFlow是基于SQL Parser实现的,具体可以看这个demo:https://github.com/sqlparser/gsp_demo_java/tree/master/src/main/java/demos/dlineage 下面我们尝试使用代码的方式,来解析血缘关系,看三个简单的例子: 从select语句中直接解析血缘关系 -- case 1 : my 阅读详情

最近发现一款很有意思的工具,名字叫GSP(全称General SQL Parser)。他是一款专业的SQL引擎,适用于各种数据库。
以下是他的官方网站:

http://www.sqlparser.com/

官网用大写加粗的字体给我们展示了他的强大:
这里写图片描述


我们可以用它来做很多事情,比如解析、格式化SQL等等。是不是很强大呢?我们马上用几个小例子来试验一下吧!

下载

首先这个工具是商业收费的,而且价格不菲。但是他提供了90天的实验版本供大家下载试用。
Java版本的下载地址:

http://www.sqlparser.com/dlaction.php?fid=gspjava&ftitle=General%20SQL%20Parser%20Java%20version

下载解压后,demos是一些实例,javadoc是Java帮助文档,还有UserGuide帮助手册,最重要的gsp.jar就是我们要build path到工程中的jar包了。
这里写图片描述

实例

下面我们写几个实例

一、检查语法

我们先讲讲下面的代码做了哪些事:
1. 定义一个简单的create语句(我们故意把name1的类型错误的设置成varchar2)
2. 创建一个MySQL解析器实例
3. 将sql语句传递给解析器
4. 解析器开始检查语法
5. 判断检查结果,0表示语法正确,1表示语法有错误,并获取返回的错误信息

检查语法的代码如下:

@Test
public void testCheckSyntax(){
    String sql = "create table emp1(id1 int,name1 varchar2(200),\n"
                + " money1 double(10,2),\n"
                + " PRIMARY KEY ( id1 ));";
    TGSqlParser mysqlSqlParser = new TGSqlParser(EDbVendor.dbvmysql);
    mysqlSqlParser.sqltext = sql;
    int rs = mysqlSqlParser.checkSyntax();
    if(rs == 0){
        System.out.println("语法正确!");
    }else{
        System.out.println("语法错误:"+mysqlSqlParser.getErrormessage());
    }
}

我们再看看控制台打印结果:

语法错误:syntax error(10102) near: ((1,41)
no_root_node(-1000) near: no root node(0,0)

正如我们所料,提示语法错误,错误的位置在第一行的41个字符,也就是我们的varchar2。

二、格式化SQL

通常我们编写的SQL语句有一些杂乱,虽然自己不觉得。在Navicat中我们可以很方便的用快捷键format,得到美观、便于阅读的SQL。用General SQL Parser,我们同样可以很容易做到。
我们先讲讲下面的代码做了哪些事:
1. 前三步和“检查语法”是一样的
2. 然后调用解析方法,注意是parse()方法
3. 实例化格式化工具类
4. 用格式化工具工厂类格式化SQL,获取结果

格式化SQL的代码如下:

@Test
public void testFormat(){
    String sql = "insert into emp(empno,empnm,deptnm,sal) select empno, empnm, dptnm, sal from emp where empno=:empno;\n" +
          "\n" +
          "select empno, empnm from (select empno, empnm from emp)";

    TGSqlParser sqlParser = new TGSqlParser(EDbVendor.dbvmysql);
    sqlParser.sqltext = sql;
    sqlParser.parse();

    GFmtOpt option = GFmtOptFactory.newInstance();
    String formatSQL = FormatterFactory.pp(sqlParser, option);
    System.out.println("格式化后的SQL:\n"+formatSQL);
}

我们再看看控制台的结果:
这里写图片描述
好吧,虽然比想象中的难看点,但至少做到了该换的行都换了,不该换的也换了。

三、提取多条SQL

通常我们一个sql文件中,不单单只有一条sql语句,并且一般会有很多注释,那我们怎么提取出每一条SQL语句呢?直接split(“;”),注释怎么处理呢?
用General SQL Parser,我们很简单便捷的做到。
我们看看我们需要做哪些:
1. 前三步还是和前面一样
2. 从解析器中获取statements
3. 遍历statements
4. 获取的TCustomSqlStatement就是每条sql实例
代码如下:

@Test
public void testStatement(){
    String sql = " -- 多条SQL语句; "
            + "alter table tab1 add (author_last_published2 date); -- 添加字段\n"//添加1个字段
            + " alter table tab2 add (author_last_published3 date, age number(10,2)); -- 添加两个字段\n"//添加多个字段
            + "drop table tab3; -- 删除表; \n";    //删表;
    TGSqlParser sqlParser = new TGSqlParser(EDbVendor.dbvmysql);
    sqlParser.sqltext = sql;
    sqlParser.parse();

    TStatementList stList = sqlParser.sqlstatements;
    System.out.println("共有条"+stList.size()+"sql语句!");
    for(int i=0; i<stList.size(); i++){
        TCustomSqlStatement customSt = stList.get(i);
        String tsql = customSt.toString();
        System.out.println("第"+(i+1)+"条sql:"+tsql);
    }
}

结果也是意料之中:

共有条3sql语句!
第1条sql:alter table tab1 add (author_last_published2 date);
第2条sql:alter table tab2 add (author_last_published3 date, age number(10,2));
第3条sql:drop table tab3;


四、还可以做哪些事

能做得还有很多很多,从demos的文件夹中就可以看到:
这里写图片描述

未完待续

学习demos中实例,更深入全面的了解这个强大的sql工具。
反编译看看这个工具时如何运行的。

hive sql 语法解析,最新版的ali druid sqlParserUtils 1.2.8 已经支持了 Hive sql (HQL)解析,已知的方法 有 jsqlparser - 失败了,不支持 hive 语法 hive-exec ,用 ParseDriver 和 ast token , 失败了,复杂语法不支持(奇怪,hive 服务器难道不是用的这个解析吗) 这里有一些 使用案例,人家用的好好的,可能是我们的姿势不对,待研究 优步 Uber 的queryparser,使用 haskell 语言开发,没有maven jar 包可用,算了,咱也不熟悉 gsp - general sql pa 阅读详情

相关推荐

深入解析MySQL SQL执行全链路:从语法解析到查询优化的完整流程

作为一名后端开发者,每天敲下无数条 SQL 语句,从简单的 SELECT * FROM users 到复杂的多表关联查询。我们习惯了在客户端工具里输入 SQL,点击执行,然后等待结果。但你是否曾停下来想过,从你敲下回车键到屏幕上显示出数据,这短短几百毫秒甚至几毫秒的时间里,MySQL 内部究竟发生了什么? 很多人对 MySQL 的理解停留在“增删改查”的层面,认为它只是一个存储数据的黑盒。面试时被问到“一条 SQL 是如何执行的”,也只会机械地背诵“连接器、分析器、优化器、执行器”这几个名词。但真正理解这条

weixin_33701294的博客 361

JSqlParser

1.定义:JSqlParser是一个SQL语句解析器。它将SQL转换为Java类的可遍历层次结构。2.工具地址:目前在github上开源。3.支持的数据库类型:支持Oracle,SqlServer,MySQL,PostgreSQL等常用数据库。但各种数据库系统的SQL语法都在动态变化,可以解析大部分(不是全部)。Github 官网截图:4.支持的语法类型:目前,JSqlParser最新版本为4.6(2023-2-24),支持的语法已在官网上做了全部列举(部分截图展示:)

OWMBL的博客 1万+

Java应用安全审计利器:Find Security Bugs注入漏洞检测器深度解析

静态应用安全测试(SAST)是保障软件安全的重要技术手段,它通过分析源代码或字节码,在不运行程序的情况下识别潜在安全漏洞。其核心原理是追踪数据流,检测不可信数据是否未经净化就流入危险接收点。这项技术的价值在于将安全专家的经验固化为自动化规则,实现安全左移,显著降低后期修复成本。在Java生态中,Find Security Bugs作为一款开源的SAST工具,专门针对注入类漏洞提供了强大的检测能力。它集成了超过32种检测器,覆盖SQL注入、命令注入、路径遍历、LDAP注入、XXE、表达式语言注入等多种场景,能

dengkuituo0680的博客 492

SQL 编译与执行 -parser

以上就是 KaiwuDB 的 SQL parser 词法解析和语法解析部分,主要是语法解析部分使用 Goyacc 工具将 sql.y 中的规则生成对应的语法分析器,将词法分析器生成的 token-stream 解析成制定好的树结构。

KaiwuDB 数据库 2159

XXE漏洞深度解析:原理、攻击与多语言防御实战

XML外部实体注入(XXE)是一种基于XML解析器配置不当的安全漏洞。其核心原理在于攻击者通过控制XML数据,诱导解析器加载恶意定义的外部实体,从而访问服务器本地文件、发起内部网络请求或造成拒绝服务。这项技术之所以危险,是因为它利用了XML标准中为数据交换设计的合法功能,却能在未充分验证的场景下,直接导致敏感信息泄露、服务器端请求伪造(SSRF)等严重后果。在Web应用、API接口、文档处理系统以及单点登录(SSO)等广泛场景中,只要涉及XML解析,就可能存在XXE风险。本文聚焦于XXE漏洞的完整攻击链条,

weixin_34203832的博客 292

Web安全三大核心漏洞:SSRF、XXE与文件上传的攻防实战解析

在Web应用安全领域,服务器端请求伪造(SSRF)、XML外部实体注入(XXE)和文件上传漏洞是当前最具威胁的三大核心攻击向量。这些漏洞的本质在于应用程序过度信任外部输入,攻击者借此利用服务器自身的权限和能力发起攻击,其危害往往从单一应用蔓延至整个内网环境。理解其原理是有效防御的前提:SSRF通过诱导服务器发起任意请求,成为攻击内网的跳板;XXE则利用XML解析器加载恶意外部实体,可导致文件读取、内网探测甚至远程代码执行;文件上传漏洞则因校验不严,为攻击者提供了上传并执行恶意代码的通道。从技术价值看,掌握这

weixin_33767813的博客 354

使用Druid SQL Parser解析SQL

在以前的博文《使用Spring Boot JPA Specification实现使用JSON数据来查询实体数据》中讲到了目前业务上的需求就是以前老系统是通过配置SQL去抽取一些业务数据的,但现在新系统想通过页面的一些配置化实现跟配置SQL一样去抽取数据。所以在之前的博文讲到了如何利用JPA Specification和构造的JSON数据去抽取数据。但是老系统很多历史数据都是用SQL去配置的,这些配置当然需要迁移到新系统,但是我们不可能手工一条条去把这些SQL转成当前的JSON结构,这样太浪费时间了。所以我的

C. 1万+

XXE漏洞靶场实战:从原理到攻防的Web安全实践指南

XML外部实体注入是一种基于XML解析器配置缺陷的安全漏洞。其核心原理在于XML规范允许文档在解析时通过DOCTYPE声明引入外部资源,当解析器未安全配置时,攻击者可利用此特性读取服务器敏感文件或发起内部网络请求。理解XXE漏洞对于构建安全的Web应用至关重要,因为它揭示了输入验证与解析器配置在安全体系中的基础性作用。在工程实践中,开发者常因使用老旧库、为特定功能开启危险选项或处理非标准XML数据时配置不当而引入风险。通过靶场环境进行实战演练,安全人员能深入掌握有回显文件读取、无回显数据外带及SSRF扩展等

dieyuqi2955的博客 455

MySQL SQL执行全链路解析:从Parser到Executor的完整生命周期

在数据库系统中,SQL语句的执行是一个从客户端请求到结果返回的复杂过程,其核心在于查询优化与执行引擎的高效协作。理解SQL执行原理,特别是解析器、优化器和执行器三大核心组件的工作机制,是进行数据库性能调优和问题诊断的基础。解析器负责将SQL文本转换为结构化的抽象语法树,优化器则基于统计信息和成本模型生成最优执行计划,而执行器通过调用存储引擎接口完成数据的实际存取。这一流程直接关系到索引设计、查询性能及系统资源利用效率。通过掌握执行计划分析工具如EXPLAIN,开发者可以精准定位慢查询瓶颈,优化索引策略,从而

weixin_33911824的博客 386

Web安全入门:九大常见漏洞原理与防御实战指南

在Web应用开发与运维中,安全是构建可靠系统的基石。其核心原理在于理解客户端与服务器之间的信任边界,以及数据在传输与处理过程中可能被恶意利用的环节。从技术价值看,有效的安全防护不仅能保护用户数据和业务资产,更是企业技术信誉与合规性的重要保障。常见的应用场景涉及用户登录、数据交互、文件上传、业务支付等几乎所有在线功能。本文聚焦于SQL注入与跨站脚本攻击(XSS)等基础但危害巨大的漏洞类型,深入剖析其产生机制,并提供从输入验证、参数化查询到内容安全策略(CSP)等工程实践层面的防御方案,旨在帮助开发与运维人员建

java天气 440

XXE漏洞原理与防御:从XML实体注入到Pikachu靶场实战

XML外部实体注入(XXE)是一种基于XML解析过程的安全漏洞,其核心原理在于应用程序在解析用户可控的XML数据时,未对外部实体加载进行严格限制。攻击者通过构造恶意DTD,利用SYSTEM关键字声明指向外部资源(如本地文件、内网服务)的实体,当XML解析器处理该文档时,便会尝试读取并注入这些资源内容,从而实现敏感信息泄露、内网探测甚至远程代码执行。在Web安全领域,XXE常与文件读取、内网渗透等攻击链结合,危害性巨大。通过Pikachu靶场等实验环境,安全人员可以深入理解XXE在回显型、无回显(Blind)

weixin_30781433的博客 365

DBX:基于Rust+Tauri的轻量级跨平台数据库管理工具架构解析

数据库GUI工具是开发者日常高频使用的基础设施,其核心诉求在于低资源占用、高响应确定性与跨平台一致性。传统Java或Electron架构常因JVM启动开销、Chromium内核冗余及JS桥接序列化导致内存暴涨与交互延迟。而Rust凭借零成本抽象与内存安全特性,结合Tauri提供的原生WebView集成能力,为构建轻量、健壮、可预测的数据库客户端提供了新范式。DBX正是这一技术路径的典型实践——它将SQL执行、连接池管理、类型推断等关键逻辑全置于Rust侧,前端仅作指令下发与渲染,辅以Docker原生支持实现

weixin_34387468的博客 276

LlamaIndex核心原理:面向RAG的数据框架设计与工程实践

RAG(检索增强生成)是将私有数据与大模型能力结合的关键范式,其本质是构建一条从原始文档到语义化上下文的可控数据链路。LlamaIndex并非通用应用框架,而是专注‘数据如何进、存、找、喂’的文档智能引擎,其核心在于模块化的数据管道设计、原子化的Node语义单元抽象,以及可编程的QueryEngine查询流程。它通过分块策略、元数据注入、混合检索、重排序等机制,显著提升非结构化数据在专业场景(如合同审查、知识库问答)中的召回精度与响应可控性。本文深入解析LlamaIndex作为生产级RAG数据框架的底层逻辑

clt3617的博客 351

豆瓣电影Python数据分析与可视化毕业设计全链路实战

在Python数据分析与Python数据可视化项目中,完整数据链路通常由采集、清洗、存储、接口聚合和前端图表组成。其原理是用爬虫获取静态页面数据,借助pandas完成字段拆分、去重与缺失值处理,再落入MySQL形成结构化表,随后通过Flask提供聚合JSON接口,最终由ECharts渲染评分分布、类型TOP和年份趋势等图表。这样的工程化链路能把爬虫采集、pandas数据清洗、MySQL入库、Flask接口与ECharts可视化串成可复现骨架,适用于豆瓣电影榜单分析、课程设计和毕业设计看板搭建。围绕豆瓣电影P

weixin_33805743的博客 233

LangChain+LlamaIndex+AutoGen+LangGraph框架对比

大模型框架对比

usa_washington的博客 1589

Linux内核安全与入侵检测实战:Capabilities、Seccomp与Auditd深度应用

在Linux系统安全领域,强制访问控制(MAC)和入侵检测是构建纵深防御体系的核心技术。其原理在于通过细粒度的权限管理和系统行为监控,实现对潜在威胁的精准识别与遏制。从技术价值看,这不仅能有效遵循最小权限原则,降低攻击面,还能为安全事件响应提供关键取证依据。在应用场景上,无论是云原生环境下的容器安全、服务器加固,还是应对自动化攻击,这些基础能力都至关重要。本文聚焦于Linux内核提供的Capabilities权能机制、Seccomp系统调用过滤以及Auditd审计框架,通过实战案例解析如何利用这些原生工具进

dianxiangong2403的博客 279

XXE与Java反序列化漏洞:原理、挖掘与防御实战

在Web安全领域,数据解析与对象序列化是支撑现代应用通信与数据持久化的基础技术。XML作为广泛使用的数据交换格式,其解析器在处理外部实体时若配置不当,可能引发XXE漏洞,导致敏感文件读取或内网探测。Java反序列化机制则通过字节流重建对象,但危险类库的自动方法调用可能形成利用链,最终实现远程代码执行。这些漏洞的技术价值在于它们往往绕过传统安全检测,直接威胁服务器底层安全。在应用场景中,XXE常见于XML接口、文件上传解析等场景,而Java反序列化则多出现在RMI、JMX服务及特定HTTP参数中。本文聚焦XX

culi4814的博客 890

NC数据预处理避坑指南:从MATLAB读取到GeoTIFF导出,解决坐标翻转与值域异常

本文详细解析了NC数据预处理中的常见问题,包括MATLAB读取时的坐标翻转与GeoTIFF导出时的值域异常。通过实战案例,介绍了如何解决矩阵方向错乱、处理FillValue与scale_factor、精准移植空间参考等关键问题,帮助研究者高效完成气象数据的批量处理与GIS兼容性验证。

weixin_30788619的博客 653
上一篇: 从零开始了解MySQL索引
下一篇: MySQL表名大小写敏感导致的问题
postnull咖啡
博客等级 码龄10年 1026粉丝 59原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值