一文解读 SQL 生成工具

news2024/11/24 15:24:36

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.coloradmin.cn/o/1632880.html

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

相关文章

13 Linux实操篇-网络配置

第十三章 Linux实操篇-网路配置 13.1 Linux 网络配置原理图 13.2 查看网络IP 和网关 子网ip 与网关 13.3 查看Windows 中 VMnet8 和 Linux 的网络配置 查看Windows 中 VMnet8:ipconfig Linux 的网络配置: ifconfig 13.4 ping 测试主机之间网络连通性 基本语法&a…

教育装备展火热开幕,锐捷网络用科技力量点亮教育未来之光

了解教育装备行业发展新趋势、感受教育装备领域创新脉动。4月19日,一场汇聚智慧与创新的教育行业盛会——第 83 届中国教育装备展示会在山城重庆隆重启幕。位于N4013号的锐捷网络展位不仅汇聚了极简以太全光3.X、三擎云桌面2.X、极简教育城域网等前沿科技方案,更通过样机展示、…

ssl证书是怎么实现数据加密传输的?原理是什么?

SSL证书实现数据加密传输的过程大致可以分为以下几个步骤: 1. 握手阶段: - 客户端请求连接:当用户尝试访问一个HTTPS网站时,浏览器(客户端)会向服务器发起一个HTTPS请求,请求建立一个安全连接。…

通过iMock学习Jvmsandbox

Jvm-sandbox Jvm-sandbox基于Jvm-sandbox的Mock平台iMockiMock的工程学习iMock怎么写的(sandbox的module应该怎么写) Jvm-sandbox Jvm-sandbox是阿里开源的一款java的沙箱,看网上的介绍在沙箱里你可以做你能想到的奇妙的事情。 基于Jvm-san…

图题目:可以到达所有点的最少点数目

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:可以到达所有点的最少点数目 出处:1557. 可以到达所有点的最少点数目 难度 4 级 题目描述 要求 给定一个有向无环图,包含编…

Web3与智能合约:科技革新下的新金融时代

在当今数字化时代,Web3和智能合约正在共同塑造着金融领域的未来。Web3作为下一代互联网的重要组成部分,以其去中心化、安全性和透明性为核心特点,正推动着金融行业向着数字化和去中心化的方向发展。而智能合约作为Web3技术的关键应用之一&…

如何将本地项目上传到Github(SSH方式)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

OSPF基本配置

原理概述 OSPF 是一种应用非常广泛的基于链路状态的动态路由协议,它具有区域( Area )化的层次结构,扩展性好,收敛速度快,适合部署在各种规模的网络上。 在 OSPF 中,每台路由器都必须有一个 Router-I…

在线商城客服系统,多用户电商系统可API对接客服软件

在当今数字化时代,在线商城客服系统和多用户电商系统之间的无缝API对接已成为电商行业的重要趋势。这种整合为商家提供了更高效的客户服务和管理方式,提升了用户体验和业务效率。其中,商淘云电商客服系统作为一款强大的客服管理工具&#xff…

Java Swing游戏开发学习26

内容来自RyiSnow视频讲解 这一节讲的是Inventory背包,类似RPG游戏中人物角色放置装备、药品、武器、宝石等物品的一个若干行若干列的表格窗口。 可以显示装备物品,并选择它们。 前言 作者说这一节可能是第二部分里面爬起来最高的山峰。 效果 最后还有…

Unity3d 学习之按钮绑定事件

创建测试脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class myTest : MonoBehaviour {// Start is called before the first frame updatepublic Button _codeBindBtn null;void Start(){if (_codeBi…

IC设计数据传输 如何能保障安全高效?

IC(集成电路)设计数据,对于IC设计企业来说,其重要性不言而喻。所以IC设计数据传输过程中,其安全性和效率,也需要有保障。 首先我们来看看IC设计数据为什么重要,其重要性体现在多个方面&#xff…

远距离、高品质、低延迟、高保真——SA316无线音频模块带您探索新的音频体验

SA316系列产品分为发射端模块SA316S-TX,SA316F30和接收端模块SA316-RX,该系列方案采用了无线高品质的语音传输芯片来设计,它可以支持外部 PCM / IIS 双模数字音频接口,同时模块为客户提供了标准化的串行接口,使用者可通过串口指令…

C语言基础:初识指针(二)

当你不知道指针变量初始化什么时,可以初始化为空指针 int *pNULL; 我们看NULL的定义,可以看出NULL是0被强制转化为Void* 类型的0;实质还是个0; 如何避免野指针: 1. 指针初始化 2. 小心指针越界 3. 指针指向空间…

算法工程师——算法岗的分类及要求汇总

算法岗工程师 根据 Talent Seer 人才报告显示,全球 AI 从业者总人数约有 30 万,还是供不应求,其中 AI 技术专家(具有相关领域博士学位及 3 年以上工作经验的)约有 3.65 万。 简介 对于计算机专业的毕业生而言,算法岗基本上就是 「高薪」 的代名词。 在当今 IT 行业,算…

vue3.2+vite+unocss原子化配置

1、安装unocss:npm install unocss 2、vite.config.ts中配置: 3、创建unocss自己的ts文件:uno.config.ts 根路径下创建, 4、在创建好的uno.config.ts文件中编写如下代码: // uno.config.ts import {defineConfig,prese…

如果把软路由的网段更换成169.254.0.0/16会咋样?

前言 这几天有小伙伴在折腾软路由系统,然后问题就来了。 他咨询的是:为啥电脑连接软路由之后,无法访问软路由的管理页? 嗯。。。确实不是什么大事。但不注意看,还以为软路由没有正常获取到ip。 熟悉网络的小伙伴们都…

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计;以及抽样分布的概念,本篇将这种关系定量化,专门针对抽样的…

5V升8.4V2A同步升压恒压WT3213

5V升8.4V2A同步升压恒压WT3213 WT3213同步升压型直流/直流转换器以其微小的尺寸和卓越的能效而广受欢迎。这款设备在设计上的巧妙,包含电流模PWM控制环路、误差放大器、斜线补偿电路、比较器以及功率开关等关键元件,共同构成了它的特殊性能。 在细节上…

mysql-sql-练习题-1

文章目录 环境注释建表 5张建库学生表课程表教师表分数表总表 语法书写顺序in学过/没学过完全相同 环境 Windows cmd(普通用户/管理员) mysql -uroot -pmysql版本,模式(可自定义) select version(),global.sql_mode…