}
}
+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
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 ){
*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 */
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++){
-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
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
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