一文解读 SQL 生成工具
SQL 生成工具可用于测试 Parser 与其他数据库产品的兼容性,通过解析 YACC 语法文件中的产生式,生成对应的 SQL 语句,再使用数据库执行该 SQL,根据结果判断语句是否与其他数据库语法兼容。
01 工具使用
语法文件预处理
预处理目的是将语法文件中无关的内容去除,只保留各个语句的产生式,可以通过命令 bison -v sql.y 获取语法文件中的语法规则(不带 Action),然后再去除生成文件中的无用部分,如终结符列表、非终结符列表、状态转换表等,如下所示:
生成的 sql.output 文件内容如下,我们仅保留其“语法”一节:
注:对于保留的“语法” 一节,还需要去除其序号。
对于上述过程,我们通过预处理脚本 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,表示最后一个位置已全部遍历,现在要将倒数第二位自增,最后一位置零,继续下一次排列组合的读取。
生成过程则是通过递归实现,例如针对以下这条产生式,处理逻辑如图所示:
show_tables_stmt: SHOW TABLES FROM name '.' name with_comment |
根据记录的 choice 值,选择产生式的第 choice 条子表达式,直到生成一条 SQL。然后再将choice数组进位,继续下一轮选择。
2、随机
随机生成模式与枚举生成模式类似,区别在于其并不会顺序遍历产生式 body 列表中每个 Token,而是随机选择一个 Token 作为组成 SQL 的一部分。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
1Panel 应用推荐:frp 内网穿透工具
1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店,精选各类高质量的开源工具和应用软件,为用户的应用安装与升级操作提供便利。 目前,1Panel应用商店已经上架了超过100款精品软件并且定期更新维护,基本涵盖了大部分用户的基本装机需求。自2024年1月起,1Panel开源项目组特别开设“应用推荐”专栏,为大家推荐1Panel应用商店中的宝藏开源软件。 本期推荐应用 frp内网穿透工具 -官方网站- https://gofrp.org/ -开源许可协议- Apache-2.0 license -应用描述- frp是一款专注于内网穿透的高性能反向代理应用,允许您将位于NAT或防火墙后面的本地服务器暴露给 Internet。frp目前支持TCP、UDP、HTTP和HTTPS等协议,可以将请求通过域名转发到内部服务。 -开发语言- Golang -上架版本- v0.57.0 -GitHub Star...
- 下一篇
6个实例带你解读TinyVue 组件库跨框架技术
本文分享自华为云社区《6个实例带你解读TinyVue 组件库跨框架技术》,作者: 华为云社区精选。 在DTSE Tech Talk 《手把手教你实现mini版TinyVue组件库》的主题直播中,华为云前端开发DTSE技术布道师阿健老师给开发者们展开了组件库跨框架的讨论,同时针对TinyVue组件库的关键技术进行了剖析,并通过项目实战演示了一份源码编译出2个不同Vue 框架的组件。最后针对框架间的差异,也给出了相应的技术方案,帮助开发者们实战完成组件库跨框架。 直播链接:https://bbs.huaweicloud.com/live/DTT_live/202404171630.html 一、手把手带你实现mini 版 TinyVue 当前实现组件库的跨框架技术,是提升Web页面开发效率与应用灵活性的重要手段。本次直播的实战环节,用300行代码模拟了 TinyVue 组件库的跨框架实现,开发者可以在mini 版组件库中,复现跨框架及多端适配两大功能。同时通过本期的实操环节,也给开发者呈现一个明确且详尽的实现流程,协助大家更好的理解并掌握跨框架技术并运用到实际工作中。 具体源码可参考:ht...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6