写点什么

CnosDB 成为首个产品支持 SQLancer 的云原生时序数据库

作者:CnosDB
  • 2023-02-19
    内蒙古
  • 本文字数:3066 字

    阅读完需:约 10 分钟

CnosDB成为首个产品支持SQLancer的云原生时序数据库

通过使用 SQLancer,CnosDB 技术团队不仅找到并修正产品查询的逻辑错误;并且帮助上游项目构建更稳定的查询引擎;CnosDB 也成为了首个产品支持 SQLancer 的云原生时序数据库。


1.CnosDB 已支持 SQLancer

充分、全面的测试是保障数据库管理系统正确性的关键,查找逻辑错误是构建可靠的数据库的重要组成部分。CnosDB 不光关注性能的极致释放,也同样关心结果的正确性和可重复性。


SQLancer,全称为 Synthesized Query Lancer,该工具是一款针对数据库管理系统 DBMS 的自动化安全测试工具。该工具可以帮助广大研究人员轻松识别应用程序实现中的逻辑漏洞。我们这里所指的逻辑漏洞,即能够导致 DBMS 获取错误结果集的安全漏洞(比如说忽略数据记录等等)。SQLancer 的工作是强调数据库系统返回不一致或不合逻辑的结果。它用 Java 编写,已经支持多款数据库,包括 SQLite、MySQL、PostgreSQL、ClickHouse 等。

SQLancer 简介,截图来源 SQLancer GitHub(github.com/sqlancer/sqlancer)

近期 CnosDB 团队及开源社区为 CnosDB 实现了 SQLancer 所支持的 TLP、NoREC 两种测试方案,并合并到上游的 main 分支之中,成为首个支持 SQLancer 的云原生时序数据库。

2.CnosDB 实现 SQLancer

SQLancer 的 CnosDB 实现目前使用的是 Restful API,并根据 CnosDB 提供的数据类型生成 SQL 表达式,能生成聚合查询,关联查询的 SQL。表达式包括算术运算和支持的大部分函数。接下来我们会讲解 SQLancer 的执行步骤和 SQLancer 的具体检测方法。

2.1.SQLancer 的执行步骤

SQLancer 的主要执行步骤有以下五个阶段,分别是:

1.通过连接器,连接 CnosDB。

2.在 CnosDB 中创建数据库。

3.在 CnosDB 中创建几张表。

4.往 CnosDB 表中插入数据,插入的数据是常量,往往是一些边界数据。比如最大的整数,负数,还有各种奇怪的 UTF8 字符串。

5.执行所选择的检测方法。


2.2CnosDB 支持 SQLancer 的检测方法

CnosDB 现阶段支持 TLP 检测和 NoREC 检测两种方法。

2.2.1TLP 检测方法

TLP 是 Ternary Logic Partitioning 的缩写,TLP 是一种在数字电路设计中使用的技术,其中信号可以被分配到三个状态之一:1,0,或者未定义(X)。这种技术可以用于表示不确定性或不完整性,并且可以有助于缩小电路的实现复杂度。在数据库查询之中,就是将一个 Query 分成了三个 Query,执行结果分别为 TRUE,FALSE 和 NULL,然后再将这三个 Query 的结果合并,并且保证结果为 TRUE。通过这种方式,再跟原始的结果对比,发现是否不一致。

TLP 的步骤如下:

1.从数据库中随机选择几张表;在选出的表中,随机选择几列。

2.生成一个基本的不带 WHERE 子句的 SQL 语句,并生成 WHERE 子句。

3.根据生成的 WHERE 子句,在基本 SQL 语句上添加 IS TRUE、IS FALSE、IS NULL 的谓词,合成三个 SQL 语句。

4.通过 UNION 将三个 SQL 语句合并为一个。

5.执行基本 SQL 语句和 UNION 后的 SQL 语句。

6.对结果行数进行比对,如果出现行数不同的情况,则说明出现异常。

2.2.2NoREC 检测方法

NoREC 是 Non-Optimizing Reference Engine Construction 的缩写,是一种不进行优化的引擎构建方法。这种方法的目的是提供一种简单的、不受优化限制的参考实现,以便在其他优化的引擎和算法中进行对比。这种方法通常没有考虑性能和效率,并且只是为了证明概念的正确性。NoREC 的检测就是将一条优化的 Query,强制变成非优化的方式,然后对比查询结果,如果两种执行方式不一致,那就是有 bug 了。

NoREC 的步骤如下:

1.生成一个 SELCT COUNT(*) FROM table WHERE expr 的格式的 SQL。

2.再生成一个 SELECT SUM (cnt)FROM (SELECT CAST (expr  AS BIGINT) cnt FROM table)

3.执行后比对结果值,如果值不相同,说明出现异常。

但因为 CnosDB 是时序数据库,对 Count(*)的优化规则,只会扫描第一个 Field 列。所以我们不是用 COUNT(*)生成 SQL,而是 COUNT 第一个 FIELD。

3.SQLancer 的成果

通过实现 SQLancer,CnosDB 技术团队及社区伙伴发现并处理 15 处潜在的逻辑错误 Bug,进一步保障了 CnosDB 执行的正确性。这里的 Bug,有 CnosDB 自身的 Bug,也有查询引擎 DataFusion 的 Bug。截止到 2023 年 2 月 1 日找到的 Bug 如下:

1.https://github.com/cnosdb/cnosdb/issues/852

2.https://github.com/cnosdb/cnosdb/issues/784   

3.https://github.com/apache/arrow-datafusion/issues/4401

4.https://github.com/cnosdb/cnosdb/issues/830

5.https://github.com/apache/arrow-datafusion/issues/4843(该 bug 发现前已被 datafusion 修复)

6.https://github.com/apache/arrow-datafusion/issues/4947

7.https://github.com/apache/arrow-datafusion/issues/3778

8.https://github.com/apache/arrow-datafusion/issues/4075

9.https://github.com/cnosdb/cnosdb/issues/782

10.https://github.com/cnosdb/cnosdb/issues/807

11.https://github.com/apache/arrow-datafusion/issues/4339

12.https://github.com/apache/arrow-datafusion/issues/4297

13.https://github.com/apache/arrow-datafusion/issues/4080

14.https://github.com/apache/arrow-datafusion/issues/3832

15.https://github.com/apache/arrow-datafusion/issues/3830

16.https://github.com/apache/arrow-datafusion/issues/4452

4.未支持 PQS 的原因

除了所介绍的 TPL 和 NoREC,SQLancer 还提供了 PQS 的检测方法。PQS 的全称是 Pivoted Query Synthesis,用逻辑方法生成新的查询(通常是 SQL 查询)以解决特定的问题。它通过对已有的查询进行变换和合成,以找到更优的查询,并使用特定的评估函数来评估其质量。

PQS 的主要流程如下:

生成随机的表格并向其中插入数据。

1.从数据库中随机选择一行数据。

2.根据该行数据随机构建一个表达式。

3.执行该表达式,如果结果不为 TRUE,则调整为 TRUE。

4.将该表达式放入 WHERE 或 JOIN 中。

5.执行该查询语句。

6.检查最新的结果是否仍包含先前的那行数据,如果不包含,则表示存在问题。

目前 CnosDB 还未支持 PQS,原因如下:

1.由于 CnosDB 的时序数据库的存储引擎特性,目前并不存储 NULL 值,也没有相应的 NULL 标记。

2.在读取一行数据时,如果该列不存在任何值,则以 NULL 值补充,以满足查询引擎的需求。

3.CnosDB 的 Tag 可以被视为一种特殊的索引,与 Field 存储方式不同,相同的 TagSet(即一组 Tag 键值对)不需要在每一行都进行存储。

4.对于 CnosDB,具有相同时间戳和 TagSet 的数据行会进行合并去重。

5.CnosDB 目前不支持表之间的交叉连接。

因为以上原因,支持 PQS 在检测错误中变得无足轻重了。但通过系统的不断迭代和升级,CnosDB 开发团队及社区也会重新评估支持 PQS 的可能性。

5.结语

以上就是 CnosDB 支持 SQLancer 的全部内容了,欢迎热爱数据库及数据库测试的小伙伴们关注我们微信公众号、B 站视频号以及加入我们的社区,我们将及时更新最近技术动态与技术内幕,并期待与大家深入交流。

作者

Harbour,哈老师。热爱技术的创业码农,HIT 计算机🧮+广告学📢学士,CMU 计算机编译方向博士肄业,现潜心钻研时序⌛️数据库与📒数据库教育领域。

参考文献

1.Finding Bugs in Database Systems via Query Partitioning, https://www.manuelrigger.at/preprints/TLP.pdf

2.Detecting Optimization Bugs in Database Engines via Non-Optimizing Reference Engine Construction,https://www.manuelrigger.at/preprints/NoREC.pdf

3.Testing Database Engines via Pivoted Query Synthesis,https://arxiv.org/abs/2001.04174

4.SQLancer GitHub,https://github.com/sqlancer/sqlancer


CnosDB 简介

CnosDB 是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。

欢迎关注我们的社区网站:https://www.cnosdb.com

发布于: 刚刚阅读数: 2
用户头像

CnosDB

关注

还未添加个人签名 2022-04-18 加入

打造高性能、高压缩比、高可用的分布式云原生时间序列数据库,引领世界迈向万物智联 欢迎关注 https://www.cnosdb.com

评论

发布
暂无评论
CnosDB成为首个产品支持SQLancer的云原生时序数据库_时序数据库_CnosDB_InfoQ写作社区