前言
在上一篇文章 ShardingSphere 联邦查询 GROUPING 聚合结果问题分析中,我们详细介绍了联邦查询引擎实现 GROUPING 聚合函数存在的问题,当时笔者曾提到 SQLacner 测试工具,它能够通过一些科学的方法来发现 SQL 逻辑问题,帮助提升联邦查询引擎的 SQL 支持度。本文将为大家详细介绍 SQLacner 测试工具,以及工具中内置的几种测试方法,然后我们会使用 SQLacner 工具,直接对联邦查询引擎进行测试,看看这个工具是否能够达到预期的测试效果,发现一些有价值的 SQL 漏洞。
什么是 SQLacner
SQLacner 项目,是由 Manuel Rigger 教授创建的,旨在发现数据库 SQL 引擎的逻辑 BUG,Manuel Rigger 教授曾在 Andy 组织的线上分享中介绍过 SQLacner,感兴趣的朋友可以观看 Finding Logic Bugs in Database Management Systems 视频了解。
SQLancer is a tool to automatically test Database Management Systems (DBMSs) in order to find bugs in their implementation. That is, it finds bugs in the code of the DBMS implementation, rather than in queries written by the user. SQLancer has found hundreds of bugs in mature and widely-known DBMSs.
根据官方文档介绍,SQLancer 是一款用于自动测试数据库管理系统的工具,用于查找数据库实现逻辑中的错误。它查找的是 DBMS 实现代码中的错误,而不是用户编写 SQL 中的错误。目前,SQLancer 已在众多主流的 DBMS 中发现了数百个错误。
下图展示了一个具体的逻辑错误:当用户输入 SQL 语句查询数据时,原本数据库中存在 2 条匹配的数据,但由于数据库的 SQL 引擎存在逻辑错误,最终只返回了 1 条数据。除了少返回数据行外,逻辑错误还包含:错误返回过滤条件外的结果,返回的数据行内容错误等。

数据库逻辑错误相比于语法错误危害性更大,语法错误会在执行阶段通过异常码反馈出来,中断当前的 SQL 执行,逻辑错误则会返回不正确的查询结果,用户无法通过任何信息识别出当前的逻辑错误,最终可能会导致严重的业务错误。
使用 SQLancer 测试工具,可以快速发现 SQL 逻辑问题,帮助提升 SQL 引擎的正确性,下面我们将分别介绍 SQLancer 常用的几种测试方法,看看这些方法是如何检测 SQL 逻辑问题。
PQS 测试方法
PQS 全称为 Pivoted Query Synthesis(枢轴查询合成),该方法详细的介绍可以参考论文——Testing Database Engines via
Pivoted Query Synthesis。它的核心思想是:随机选择一条记录(即枢轴记录),然后基于这条记录生成过滤条件和查询语句,再去 DBMS 中执行查询,如果 DBMS 返回的结果集没有包含这条记录,则说明 DBMS 存在问题。

上图展示了 PQS 测试方法的详细步骤,总结下来包括如下 7 个步骤:
- 随机生成一些表(
t0和t1表)和数据行(t0表c0:3, c1:TRUE数据行,t1表c0:-5数据行); - 从每张表中随机的选择一行数据,将这行数据作为基准行;
- 基于选择的基准行,随机生成表达式,并根据基准行的值计算出表达式结果;
- 根据表达式的计算结果调整表达式,直到表达式的计算结果为
TRUE,例如:上图步骤 3 中表达式计算结果为FALSE,步骤 4 中通过增加NOT将计算结果调整为TRUE; - 基于表达式随机生成查询语句,表达式使用在查询的
WHERE或者JOIN子句中,查询语句会返回基准行对应的列(SELECT t0.c0, t0.c1, t1.c0); - 将查询语句提交到 DBMS 中执行,获取返回的结果集;
- 校验结果集是否包含最初选择的基准行,如果不包含,说明 DBMS 可能存在缺陷。
TODO
NoREC 测试方法
TODO
TLP 测试方法
TODO
DQE 测试方法
TODO
联邦查询测试实战
SQLancer 测试 java -jar sqlancer-*.jar --num-threads 4 --port 3307 --username root --password root mysql
TODO
欢迎关注
欢迎关注「端小强的博客」微信公众号,会不定期分享日常学习和工作经验,欢迎大家关注交流。

