Fix handling of fts5 rowid constraints in the absence of a MATCH clause. Add tests to cover recently added branches.
FossilOrigin-Name: 3a9cb648138a059862fb438c0787fdd888f5e88e
This commit is contained in:
parent
e4449454c5
commit
7193b69f52
@ -1138,6 +1138,9 @@ static int fts5FilterMethod(
|
||||
if( rc==SQLITE_OK ){
|
||||
if( pCsr->ePlan==FTS5_PLAN_ROWID ){
|
||||
sqlite3_bind_value(pCsr->pStmt, 1, apVal[0]);
|
||||
}else{
|
||||
sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iFirstRowid);
|
||||
sqlite3_bind_int64(pCsr->pStmt, 2, pCsr->iLastRowid);
|
||||
}
|
||||
rc = fts5NextMethod(pCursor);
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ struct Fts5Storage {
|
||||
int bTotalsValid; /* True if nTotalRow/aTotalSize[] are valid */
|
||||
i64 nTotalRow; /* Total number of rows in FTS table */
|
||||
i64 *aTotalSize; /* Total sizes of each column */
|
||||
sqlite3_stmt *aStmt[10];
|
||||
sqlite3_stmt *aStmt[11];
|
||||
};
|
||||
|
||||
|
||||
@ -48,6 +48,8 @@ struct Fts5Storage {
|
||||
|
||||
#define FTS5_STMT_REPLACE_CONFIG 9
|
||||
|
||||
#define FTS5_STMT_SCAN 10
|
||||
|
||||
/*
|
||||
** Prepare the two insert statements - Fts5Storage.pInsertContent and
|
||||
** Fts5Storage.pInsertDocsize - if they have not already been prepared.
|
||||
@ -65,9 +67,9 @@ static int fts5StorageGetStmt(
|
||||
assert( eStmt>=0 && eStmt<ArraySize(p->aStmt) );
|
||||
if( p->aStmt[eStmt]==0 ){
|
||||
const char *azStmt[] = {
|
||||
"SELECT %s FROM %s T ORDER BY T.%Q ASC", /* SCAN_ASC */
|
||||
"SELECT %s FROM %s T ORDER BY T.%Q DESC", /* SCAN_DESC */
|
||||
"SELECT %s FROM %s T WHERE T.%Q=?", /* LOOKUP */
|
||||
"SELECT %s FROM %s T WHERE T.%Q >= ? AND T.%Q <= ? ORDER BY T.%Q ASC",
|
||||
"SELECT %s FROM %s T WHERE T.%Q <= ? AND T.%Q >= ? ORDER BY T.%Q DESC",
|
||||
"SELECT %s FROM %s T WHERE T.%Q=?", /* LOOKUP */
|
||||
|
||||
"INSERT INTO %Q.'%q_content' VALUES(%s)", /* INSERT_CONTENT */
|
||||
"REPLACE INTO %Q.'%q_content' VALUES(%s)", /* REPLACE_CONTENT */
|
||||
@ -78,13 +80,26 @@ static int fts5StorageGetStmt(
|
||||
"SELECT sz FROM %Q.'%q_docsize' WHERE id=?", /* LOOKUP_DOCSIZE */
|
||||
|
||||
"REPLACE INTO %Q.'%q_config' VALUES(?,?)", /* REPLACE_CONFIG */
|
||||
"SELECT %s FROM %s AS T", /* SCAN */
|
||||
};
|
||||
Fts5Config *pC = p->pConfig;
|
||||
char *zSql = 0;
|
||||
|
||||
switch( eStmt ){
|
||||
case FTS5_STMT_SCAN:
|
||||
zSql = sqlite3_mprintf(azStmt[eStmt],
|
||||
pC->zContentExprlist, pC->zContent
|
||||
);
|
||||
break;
|
||||
|
||||
case FTS5_STMT_SCAN_ASC:
|
||||
case FTS5_STMT_SCAN_DESC:
|
||||
zSql = sqlite3_mprintf(azStmt[eStmt], pC->zContentExprlist,
|
||||
pC->zContent, pC->zContentRowid, pC->zContentRowid,
|
||||
pC->zContentRowid
|
||||
);
|
||||
break;
|
||||
|
||||
case FTS5_STMT_LOOKUP:
|
||||
zSql = sqlite3_mprintf(azStmt[eStmt],
|
||||
pC->zContentExprlist, pC->zContent, pC->zContentRowid
|
||||
@ -571,7 +586,7 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){
|
||||
}
|
||||
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = fts5StorageGetStmt(p, FTS5_STMT_SCAN_ASC, &pScan, 0);
|
||||
rc = fts5StorageGetStmt(p, FTS5_STMT_SCAN, &pScan, 0);
|
||||
}
|
||||
|
||||
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pScan) ){
|
||||
@ -797,7 +812,7 @@ int sqlite3Fts5StorageIntegrity(Fts5Storage *p){
|
||||
|
||||
/* Generate the expected index checksum based on the contents of the
|
||||
** %_content table. This block stores the checksum in ctx.cksum. */
|
||||
rc = fts5StorageGetStmt(p, FTS5_STMT_SCAN_ASC, &pScan, 0);
|
||||
rc = fts5StorageGetStmt(p, FTS5_STMT_SCAN, &pScan, 0);
|
||||
if( rc==SQLITE_OK ){
|
||||
int rc2;
|
||||
while( SQLITE_ROW==sqlite3_step(pScan) ){
|
||||
|
@ -433,6 +433,69 @@ do_execsql_test 18.1 {
|
||||
SELECT rowid FROM c2 WHERE c2 MATCH 'y:x';
|
||||
} {1}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 17.1 {
|
||||
CREATE VIRTUAL TABLE uio USING fts5(ttt);
|
||||
INSERT INTO uio VALUES(NULL);
|
||||
INSERT INTO uio SELECT NULL FROM uio;
|
||||
INSERT INTO uio SELECT NULL FROM uio;
|
||||
INSERT INTO uio SELECT NULL FROM uio;
|
||||
INSERT INTO uio SELECT NULL FROM uio;
|
||||
INSERT INTO uio SELECT NULL FROM uio;
|
||||
INSERT INTO uio SELECT NULL FROM uio;
|
||||
INSERT INTO uio SELECT NULL FROM uio;
|
||||
INSERT INTO uio SELECT NULL FROM uio;
|
||||
SELECT count(*) FROM uio;
|
||||
} {256}
|
||||
|
||||
do_execsql_test 17.2 {
|
||||
SELECT count(*) FROM uio WHERE rowid BETWEEN 8 AND 17
|
||||
} {10}
|
||||
do_execsql_test 17.3 {
|
||||
SELECT rowid FROM uio WHERE rowid BETWEEN 8 AND 17
|
||||
} {8 9 10 11 12 13 14 15 16 17}
|
||||
do_execsql_test 17.4 {
|
||||
SELECT rowid FROM uio WHERE rowid BETWEEN 8 AND 17 ORDER BY rowid DESC
|
||||
} {17 16 15 14 13 12 11 10 9 8}
|
||||
do_execsql_test 17.5 {
|
||||
SELECT count(*) FROM uio
|
||||
} {256}
|
||||
|
||||
do_execsql_test 17.6 {
|
||||
INSERT INTO uio(rowid) VALUES(9223372036854775807);
|
||||
INSERT INTO uio(rowid) VALUES(-9223372036854775808);
|
||||
SELECT count(*) FROM uio;
|
||||
} {258}
|
||||
do_execsql_test 17.7 {
|
||||
SELECT min(rowid), max(rowid) FROM uio;
|
||||
} {-9223372036854775808 9223372036854775807}
|
||||
|
||||
do_execsql_test 17.8 {
|
||||
INSERT INTO uio DEFAULT VALUES;
|
||||
SELECT min(rowid), max(rowid), count(*) FROM uio;
|
||||
} {-9223372036854775808 9223372036854775807 259}
|
||||
|
||||
do_execsql_test 17.9 {
|
||||
SELECT min(rowid), max(rowid), count(*) FROM uio WHERE rowid < 10;
|
||||
} {-9223372036854775808 9 10}
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
#
|
||||
do_execsql_test 18.1 {
|
||||
CREATE VIRTUAL TABLE t1 USING fts5(a, b);
|
||||
CREATE VIRTUAL TABLE t2 USING fts5(c, d);
|
||||
INSERT INTO t1 VALUES('abc*', NULL);
|
||||
INSERT INTO t2 VALUES(1, 'abcdefg');
|
||||
}
|
||||
do_execsql_test 18.2 {
|
||||
SELECT t1.rowid, t2.rowid FROM t1, t2 WHERE t2 MATCH t1.a AND t1.rowid = t2.c
|
||||
} {1 1}
|
||||
do_execsql_test 18.3 {
|
||||
SELECT t1.rowid, t2.rowid FROM t2, t1 WHERE t2 MATCH t1.a AND t1.rowid = t2.c
|
||||
} {1 1}
|
||||
|
||||
finish_test
|
||||
|
||||
|
||||
|
16
manifest
16
manifest
@ -1,5 +1,5 @@
|
||||
C Make\suse\sof\srange\sconstraints\son\sthe\srowid\sfield\sof\san\sfts5\stable\sin\sfull-text\squeries.
|
||||
D 2015-06-05T19:05:57.541
|
||||
C Fix\shandling\sof\sfts5\srowid\sconstraints\sin\sthe\sabsence\sof\sa\sMATCH\sclause.\sAdd\stests\sto\scover\srecently\sadded\sbranches.
|
||||
D 2015-06-06T16:28:29.334
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in d272f8755b464f20e02dd7799bfe16794c9574c4
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@ -105,7 +105,7 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7
|
||||
F ext/fts3/unicode/mkunicode.tcl ed0534dd51efce39878bce33944c6073d37a1e20
|
||||
F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95
|
||||
F ext/fts5/extract_api_docs.tcl 55a6d648d516f35d9a1e580ac00de27154e1904a
|
||||
F ext/fts5/fts5.c f5800895e4d24b7351d44a3858c3a1611bb68dac
|
||||
F ext/fts5/fts5.c 1c7424b9ba39f1e244f776556a4fface71abe772
|
||||
F ext/fts5/fts5.h 4266c6231094005b051dbfc8dd85d2bc57243d34
|
||||
F ext/fts5/fts5Int.h 3de83c9639bd8332eb84a13c1eb2387e83e128bf
|
||||
F ext/fts5/fts5_aux.c d53f00f31ad615ca4f139dd8751f9041afa00971
|
||||
@ -114,7 +114,7 @@ F ext/fts5/fts5_config.c 11f969ed711a0a8b611d47431d74c372ad78c713
|
||||
F ext/fts5/fts5_expr.c 549bda1f7edcf10365fbfbc002bdea1be3c287bb
|
||||
F ext/fts5/fts5_hash.c c1cfdb2cae0fad00b06fae38a40eaf9261563ccc
|
||||
F ext/fts5/fts5_index.c 7cea402924cd3d8cd5943a7f9514c9153696571b
|
||||
F ext/fts5/fts5_storage.c 04e6717656b78eb230a1c730cac3b935eb94889b
|
||||
F ext/fts5/fts5_storage.c 770ab52377c18a9aa4dc843ee79388febdb184d4
|
||||
F ext/fts5/fts5_tcl.c 7ea165878e4ae3598e89acd470a0ee1b5a00e33c
|
||||
F ext/fts5/fts5_tokenize.c 97251d68d7a6a9415bde1203f9382864dfc1f989
|
||||
F ext/fts5/fts5_unicode2.c da3cf712f05cd8347c8c5bc00964cc0361c88da9
|
||||
@ -123,7 +123,7 @@ F ext/fts5/fts5_vocab.c 1f8543b2c1ae4427f127a911bc8e60873fcd7bf9
|
||||
F ext/fts5/fts5parse.y 833db1101b78c0c47686ab1b84918e38c36e9452
|
||||
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
|
||||
F ext/fts5/test/fts5_common.tcl 0b465b1127adcd1c8131f3454ab4264a6964674c
|
||||
F ext/fts5/test/fts5aa.test 5f73afe6a1394fdba9bc18302876ded81021bee6
|
||||
F ext/fts5/test/fts5aa.test 0be21c89fd66b588db355a6398911fd875bdcc6c
|
||||
F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad
|
||||
F ext/fts5/test/fts5ac.test 0990ae7497ebaea2ab5f7fd5caedd93a71a905fc
|
||||
F ext/fts5/test/fts5ad.test 312f3c8ed9592533499c5b94d2059ae6382913a0
|
||||
@ -1357,7 +1357,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
P 4ea015ab983300d420ef104cca550b22a6395866
|
||||
R 375eda4e39d4e39f9d43e9373e13d973
|
||||
P 32cbc0ed3699cc21302f0b6a159493117ad4bd4f
|
||||
R 6f9b9f6d43c04c7ec55a64f8c057a03e
|
||||
U dan
|
||||
Z 9b2a7bdd6b256eb0f1a2b017a5425890
|
||||
Z 85736f383e03d41cf70fac675094eadf
|
||||
|
@ -1 +1 @@
|
||||
32cbc0ed3699cc21302f0b6a159493117ad4bd4f
|
||||
3a9cb648138a059862fb438c0787fdd888f5e88e
|
Loading…
x
Reference in New Issue
Block a user