mirror of
https://github.com/sqlite/sqlite.git
synced 2026-01-06 08:01:16 +03:00
More optimizations for fts5 prefix queries.
FossilOrigin-Name: b8fb263ed1b36d085437131795505e53af103d26
This commit is contained in:
@@ -2591,6 +2591,34 @@ static void fts5MultiIterNext(
|
||||
}
|
||||
}
|
||||
|
||||
static void fts5MultiIterNext2(
|
||||
Fts5Index *p,
|
||||
Fts5IndexIter *pIter,
|
||||
int *pbNewTerm /* OUT: True if *might* be new term */
|
||||
){
|
||||
if( p->rc==SQLITE_OK ){
|
||||
do {
|
||||
int iFirst = pIter->aFirst[1].iFirst;
|
||||
Fts5SegIter *pSeg = &pIter->aSeg[iFirst];
|
||||
int bNewTerm = 0;
|
||||
|
||||
fts5SegIterNext(p, pSeg, &bNewTerm);
|
||||
if( pSeg->pLeaf==0 || bNewTerm
|
||||
|| fts5MultiIterAdvanceRowid(p, pIter, iFirst)
|
||||
){
|
||||
fts5MultiIterAdvanced(p, pIter, iFirst, 1);
|
||||
fts5MultiIterSetEof(pIter);
|
||||
*pbNewTerm = 1;
|
||||
}else{
|
||||
*pbNewTerm = 0;
|
||||
}
|
||||
fts5AssertMultiIterSetup(p, pIter);
|
||||
|
||||
}while( pIter->bSkipEmpty && fts5MultiIterIsEmpty(p, pIter) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static Fts5IndexIter *fts5MultiIterAlloc(
|
||||
Fts5Index *p, /* FTS5 backend to iterate within */
|
||||
int nSeg
|
||||
@@ -4058,7 +4086,7 @@ static int fts5IndexExtractCol(
|
||||
const u8 *pEnd = &p[n]; /* One byte past end of position list */
|
||||
u8 prev = 0;
|
||||
|
||||
while( iCol!=iCurrent ){
|
||||
while( iCol>iCurrent ){
|
||||
/* Advance pointer p until it points to pEnd or an 0x01 byte that is
|
||||
** not part of a varint */
|
||||
while( (prev & 0x80) || *p!=0x01 ){
|
||||
@@ -4068,6 +4096,7 @@ static int fts5IndexExtractCol(
|
||||
*pa = p++;
|
||||
p += fts5GetVarint32(p, iCurrent);
|
||||
}
|
||||
if( iCol!=iCurrent ) return 0;
|
||||
|
||||
/* Advance pointer p until it points to pEnd or an 0x01 byte that is
|
||||
** not part of a varint */
|
||||
@@ -4331,17 +4360,20 @@ static void fts5SetupPrefixIter(
|
||||
Fts5IndexIter *p1 = 0; /* Iterator used to gather data from index */
|
||||
Fts5Data *pData;
|
||||
Fts5Buffer doclist;
|
||||
int bNewTerm;
|
||||
|
||||
memset(&doclist, 0, sizeof(doclist));
|
||||
for(fts5MultiIterNew(p, pStruct, 1, flags, pToken, nToken, -1, 0, &p1);
|
||||
fts5MultiIterEof(p, p1)==0;
|
||||
fts5MultiIterNext(p, p1, 0, 0)
|
||||
fts5MultiIterNext2(p, p1, &bNewTerm)
|
||||
){
|
||||
i64 iRowid = fts5MultiIterRowid(p1);
|
||||
int nTerm;
|
||||
const u8 *pTerm = fts5MultiIterTerm(p1, &nTerm);
|
||||
assert_nc( memcmp(pToken, pTerm, MIN(nToken, nTerm))<=0 );
|
||||
if( nTerm<nToken || memcmp(pToken, pTerm, nToken) ) break;
|
||||
if( bNewTerm ){
|
||||
if( nTerm<nToken || memcmp(pToken, pTerm, nToken) ) break;
|
||||
}
|
||||
|
||||
if( doclist.n>0 && iRowid<=iLastRowid ){
|
||||
for(i=0; p->rc==SQLITE_OK && doclist.n; i++){
|
||||
|
||||
12
manifest
12
manifest
@@ -1,5 +1,5 @@
|
||||
C Fix\s#line\sdirectives\sadded\sto\sgenerated\sfile\sfts5.c.
|
||||
D 2015-10-20T19:55:35.406
|
||||
C More\soptimizations\sfor\sfts5\sprefix\squeries.
|
||||
D 2015-10-20T21:05:53.203
|
||||
F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee
|
||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||
F Makefile.msc 4eb750e0fdf52050a06d881e1b060f4bb116ed7e
|
||||
@@ -109,7 +109,7 @@ F ext/fts5/fts5_buffer.c 6d4082daa71eef87812b8caa9d60ae57a6a9ebc0
|
||||
F ext/fts5/fts5_config.c 88a77f5d5e4dfbb2355b8f6cc9969b7f02d94685
|
||||
F ext/fts5/fts5_expr.c 28b15c9ae296204bc0a2e5cf7a667d840a9d2900
|
||||
F ext/fts5/fts5_hash.c a9d4c1efebc2a91d26ad7ebdfcbf2678ceac405f
|
||||
F ext/fts5/fts5_index.c 903ca7a882d6f7ae4a08575b233fc95894daaf0b
|
||||
F ext/fts5/fts5_index.c 45856922243dc5f9d5bdc3b677d68e27997df600
|
||||
F ext/fts5/fts5_main.c 520a29136ba07448331f73bdc36d0ffa1e9dcfef
|
||||
F ext/fts5/fts5_storage.c 8038a54a88d3beb94dc7f9db6428a3bc08b718bb
|
||||
F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd
|
||||
@@ -1391,7 +1391,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 e979e2cccac257ad554803e6a1103558b0f159d8
|
||||
R 44b3b756f766dbcb6a6fd920376ac78a
|
||||
P 1f5f5804cd394a81b1c0712ce6d1052f228d0a40
|
||||
R 843f1263cb5ed99ae94cdac9953fa2b8
|
||||
U dan
|
||||
Z 5fc3ef172eb8863d82203d5aa10e31b9
|
||||
Z 0e003a47783a27c94ee2f0e7d256c7c6
|
||||
|
||||
@@ -1 +1 @@
|
||||
1f5f5804cd394a81b1c0712ce6d1052f228d0a40
|
||||
b8fb263ed1b36d085437131795505e53af103d26
|
||||
Reference in New Issue
Block a user