0

我有一个包含 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

4

0 回答 0