我有一个包含 R*tree 虚拟表的 SQLite 数据库。这张桌子的行为相当奇怪,我不知道出了什么问题。我将不胜感激任何指向我可以调查的方面!
> dbGetQuery(con, 'PRAGMA integrity_check')
integrity_check
1 ok
好像还好...
> dbGetQuery(con, 'SELECT * FROM peakLoc LIMIT 5')
peakID scanStart scanEnd mzMin mzMax
1 18481 5540 5904 435.1880 435.2095
2 18429 5555 5644 408.7411 408.7459
3 18251 5621 5710 432.7190 432.7285
4 16415 6081 6173 432.2292 432.2470
5 16391 6089 6351 454.1823 454.1960
R*tree 表的一般外观
> dbGetQuery(con, 'SELECT MIN(scanEnd), MAX(scanEnd) FROM peakLoc')
MIN(scanEnd) MAX(scanEnd)
1 51 19369
scanEnd 的边界
> dbGetQuery(con, 'SELECT * FROM peakLoc WHERE scanEnd > 5000 LIMIT 5')
peakID scanStart scanEnd mzMin mzMax
1 20987 4839 6284 410.1729 410.2035
2 6705 9827 10132 738.8564 738.8674
3 15190 6482 6756 615.3235 615.3395
4 15189 6482 6756 509.2193 509.2258
5 12001 7449 7710 855.4534 855.4631
到目前为止,一切都很好...
> dbGetQuery(con, 'SELECT * FROM peakLoc WHERE scanEnd > 6000 LIMIT 5')
[1] peakID scanStart scanEnd mzMin mzMax
<0 rows> (or 0-length row.names)
记录在哪里?
当比较器达到任意大的数字时,其他列也会发生同样的情况。此行为仅存在于 R*tree 表中 - 常规表工作正常...
我是否偶然发现了我不知道的 R*tree 模块中的约束?R*tree 中的所有记录都来自一个大插入,我没有触及 R*tree 所依赖的基础表......
编辑: 应 CL 的要求,我尝试创建一个可重现的示例。至少在我的系统上,以下会产生具有相同行为的 R*tree:
set.seed(1)
library(RSQLite)
con <- dbConnect(dbDriver('SQLite'), ':memory:')
dbGetQuery(con, 'CREATE VIRTUAL TABLE test USING rtree(id, xmin, xmax, ymin, ymax)')
x <- abs(rnorm(100))
y <- abs(rnorm(100))
data <- data.frame(id=1:100, xmin=x, xmax=x+2, ymin=y, ymax=y+3)
dbGetPreparedQuery(con, 'INSERT INTO test VALUES ($id, $xmin, $xmax, $ymin, $ymax)', bind.data=data)
dbGetQuery(con, 'SELECT max(xmax) FROM test')
dbGetQuery(con, 'SELECT * FROM test WHERE xmax > 4 LIMIT 5')
dbGetQuery(con, 'SELECT * FROM test WHERE +xmax > 4 LIMIT 5')
编辑 2: 可以从以下链接下载使用第一次编辑中给出的命令创建的数据库: https ://dl.dropboxusercontent.com/u/2323585/testdb.sqlite