一文解读 SQL 生成工具

SQL 生成工具可用于测试 Parser 与其他数据库产品的兼容性,通过解析 YACC 语法文件中的产生式,生成对应的 SQL 语句,再使用数据库执行该 SQL,根据结果判断语句是否与其他数据库语法兼容。

01工具使用

语法文件预处理

预处理目的是将语法文件中无关的内容去除,只保留各个语句的产生式,可以通过命令 bison -v sql.y 获取语法文件中的语法规则(不带 Action),然后再去除生成文件中的无用部分,如终结符列表、非终结符列表、状态转换表等,如下所示:

图片

生成的 sql.output 文件内容如下,我们仅保留其“语法”一节:

图片

图片

无用的 section,需要移除

保留的 section

注:对于保留的“语法” 一节,还需要去除其序号。

对于上述过程,我们通过预处理脚本 preprocess.sh 进行封装,使处理后的文件满足工具的要求。生成的文件形式如下,输出的 .output 文件即为预处理后的语法文件。

图片

图片

SQL 语句生成

生成符合条件的语法文件后,即可使用工具生成 SQL。

工具支持如下参数:

•-b:指定语法文件,必选。语法文件为 preprocess.sh 脚本处理后的产生的文件

•-n:指定待生成的产生式名称,必选

•-R:随机生成模式,可选,默认为枚举模式

•-o:指定生成 SQL 语句的保存文件,可选,默认为 report.csv

•-N:限制生成 SQL 条数,可选,默认不限制

02 工具实现

该工具包含两个 package:yacc_parser和sql_generator,分别负责完成 Token 解析和 SQL 生成。

产生式的表示方法

type SeqInfo struct {Items []string
}
type Production struct {Head  string    // 产生式头部Alter []SeqInfo     // 产生式 body
}

Token 解析

函数 Tokenize 用于将读取的语法文件中的字符 Token 化,每次调用将返回一个 Token。该函数仅处理了简单的分隔符和引号,并未实现标准词法分析器的正则匹配。

Parse 函数调用 Tokenize 函数,每次返回一个 Token,返回后 Parse 函数根据当前状态和 Token 类型,将一连串的 Token 组装成 Production。

SQL 生成

SQL 生成有两种模式:

1、是遍历 Production 中指定产生式的 body 列表,枚举生成 SQL 语句;

2、随机选择 Production 中指定产生式的 body 列表,随机生成 SQL 语句。

1、枚举

枚举的实现方式是使用一个链表保存待 resolve 的Token,每次从链表头取一个 Token,并自增该 Token出现的次数,再根据其每个子表达式中 Token 在记录中出现次数是否大于指定次数,筛选可以继续推导的子表达式。

另一方面使用了两个数组记录当前所取的子表达式的下标(choice)和当前最大子表达式下标(max)进行记录,以便下一次自增 choice 取下一个表达式。

经过筛选后,选取 choice 位置的产生式右部子表达式并将其全部 Token 插入链表头部,然后判断头部是否为 literal 或 keyword,如果是则取出头部放入 SQL 数组,如果不是则继续循环处理链表。

当处理到当前产生式末尾时(判断方式为 choice>max),此时将尝试“进位”,即记录的当前所取的位置数组最后一位自增。

比如:max 数组为 1 2 1 3,choice 数组为 0 0 0 3,则进位后 choice 数组为 0 0 1 0,表示最后一个位置已全部遍历,现在要将倒数第二位自增,最后一位置零,继续下一次排列组合的读取。

生成过程则是通过递归实现,例如针对以下这条产生式,处理逻辑如图所示:

在这里插入图片描述

根据记录的 choice 值,选择产生式的第 choice 条子表达式,直到生成一条 SQL。然后再将choice数组进位,继续下一轮选择。

图片

2、随机

随机生成模式与枚举生成模式类似,区别在于其并不会顺序遍历产生式 body 列表中每个 Token,而是随机选择一个 Token 作为组成 SQL 的一部分。

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

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

相关文章

notion使用小tip(待补充)

可以替代思维导图是一个很棒的软件 公式编辑:latex 网站链接:LATEX语法 一些常用的用法: 下标:a_{Si} 分数:\frac{}{} 乘:\times 向量:\vec{} pai (3.14159…) : \pi 直接用公式编辑器&#…

MATLAB使用贝叶斯网络bnt工具箱:使用手册详解

MATLAB构建贝叶斯网络bnt工具箱: 贝叶斯网络(Bayesian networks)相关网页资源介绍1 工具包安装2 创建贝叶斯网络2.1 图结构(Graph structure)2.2 创建贝叶斯网络外壳(Creating the Bayes net shell)2.3 创建贝叶斯网络2.3 参数2.4 随机参数2 推断(Inference)2.1 边缘分…

【kettle005】kettle访问Oracle数据库并处理数据至execl文件(已更新)

1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下Oracle数据库相关知识体系 3.欢迎批评指正,跪谢一键三连&am…

全栈从0到1 3D旅游地图标记和轨迹生成

功能演示 演示视频 体验地址 Vercel App 开发技术栈: NextJs(前端框架)React(前端框架)TailwindCSS (CSS样式)echart echart gl (地图生成)shadui(UI组件…

Nginx自定义状态码499出现原因

499状态码定义 维基百科的定义 499 Client Closed Request (Nginx) Used in Nginx logs to indicate when the connection has been closed by client while the server is still processing itsrequest, making server unable to send a status code back 499状态码是nginx自…

Vue2 和 Vue3 的区别 (性能,编码方式,API 特性,源码)

在这个快节奏的时代,技术更新换代的速度也越来越快。我一直在使用Vue 2来开发项目。然而,现在越来越多的公司转向了Vue 3,并将其作为主要的前端开发框架。这就需要我们及时跟进新技术的发展,以保持竞争力。因此,我决定…

C语言阶段性测试错题纠正与拓展

引言:在2024年4月26日,我进行了C语言知识的“期末考试”。通过这次考试,我发现了我的知识漏洞。所以,我写下这篇博客来记录我的错题,并进行纠正,然后对于以前遗忘知识的回顾。 更多有关C语言的知识详解可前…

HarmonyOS编程实践系列:第一节 - 创建健康App欢迎页

系列文章目录 (零)鸿蒙HarmonyOS入门:如何配置环境,输出“Hello World“ (一)鸿蒙HarmonyOS开发基础 (二)鸿蒙HarmonyOS主力开发语言ArkTS-基本语法 (三)鸿蒙…

梳理一下低代码的真正价值!另推荐超好用的5款低代码开发平台

一、先来聊聊低代码的真实价值! 在回答这个问题之前,我们不妨先来看两个案例: 某连锁商超企业在发展中产生了新的业务需求,一是希望能够快速展示门店销售数据,满足高层的管理需求;二是希望巡店、上架商品…

字典及GitHub字典爬取工具

红队API接口Fuzz字典可以用于WEB安全,渗透测试,SRC等场景 完整文件已上传知识星球,需要的朋友可加入查看。

Jitter 和相位噪声

近期学习PLL的时候,发现里面有诸多jitter类型,绕晕了,写个帖子记录一下学习过程。 目录 基本jitter和相噪概念 jitter 相位噪声 相位噪声和jitter之间的联系 三种常见的抖动类型及其特点 基本jitter和相噪概念 无噪声振荡器的输出是一…

状态模式

文章目录 1.UML类图2.状态基类3.状态实现类3.状态机管理类使用示例 1.UML类图 2.状态基类 public abstract class State {public string? Name { get; set; }public StateMachine? StateMachine {get; set;}public abstract void Exit();public abstract void Enter(); }3.…

生成删除数据库表数据的SQL语句

--获取表的名称及用表中第一列的注释作表的说明 select delete from ,Name2 ,--,RANK()OVER (ORDER BY Name2 DESC) as 序号,字段说明 from ( select bb.name as Name2,cc.* from ( select min(minor_id) as minor_id,id from ( SELECT g.minor_id minor_id,a.Name as Name …

解析vue.config.js文件

一、用途 创建 Vue 项目时,默认情况下是没有 vue.config.js 文件的。Vue CLI 会提供一组默认的配置,用于构建和开发项目,这些配置在内部被封装好了,并不需要用户手动创建 vue.config.js 文件来进行配置。通过在项目根目录下创建 …

重生奇迹MU首饰属性之迷

雷:抵抗移位、掌心雷 冰:抵抗冰度冻、冰封问箭、暴风雪、冰封 毒:降低中毒几率(中毒不掉血)、毒咒、毒炎 风:抵抗移位旋风斩(没试过不过很多人用)、龙卷风 至于火水地因为并没有…

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者,如图所示。这样就不存在多个提议者同时提交提案的情况,也就不存在提案冲突的情况了。这里补充一点:在论文中…

NAT网络地址转换实验(思科)

华为设备参考:NAT网络地址转换实验(华为) 一,技术简介 NAT(Network Address Translation),即网络地址转换技术,是一种在现代计算机网络中广泛应用的技术,主要用于有效管…

游戏新手村23:游戏数据分析都是谁在看数据

不管是做端游页游还是手游,不管是做市场广告投放还是游戏运营,都需要看数据。有的人说“数据会说话”,也有人说“数据会说谎”,有的人言必谈大数据,有的人则能善于从细小的数据着手发现问题。 我知道和了解的一些游戏…

react怎么只让接口请求一次

在React中,确保接口只请求一次通常涉及到组件的生命周期和状态管理。以下是一些常用的策略: 使用组件的useEffect钩子(函数组件): 如果你使用的是函数组件,你可以使用useEffect钩子来发起请求,并确保它只在…

SpringBoot - java.lang.NoClassDefFoundError: XXX

问题描述 以 json-path 为例:java.lang.NoClassDefFoundError: com/jayway/jsonpath/Configuration 原因分析 编译不报错,但是运行时报错。 遇到这样类似的问题,首先就要想到是不是 Jar 包冲突引起的,或者引入的不是理想的 Jar…