]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
More optimizations for fts5 prefix queries.
authordan <dan@noemail.net>
Tue, 20 Oct 2015 21:05:53 +0000 (21:05 +0000)
committerdan <dan@noemail.net>
Tue, 20 Oct 2015 21:05:53 +0000 (21:05 +0000)
FossilOrigin-Name: b8fb263ed1b36d085437131795505e53af103d26

ext/fts5/fts5_index.c
manifest
manifest.uuid

index 927d0a94dccaa3715dd56c08c42f87caddb18c69..6747b9387bbdbb9c402d40af748be207b27afb16 100644 (file)
@@ -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++){
index d0b4c559b072d94184cb01a3efa0ab879478c798..d75668e6c41c27849a09bb92c22d80d4d872a137 100644 (file)
--- a/manifest
+++ b/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
index 4e786e827065c4b70246a54ba28ca2c0b0a14f6a..c7f268a7a42251aac0b5cd9cbe42ab075356e211 100644 (file)
@@ -1 +1 @@
-1f5f5804cd394a81b1c0712ce6d1052f228d0a40
\ No newline at end of file
+b8fb263ed1b36d085437131795505e53af103d26
\ No newline at end of file