在测试我们的SQLite Virtual Table
机制实现过程中,我们遇到了意外的行为。对于以下virtual table
结构:
create table X(ID int, RL real)
此查询按 RL 字段以正确的降序返回所有记录。
查询 1:
select * from VTab t1 left outer join VTab t2 on t1.ID = t2.ID order by t1.RL desc;
执行计划一:
explain query plan select * from VTab t1 left outer join VTab t2 on t1.ID = t2.ID order by t1.RL desc;
0|0|0| SCAN TABLE VTab AS t1 VIRTUAL TABLE INDEX 0:D1; (~0 rows)
0|1|1| SCAN TABLE VTab AS t2 VIRTUAL TABLE INDEX 4:C0=0; (~0 rows)
D1
这是我们的xBestIndex
方法实现生成的值,表示按字段 #1 = RL 降序排序。
C0=0
这里意味着字段 #0 = ID 的相等操作。这按预期工作。
但是,下一个查询返回行(RL
字段的别名不同)而不进行任何排序。
查询 2:
select * from VTab t1 left outer join VTab t2 on t1.ID = t2.ID order by t2.RL desc
执行计划2:
explain query plan select * from VTab t1 left outer join VTab t2 on t1.ID = t2.ID order by t2.RL desc;
0|0|0| SCAN TABLE VTab AS t1 VIRTUAL TABLE INDEX 0: (~0 rows)
0|11| SCAN TABLE VTab AS t2 VIRTUAL TABLE INDEX 4:C0=0; (~0 rows)
如您所见,没有提到要排序的索引。针对真实表(与我们的虚拟表具有完全相同的结构)执行的查询如下所示:
查询 3:
select * from Table1 t1 left outer join Table1 t2 on t1.ID = t2.ID order by t2.RL desc
执行计划3:
explain query plan select * from Table1 t1 left outer join Table1t2 on t1.ID = t2.ID order by t2.RL desc;
0|0|0| SCAN TABLE Table1 AS t1 (~1000000 rows)
0|1|0| SEARCH TABLE Table1 AS t2 USING AUTOMATIC COVERING INDEX (ID=?)
0|1|0| (~7 rows)
0|0|0| USE TEMP B-TREE FOR ORDER BY
如您所见,使用B-tree
那里进行排序。
在我们这边,我们检查了我们在sqlite3_index_orderby
结构(结构的一部分sqlite3_index_info
)中收到的内容,当它们出现时xBestIndex
,它们不包含任何关于排序的信息。out 参数也orderByConsumed
返回 False(因为我们的输出没有排序,我们假设sqlite本身会对行进行排序)。
这是SQLite Virtual Table
支持中的错误还是我们错过了什么?