]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Further improve performance of unindexed fts5 prefix queries.
authordan <dan@noemail.net>
Thu, 4 Feb 2016 19:45:19 +0000 (19:45 +0000)
committerdan <dan@noemail.net>
Thu, 4 Feb 2016 19:45:19 +0000 (19:45 +0000)
FossilOrigin-Name: c9c6457d8ea911f6cc63967127e58da3146fd3ef

ext/fts5/fts5_index.c
manifest
manifest.uuid

index 1a8cc63dadf83674fdc98a7012dfab32409b3a0f..0461f3a778459199ed23d65475921ed4f5c6dd24 100644 (file)
@@ -4705,76 +4705,94 @@ static void fts5MergePrefixLists(
   Fts5Buffer *p2                  /* Second list to merge */
 ){
   if( p2->n ){
-    i64 iLastRowid = 0;
-    Fts5DoclistIter i1;
-    Fts5DoclistIter i2;
-    Fts5Buffer out;
-    Fts5Buffer tmp;
-    memset(&out, 0, sizeof(out));
-    memset(&tmp, 0, sizeof(tmp));
-
-    sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n);
-    fts5DoclistIterInit(p1, &i1);
-    fts5DoclistIterInit(p2, &i2);
-    while( p->rc==SQLITE_OK && (i1.aPoslist!=0 || i2.aPoslist!=0) ){
-      if( i2.aPoslist==0 || (i1.aPoslist && i1.iRowid<i2.iRowid) ){
-        /* Copy entry from i1 */
-        fts5MergeAppendDocid(&out, iLastRowid, i1.iRowid);
-        fts5BufferSafeAppendBlob(&out, i1.aPoslist, i1.nPoslist+i1.nSize);
-        fts5DoclistIterNext(&i1);
-      }
-      else if( i1.aPoslist==0 || i2.iRowid!=i1.iRowid ){
-        /* Copy entry from i2 */
-        fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
-        fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.nPoslist+i2.nSize);
-        fts5DoclistIterNext(&i2);
-      }
-      else{
-        i64 iPos1 = 0;
-        i64 iPos2 = 0;
-        int iOff1 = 0;
-        int iOff2 = 0;
-        u8 *a1 = &i1.aPoslist[i1.nSize];
-        u8 *a2 = &i2.aPoslist[i2.nSize];
-
-        Fts5PoslistWriter writer;
-        memset(&writer, 0, sizeof(writer));
-
-        /* Merge the two position lists. */ 
-        fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
-        fts5BufferZero(&tmp);
-
-        sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
-        sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
-
-        while( p->rc==SQLITE_OK && (iPos1>=0 || iPos2>=0) ){
-          i64 iNew;
-          if( iPos2<0 || (iPos1>=0 && iPos1<iPos2) ){
-            iNew = iPos1;
-            sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
-          }else{
-            iNew = iPos2;
-            sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
-            if( iPos1==iPos2 ){
-              sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1,&iPos1);
+    if( p1->n==0 ){
+      fts5BufferSwap(p1, p2);
+    }else{
+      i64 iLastRowid = 0;
+      Fts5DoclistIter i1;
+      Fts5DoclistIter i2;
+      Fts5Buffer out = {0, 0, 0};
+      Fts5Buffer tmp = {0, 0, 0};
+
+      if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n) ) return;
+      fts5DoclistIterInit(p1, &i1);
+      fts5DoclistIterInit(p2, &i2);
+
+      while( 1 ){
+
+        if( i1.iRowid<i2.iRowid ){
+          /* Copy entry from i1 */
+          fts5MergeAppendDocid(&out, iLastRowid, i1.iRowid);
+          fts5BufferSafeAppendBlob(&out, i1.aPoslist, i1.nPoslist+i1.nSize);
+          fts5DoclistIterNext(&i1);
+          if( i1.aPoslist==0 ) break;
+        }
+        else if( i2.iRowid!=i1.iRowid ){
+          /* Copy entry from i2 */
+          fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
+          fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.nPoslist+i2.nSize);
+          fts5DoclistIterNext(&i2);
+          if( i2.aPoslist==0 ) break;
+        }
+        else{
+          i64 iPos1 = 0;
+          i64 iPos2 = 0;
+          int iOff1 = 0;
+          int iOff2 = 0;
+          u8 *a1 = &i1.aPoslist[i1.nSize];
+          u8 *a2 = &i2.aPoslist[i2.nSize];
+
+          Fts5PoslistWriter writer;
+          memset(&writer, 0, sizeof(writer));
+
+          /* Merge the two position lists. */ 
+          fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
+          fts5BufferZero(&tmp);
+
+          sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
+          sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
+
+          while( iPos1>=0 || iPos2>=0 ){
+            i64 iNew;
+            if( iPos2<0 || (iPos1>=0 && iPos1<iPos2) ){
+              iNew = iPos1;
+              sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
+            }else{
+              iNew = iPos2;
+              sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
+              if( iPos1==iPos2 ){
+                sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1,&iPos1);
+              }
+            }
+            if( iNew!=writer.iPrev || tmp.n==0 ){
+              p->rc = sqlite3Fts5PoslistWriterAppend(&tmp, &writer, iNew);
+              if( p->rc ) goto error_out;
             }
           }
-          if( iNew!=writer.iPrev || tmp.n==0 ){
-            p->rc = sqlite3Fts5PoslistWriterAppend(&tmp, &writer, iNew);
-          }
+
+          /* WRITEPOSLISTSIZE */
+          fts5BufferSafeAppendVarint(&out, tmp.n * 2);
+          fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n);
+          fts5DoclistIterNext(&i1);
+          fts5DoclistIterNext(&i2);
+          if( i1.aPoslist==0 || i2.aPoslist==0 ) break;
         }
+      }
 
-        /* WRITEPOSLISTSIZE */
-        fts5BufferSafeAppendVarint(&out, tmp.n * 2);
-        fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n);
-        fts5DoclistIterNext(&i1);
-        fts5DoclistIterNext(&i2);
+      if( i1.aPoslist ){
+        fts5MergeAppendDocid(&out, iLastRowid, i1.iRowid);
+        fts5BufferSafeAppendBlob(&out, i1.aPoslist, i1.aEof - i1.aPoslist);
+      }
+      else if( i2.aPoslist ){
+        fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
+        fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist);
       }
-    }
 
-    fts5BufferSet(&p->rc, p1, out.n, out.p);
-    fts5BufferFree(&tmp);
-    fts5BufferFree(&out);
+     error_out:
+      fts5BufferSet(&p->rc, p1, out.n, out.p);
+      fts5BufferFree(&tmp);
+      fts5BufferFree(&out);
+    }
   }
 }
 
index 7b935898baf72e436a7d07bab6307f8c411a9e37..b4349c77ff587d0c1dbf6fa555d4488104579f4f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\srunning\ssome\sparticularly\stime-consuming\stests\sas\spart\sof\sveryquick.test.
-D 2016-02-04T17:31:03.368
+C Further\simprove\sperformance\sof\sunindexed\sfts5\sprefix\squeries.
+D 2016-02-04T19:45:19.673
 F Makefile.in 027c1603f255390c43a426671055a31c0a65fdb4
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 72b7858f02017611c3ac1ddc965251017fed0845
@@ -104,7 +104,7 @@ F ext/fts5/fts5_buffer.c f6e0c6018ffc8e39fc0b333b5daa8b8d528ae6e4
 F ext/fts5/fts5_config.c 0c384ebdd23fd055e2e50a93277b8d59da538238
 F ext/fts5/fts5_expr.c ff5c451a6d025909639ac0f0d0af0cc595b50feb
 F ext/fts5/fts5_hash.c 1b113977296cf4212c6ec667d5e3f2bd18036955
-F ext/fts5/fts5_index.c e634a4a05b066f7122db93558c871148bd9893f2
+F ext/fts5/fts5_index.c 614c54544f844387ba6728c613a884a1aa151f06
 F ext/fts5/fts5_main.c 7e8a5f27d504bc04e3de7f1cba8867f0332aee9d
 F ext/fts5/fts5_storage.c 2a1f44deae090cd711f02cec0c2af8e660360d24
 F ext/fts5/fts5_tcl.c f8731e0508299bd43f1a2eff7dbeaac870768966
@@ -980,7 +980,7 @@ F test/savepoint4.test c8f8159ade6d2acd9128be61e1230f1c1edc6cc0
 F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd
 F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7
 F test/savepoint7.test db3db281486c925095f305aad09fe806e5188ff3
-F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 w test/savepoint3.test
+F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2
 F test/scanstatus.test 5253c219e331318a437f436268e0e82345700285
 F test/schema.test 8f7999be894260f151adf15c2c7540f1c6d6a481
 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5
@@ -1345,7 +1345,7 @@ F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2
 F test/whereI.test 1d89199697919d4930be05a71e7fe620f114e622
 F test/whereJ.test 55a3221706a7ab706293f17cc8f96da563bf0767
 F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b
-F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864 w test/where8m.test
+F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864
 F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31
 F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c
 F test/win32heap.test ea19770974795cff26e11575e12d422dbd16893c
@@ -1426,7 +1426,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 b787165b25a240fd5b4a5c7f73b395f30213a1d7
-R 2d9511ba502b30b0a28170783af34756
+P f465944b75a800ddc6920229ad32c2f39ff91e19
+R 50521888ffcbf123db65487e5572aad3
 U dan
-Z 9311e6c3b97d9e579dd5eb1512f82842
+Z 7367047abd1bd45b9cf9859d0571d183
index 81e89adc73d518f015c9b02a95f6c77febc1b4d0..960087b4e6d112e6a7c7710fed12fb7d124de8c4 100644 (file)
@@ -1 +1 @@
-f465944b75a800ddc6920229ad32c2f39ff91e19
\ No newline at end of file
+c9c6457d8ea911f6cc63967127e58da3146fd3ef
\ No newline at end of file