(文中图片全部引用自原论文,如有侵权请联系作者删除)
However, logic bugs in UPDATE and DELETE queries have not been tackled.(Abstract)
总RQ:聚焦于logic bugs中的增删改操作。(首次提出)
The core idea of DQE is that different SQL queries with the same predicate usually access the same rows in a database. For example, a row updated by an UPDATE query with a predicate φ should also be fetched by a SELECT query with the same predicate φ.
核心思想:具有相同谓词的SQL查询通常位于相同行。
To evaluate the effectiveness and generality of DQE, we apply DQE on five production-level DBMSs, i.e., MySQL, MariaDB, TiDB, CockroachDB and SQLite. In total, we have detected 50 unique bugs in these DBMSs, 41 of which have been confirmed, and 11 have been fixed. We expect that the simplicity and generality of DQE can greatly improve the reliability of DBMSs.
实验对象与结果:MySQL, MariaDB, TiDB, CockroachDB and SQLite,检测到50个不同的bugs,其中41个被确认,11个被修复。
RQ1:如何判断增删改中有logic bugs(oracle)
由于数据库往往应用优化策略,同一谓词的不同询问常常采用了不同的计算方式,导致访问了不同的行。
操作:增加额外的两个列,用来唯一标识每一行、标记每一行是否被修改。
1、数据库生成:SQLancer
2、三元组生成:和上一篇一致 不支持仅可在查询中出现的谓词、带有随机性的函数
3、结果的获取:获取询问返回的错误——对没有SHOW WARNINGS命令的数据库使用JAVA的SQLException
获取select访问的行——在select询问中增加rowId
获取update访问的行——在update中将修改的行的updated列置1
获取delete访问的行——比较前后的rowId差异
4、结果的比较:如果update或delete操作导致了仅限于该种操作的出错,则只比较剩下的两者。如果select触发warning或error,则update和delete也应触发相同的warning或error;反之则三种询问涉及的row应该相同
Subject:MySQL, MariaDB, TiDB, CockroachDB and SQLite
BaseLine: None
Time
RQ1: What logic bugs can DQE detect in real-world DBMSs?
RQ2: How many bugs detected by DQE can be found by
existing approaches?
现有检测logic bugs的方法(仅限单数据库系统中的方法)仅针对SELECT查询,因此无法检测出DQE找到的UPDATE、DELETE导致的bug;此外,现有的方法也不能通过引发一般错误的SELECT语句找到logic bugs,因为这些错误并不会导致数据库系统崩溃。
DQE找到的logic bugs均不能被其它已有方法找到。
Other Experimental Statistics
Test efficiency
生成的查询三元组数量: 1,776,124,512
DQE报告的bug数量:122
去重后的bug数量:50
Strengths
DQE是第一个检测UPDATE和 DELETE 查询中逻错误的方法
在五个广泛使用的 DBMS 上评估了DQE 的有效性和通用性,检测到 41 个之前末知的错误,其中20个发生在UPDATE 和 DELETE 查询中
Limitations
DQE无法检测所有SELECT、UPDATE和DELETE 查询中都发生的相同错误
DQE仅支持SELECT、UPDATE和DELETE 查询中常见的操作和功能
DQE无法支持非确定性函数,如 RAND函数