mirror of https://github.com/sqlite/sqlite
Fix some problems with fts5 detail=none tables. Some still remain.
FossilOrigin-Name: 6a6f7bc40d6b4c8a4a254a9098c9d2f31fde69ca
This commit is contained in:
parent
d11e397b2c
commit
841243156f
|
@ -1630,6 +1630,7 @@ static void fts5SegIterInit(
|
|||
** byte of the position list content associated with said rowid.
|
||||
*/
|
||||
static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){
|
||||
int eDetail = p->pConfig->eDetail;
|
||||
int n = pIter->pLeaf->szLeaf;
|
||||
int i = pIter->iLeafOffset;
|
||||
u8 *a = pIter->pLeaf->p;
|
||||
|
@ -1645,12 +1646,18 @@ static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){
|
|||
int nPos;
|
||||
int bDummy;
|
||||
|
||||
if( eDetail==FTS5_DETAIL_NONE ){
|
||||
/* todo */
|
||||
|
||||
}else{
|
||||
i += fts5GetPoslistSize(&a[i], &nPos, &bDummy);
|
||||
i += nPos;
|
||||
}
|
||||
if( i>=n ) break;
|
||||
i += fts5GetVarint(&a[i], (u64*)&iDelta);
|
||||
pIter->iRowid += iDelta;
|
||||
|
||||
/* If necessary, grow the pIter->aRowidOffset[] array. */
|
||||
if( iRowidOffset>=pIter->nRowidOffset ){
|
||||
int nNew = pIter->nRowidOffset + 8;
|
||||
int *aNew = (int*)sqlite3_realloc(pIter->aRowidOffset, nNew*sizeof(int));
|
||||
|
@ -1754,8 +1761,10 @@ static void fts5SegIterNext(
|
|||
|
||||
pIter->iRowidOffset--;
|
||||
pIter->iLeafOffset = iOff = pIter->aRowidOffset[pIter->iRowidOffset];
|
||||
if( p->pConfig->eDetail!=FTS5_DETAIL_NONE ){
|
||||
iOff += fts5GetPoslistSize(&a[iOff], &nPos, &bDummy);
|
||||
iOff += nPos;
|
||||
}
|
||||
fts5GetVarint(&a[iOff], (u64*)&iDelta);
|
||||
pIter->iRowid -= iDelta;
|
||||
fts5SegIterLoadNPos(p, pIter);
|
||||
|
@ -1893,6 +1902,7 @@ static void fts5SegIterNext(
|
|||
** the doclist.
|
||||
*/
|
||||
static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){
|
||||
int eDetail = p->pConfig->eDetail;
|
||||
Fts5DlidxIter *pDlidx = pIter->pDlidx;
|
||||
Fts5Data *pLast = 0;
|
||||
int pgnoLast = 0;
|
||||
|
@ -1907,7 +1917,9 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){
|
|||
/* Currently, Fts5SegIter.iLeafOffset points to the first byte of
|
||||
** position-list content for the current rowid. Back it up so that it
|
||||
** points to the start of the position-list size field. */
|
||||
if( eDetail!=FTS5_DETAIL_NONE ){
|
||||
pIter->iLeafOffset -= sqlite3Fts5GetVarintLen(pIter->nPos*2+pIter->bDel);
|
||||
}
|
||||
|
||||
/* If this condition is true then the largest rowid for the current
|
||||
** term may not be stored on the current page. So search forward to
|
||||
|
@ -2895,6 +2907,9 @@ static void fts5ChunkIterate(
|
|||
int pgno = pSeg->iLeafPgno;
|
||||
int pgnoSave = 0;
|
||||
|
||||
/* This function does notmwork with detail=none databases. */
|
||||
assert( p->pConfig->eDetail!=FTS5_DETAIL_NONE );
|
||||
|
||||
if( (pSeg->flags & FTS5_SEGITER_REVERSE)==0 ){
|
||||
pgnoSave = pgno+1;
|
||||
}
|
||||
|
@ -3318,8 +3333,7 @@ static void fts5WriteAppendTerm(
|
|||
static void fts5WriteAppendRowid(
|
||||
Fts5Index *p,
|
||||
Fts5SegWriter *pWriter,
|
||||
i64 iRowid,
|
||||
int nPos
|
||||
i64 iRowid
|
||||
){
|
||||
if( p->rc==SQLITE_OK ){
|
||||
Fts5PageWriter *pPage = &pWriter->writer;
|
||||
|
@ -3346,8 +3360,6 @@ static void fts5WriteAppendRowid(
|
|||
pWriter->iPrevRowid = iRowid;
|
||||
pWriter->bFirstRowidInDoclist = 0;
|
||||
pWriter->bFirstRowidInPage = 0;
|
||||
|
||||
fts5BufferAppendVarint(&p->rc, &pPage->buf, nPos);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3543,6 +3555,7 @@ static void fts5IndexMergeLevel(
|
|||
Fts5StructureSegment *pSeg; /* Output segment */
|
||||
Fts5Buffer term;
|
||||
int bOldest; /* True if the output segment is the oldest */
|
||||
int eDetail = p->pConfig->eDetail;
|
||||
|
||||
assert( iLvl<pStruct->nLevel );
|
||||
assert( pLvl->nMerge<=pLvl->nSeg );
|
||||
|
@ -3612,12 +3625,22 @@ static void fts5IndexMergeLevel(
|
|||
|
||||
/* Append the rowid to the output */
|
||||
/* WRITEPOSLISTSIZE */
|
||||
nPos = pSegIter->nPos*2 + pSegIter->bDel;
|
||||
fts5WriteAppendRowid(p, &writer, fts5MultiIterRowid(pIter), nPos);
|
||||
fts5WriteAppendRowid(p, &writer, fts5MultiIterRowid(pIter));
|
||||
|
||||
if( eDetail==FTS5_DETAIL_NONE ){
|
||||
if( pSegIter->bDel ){
|
||||
fts5BufferAppendVarint(&p->rc, &writer.writer.buf, 0);
|
||||
if( pSegIter->nPos>0 ){
|
||||
fts5BufferAppendVarint(&p->rc, &writer.writer.buf, 0);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
/* Append the position-list data to the output */
|
||||
nPos = pSegIter->nPos*2 + pSegIter->bDel;
|
||||
fts5BufferAppendVarint(&p->rc, &writer.writer.buf, nPos);
|
||||
fts5ChunkIterate(p, pSegIter, (void*)&writer, fts5MergeChunkCallback);
|
||||
}
|
||||
}
|
||||
|
||||
/* Flush the last leaf page to disk. Set the output segment b-tree height
|
||||
** and last leaf page number at the same time. */
|
||||
|
@ -4382,7 +4405,7 @@ static void fts5MergeRowidLists(
|
|||
if( p->rc ) return;
|
||||
|
||||
fts5NextRowid(p1, &i1, &iRowid1);
|
||||
fts5NextRowid(p1, &i2, &iRowid2);
|
||||
fts5NextRowid(p2, &i2, &iRowid2);
|
||||
while( i1>=0 || i2>=0 ){
|
||||
if( i1>=0 && (i2<0 || iRowid1<iRowid2) ){
|
||||
fts5BufferSafeAppendVarint(&out, iRowid1 - iOut);
|
||||
|
|
|
@ -65,11 +65,79 @@ do_execsql_test 4.0 {
|
|||
INSERT INTO t1 VALUES('a3 b3 c3');
|
||||
COMMIT;
|
||||
}
|
||||
breakpoint
|
||||
do_execsql_test 4.1 {
|
||||
SELECT rowid FROM t1('b*');
|
||||
} {1 2 3}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 5.0 {
|
||||
CREATE VIRTUAL TABLE t1 USING fts5(a, detail=none);
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES('a1 b1 c1');
|
||||
INSERT INTO t1 VALUES('a2 b2 c2');
|
||||
INSERT INTO t1 VALUES('a1 b1 c1');
|
||||
COMMIT;
|
||||
}
|
||||
do_execsql_test 5.1 { SELECT rowid FROM t1('b*') } {1 2 3}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 6.0 {
|
||||
CREATE VIRTUAL TABLE t1 USING fts5(a, detail=full);
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES('a1 b1 c1');
|
||||
INSERT INTO t1 VALUES('a1 b1 c1');
|
||||
INSERT INTO t1 VALUES('a1 b1 c1');
|
||||
COMMIT;
|
||||
}
|
||||
|
||||
do_execsql_test 6.1 { SELECT rowid FROM t1('a1') ORDER BY rowid DESC } {3 2 1}
|
||||
do_execsql_test 6.2 { SELECT rowid FROM t1('b1') ORDER BY rowid DESC } {3 2 1}
|
||||
do_execsql_test 6.3 { SELECT rowid FROM t1('c1') ORDER BY rowid DESC } {3 2 1}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 7.0 {
|
||||
CREATE VIRTUAL TABLE t1 USING fts5(a, detail=none);
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES('a1 b1');
|
||||
INSERT INTO t1 VALUES('a1 b2');
|
||||
COMMIT;
|
||||
}
|
||||
do_execsql_test 7.0.4 { SELECT rowid FROM t1('b*') ORDER BY rowid DESC } {2 1}
|
||||
do_execsql_test 7.0.5 { SELECT rowid FROM t1('a1') ORDER BY rowid DESC } {2 1}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 7.0 {
|
||||
CREATE VIRTUAL TABLE t1 USING fts5(a, detail=none);
|
||||
INSERT INTO t1 VALUES('a1 b1 c1');
|
||||
INSERT INTO t1 VALUES('a2 b2 c2');
|
||||
INSERT INTO t1 VALUES('a1 b1 c1');
|
||||
}
|
||||
do_execsql_test 7.0.1 { SELECT rowid FROM t1('b*') } {1 2 3}
|
||||
do_execsql_test 7.0.2 { SELECT rowid FROM t1('a1') } {1 3}
|
||||
do_execsql_test 7.0.3 { SELECT rowid FROM t1('c2') } {2}
|
||||
|
||||
do_execsql_test 7.0.4 { SELECT rowid FROM t1('b*') ORDER BY rowid DESC } {3 2 1}
|
||||
do_execsql_test 7.0.5 { SELECT rowid FROM t1('a1') ORDER BY rowid DESC } {3 1}
|
||||
do_execsql_test 7.0.7 { SELECT rowid FROM t1('c2') ORDER BY rowid DESC } {2}
|
||||
|
||||
do_execsql_test 7.1.0 { INSERT INTO t1(t1) VALUES('optimize') }
|
||||
|
||||
do_execsql_test 7.1.1 { SELECT rowid FROM t1('b*') } {1 2 3}
|
||||
do_execsql_test 7.1.2 { SELECT rowid FROM t1('a1') } {1 3}
|
||||
do_execsql_test 7.1.3 { SELECT rowid FROM t1('c2') } {2}
|
||||
|
||||
do_execsql_test 7.2.1 { SELECT rowid FROM t1('b*') ORDER BY rowid DESC} {3 2 1}
|
||||
do_execsql_test 7.2.2 { SELECT rowid FROM t1('a1') ORDER BY rowid DESC} {3 1}
|
||||
do_execsql_test 7.2.3 { SELECT rowid FROM t1('c2') ORDER BY rowid DESC} {2}
|
||||
|
||||
finish_test
|
||||
|
||||
|
|
14
manifest
14
manifest
|
@ -1,5 +1,5 @@
|
|||
C Updates\sto\sfts5\sto\ssupport\sdetail=none\smode.\sAs\sof\sthis\scommit,\smany\scases\sare\sstill\sbroken.
|
||||
D 2015-12-30T19:58:57.068
|
||||
C Fix\ssome\sproblems\swith\sfts5\sdetail=none\stables.\sSome\sstill\sremain.
|
||||
D 2015-12-31T17:36:58.906
|
||||
F Makefile.in 28bcd6149e050dff35d4dcfd97e890cd387a499d
|
||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||
F Makefile.msc 5fff077fcc46de7714ed6eebb6159a4c00eab751
|
||||
|
@ -103,7 +103,7 @@ F ext/fts5/fts5_buffer.c 87204c8b3b8bc62b27376eab09b74d6d5acc41f1
|
|||
F ext/fts5/fts5_config.c b0ed7b0ddd785fb4d4e6f9037d357f8aa95918e6
|
||||
F ext/fts5/fts5_expr.c 08ee4f342a2b1fd82a5dccd0b9b3cde4921a8be5
|
||||
F ext/fts5/fts5_hash.c 1b113977296cf4212c6ec667d5e3f2bd18036955
|
||||
F ext/fts5/fts5_index.c 94dec3c322e9179fb0dd3239d6fe9555b9c621ec
|
||||
F ext/fts5/fts5_index.c 40eac312bdcb67552fe6dc2e0a4bad67d9273e3d
|
||||
F ext/fts5/fts5_main.c 23f3912ff44172859c771eb55cb57778fd662e89
|
||||
F ext/fts5/fts5_storage.c 076a3356536a8831eb6e554195171d5c249cd179
|
||||
F ext/fts5/fts5_tcl.c 18e9382d8cdad4c05b49559c68494968b9b4a4fb
|
||||
|
@ -170,7 +170,7 @@ F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b
|
|||
F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17
|
||||
F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821
|
||||
F ext/fts5/test/fts5simple.test a599b7577bc3827a9a678add3b43d8b818b93456
|
||||
F ext/fts5/test/fts5simple2.test 70b98039c8a73341bb4a632adb3018e1017e3beb
|
||||
F ext/fts5/test/fts5simple2.test 9b1e4c44fc63bd0cbb3ea639cd0ad9fa764849bf
|
||||
F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671
|
||||
F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89
|
||||
F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841
|
||||
|
@ -1407,7 +1407,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
|
|||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
P 8c30605bcd0a78a5015948171145bc6f640b8358
|
||||
R 393cc400b4b232cee04e2e069dffc8fe
|
||||
P ac8f4cf0cede6bcbe47eeefb85d80a27e9278212
|
||||
R 4d80cd94292f49ff63b2b342f7b40c82
|
||||
U dan
|
||||
Z c9f782e6b3f3ae84d42c40bf56b4157b
|
||||
Z 84b26c5644e7f6dfb95a54fd72f26ecc
|
||||
|
|
|
@ -1 +1 @@
|
|||
ac8f4cf0cede6bcbe47eeefb85d80a27e9278212
|
||||
6a6f7bc40d6b4c8a4a254a9098c9d2f31fde69ca
|
Loading…
Reference in New Issue