一文解读 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 生成。产生式的表示方法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 数组如果不是则继续循环处理链表。当处理到当前产生式末尾时判断方式为 choicemax此时将尝试“进位”即记录的当前所取的位置数组最后一位自增。比如max 数组为 1 2 1 3choice 数组为 0 0 0 3则进位后 choice 数组为 0 0 1 0表示最后一个位置已全部遍历现在要将倒数第二位自增最后一位置零继续下一次排列组合的读取。生成过程则是通过递归实现例如针对以下这条产生式处理逻辑如图所示根据记录的 choice 值选择产生式的第 choice 条子表达式直到生成一条 SQL。然后再将choice数组进位继续下一轮选择。2、随机随机生成模式与枚举生成模式类似区别在于其并不会顺序遍历产生式 body 列表中每个 Token而是随机选择一个 Token 作为组成 SQL 的一部分。最后下方这份完整的软件测试 视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。