通过引入termFromWhereClause函数,CL改进了在虚拟表查询中处理OR分支共享的WHERE条件的方式。该函数在考虑嵌套子句的情况下,从WhereClause中检索特定的条件。 在此更改之前,由于条件索引映射不正确,共享的条件可能未被正确处理,可能导致低效的查询计划或错误的结果。 最可能出现的问题涉及在allocateIndexInfo和whereLoopAddVirtualOne函数中不正确地处理WHERE子句约束,其中 CL 修改了如何使用新的辅助函数来处理约束偏移量。 我将首先检查allocateIndexInfo函数。
程序在未崩溃或命中断点的情况下退出。退出代码为1。 STDERR输出为: Runtime error near line 2: no such module: tcl Parse error near line 3: no such table: x1
程序终止是因为TCL模块不可用。测试依赖于TCL虚拟表模块,需要在编译SQLite时启用该模块。提供的程序的输入基于bestindexC.test文件,它使用TCL模块来测试虚拟表的最佳索引选择。 为了解决这个问题,需要更改程序输入,使用不需要TCL模块的其他虚拟表。然而,该漏洞与虚拟表的查询计划有关,所以我们仍然需要一个虚拟表来触发此问题。 我将使用code_browser_source工具来检索SQLite中的内置虚拟表示例。然后,我将调整输入,使用其中一个虚拟表,并重新在whereLoopAddVirtualOne中设置断点。
sqlite3_create_module函数用于注册虚拟表模块。shell.c文件包含了多个这样的实例,包括generate_series、fsdir、completion和expert模块。其中json表的实现也很值得关注。 我首先关注的是generate_series,然后构造出一个使用该模块的查询,从而触发错误的约束处理。
相关的字段是sqlite3_index_constraint结构体中的iColumn。该字段表示约束的列编号。要导致断言失败,我们需要对索引大于3或小于-1的列设置约束。 让我们构建一个涉及这些列约束的SQL查询。generate_series表有名为value、start、step和stop的列。它们的索引是: - value: 0 - start: 1 - step: 2 - stop:3 要触发此漏洞,我们可以对ROWID施加一个约束,并对ROWID的约束使用iColumn = -1。 示例查询如下: SELECT * FROM generate_series(1,10,1) WHERE ROWID = 1; 该查询将导致seriesBestIndex函数崩溃。
程序崩溃:SIGABRT at :0 STDERR输出为: sqlite3: src/shell.c:6816: int seriesBestIndex(sqlite3_vtab *, sqlite3_index_info *): Assertion `iCol>=0 && iCol<=2' failed.
程序在执行SELECT * FROM generate_series(1,10,1) WHERE ROWID = 1;时因seriesBestIndex函数中的断言失败而崩溃。 断言assert(iCol>=0 && iCol<=2)失败的原因是sqlite3_index_info结构体中的iColumn字段可能包含超出列索引有效范围的值,例如在约束涉及ROWID时为-1。 这导致iCol被计算为-2,从而导致断言失败。
通信人家园 (https://www.txrjy.com/) | Powered by C114 |