]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Minor optimization for fts5 API xInst().
authordan <dan@noemail.net>
Wed, 12 Aug 2015 15:36:58 +0000 (15:36 +0000)
committerdan <dan@noemail.net>
Wed, 12 Aug 2015 15:36:58 +0000 (15:36 +0000)
FossilOrigin-Name: efb7c9c5d0015c8c966f8d6742c05cda82fc146a

ext/fts5/fts5_main.c
manifest
manifest.uuid

index 5115fe7d961bdccdfca02c1a510e048b88b65a9b..1f42716514085a6eb1ff65ac4dbbfc0e6a7fa78c 100644 (file)
@@ -1535,72 +1535,71 @@ static int fts5CsrPoslist(Fts5Cursor *pCsr, int iPhrase, const u8 **pa){
 */
 static int fts5CacheInstArray(Fts5Cursor *pCsr){
   int rc = SQLITE_OK;
-  if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_INST) ){
-    Fts5PoslistReader *aIter;     /* One iterator for each phrase */
-    int nIter;                    /* Number of iterators/phrases */
-    
-    nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr);
-    if( pCsr->aInstIter==0 ){
-      int nByte = sizeof(Fts5PoslistReader) * nIter;
-      pCsr->aInstIter = (Fts5PoslistReader*)sqlite3Fts5MallocZero(&rc, nByte);
-    }
-    aIter = pCsr->aInstIter;
+  Fts5PoslistReader *aIter;       /* One iterator for each phrase */
+  int nIter;                      /* Number of iterators/phrases */
+  
+  nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr);
+  if( pCsr->aInstIter==0 ){
+    int nByte = sizeof(Fts5PoslistReader) * nIter;
+    pCsr->aInstIter = (Fts5PoslistReader*)sqlite3Fts5MallocZero(&rc, nByte);
+  }
+  aIter = pCsr->aInstIter;
 
-    if( aIter ){
-      int nInst = 0;              /* Number instances seen so far */
-      int i;
+  if( aIter ){
+    int nInst = 0;                /* Number instances seen so far */
+    int i;
 
-      /* Initialize all iterators */
-      for(i=0; i<nIter; i++){
-        const u8 *a;
-        int n = fts5CsrPoslist(pCsr, i, &a);
-        sqlite3Fts5PoslistReaderInit(-1, a, n, &aIter[i]);
-      }
+    /* Initialize all iterators */
+    for(i=0; i<nIter; i++){
+      const u8 *a;
+      int n = fts5CsrPoslist(pCsr, i, &a);
+      sqlite3Fts5PoslistReaderInit(-1, a, n, &aIter[i]);
+    }
 
-      while( 1 ){
-        int *aInst;
-        int iBest = -1;
-        for(i=0; i<nIter; i++){
-          if( (aIter[i].bEof==0) 
-           && (iBest<0 || aIter[i].iPos<aIter[iBest].iPos) 
-          ){
-            iBest = i;
-          }
+    while( 1 ){
+      int *aInst;
+      int iBest = -1;
+      for(i=0; i<nIter; i++){
+        if( (aIter[i].bEof==0) 
+         && (iBest<0 || aIter[i].iPos<aIter[iBest].iPos) 
+        ){
+          iBest = i;
         }
-        if( iBest<0 ) break;
-
-        nInst++;
-        if( nInst>=pCsr->nInstAlloc ){
-          pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32;
-          aInst = (int*)sqlite3_realloc(
-              pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3
-          );
-          if( aInst ){
-            pCsr->aInst = aInst;
-          }else{
-            rc = SQLITE_NOMEM;
-            break;
-          }
+      }
+      if( iBest<0 ) break;
+
+      nInst++;
+      if( nInst>=pCsr->nInstAlloc ){
+        pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32;
+        aInst = (int*)sqlite3_realloc(
+            pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3
+        );
+        if( aInst ){
+          pCsr->aInst = aInst;
+        }else{
+          rc = SQLITE_NOMEM;
+          break;
         }
-
-        aInst = &pCsr->aInst[3 * (nInst-1)];
-        aInst[0] = iBest;
-        aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos);
-        aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos);
-        sqlite3Fts5PoslistReaderNext(&aIter[iBest]);
       }
 
-      pCsr->nInstCount = nInst;
-      CsrFlagClear(pCsr, FTS5CSR_REQUIRE_INST);
+      aInst = &pCsr->aInst[3 * (nInst-1)];
+      aInst[0] = iBest;
+      aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos);
+      aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos);
+      sqlite3Fts5PoslistReaderNext(&aIter[iBest]);
     }
+
+    pCsr->nInstCount = nInst;
+    CsrFlagClear(pCsr, FTS5CSR_REQUIRE_INST);
   }
   return rc;
 }
 
 static int fts5ApiInstCount(Fts5Context *pCtx, int *pnInst){
   Fts5Cursor *pCsr = (Fts5Cursor*)pCtx;
-  int rc;
-  if( SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) ){
+  int rc = SQLITE_OK;
+  if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_INST)==0 
+   || SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) ){
     *pnInst = pCsr->nInstCount;
   }
   return rc;
@@ -1614,8 +1613,10 @@ static int fts5ApiInst(
   int *piOff
 ){
   Fts5Cursor *pCsr = (Fts5Cursor*)pCtx;
-  int rc;
-  if( SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) ){
+  int rc = SQLITE_OK;
+  if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_INST)==0 
+   || SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) 
+  ){
     if( iIdx<0 || iIdx>=pCsr->nInstCount ){
       rc = SQLITE_RANGE;
     }else{
index f14c5e00bead4971b4131b0bb740489b3ee6003d..c0121c70db7cf97100cea2ff10b2b6340285eca7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\sxPhraseFirst()\sand\sxPhraseNext()\sfts5\sAPIs,\sfor\sfaster\siteration\sthrough\sa\ssingle\sphrases\sposition\slist.\sAlso\soptimize\sxInst()\sand\sxInstCount()\sa\sbit.
-D 2015-08-12T12:11:28.744
+C Minor\soptimization\sfor\sfts5\sAPI\sxInst().
+D 2015-08-12T15:36:58.855
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2fc9ca6bf5949d415801c007ed3004a4bdb7c380
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c fdfa63ae8e527ecfaa50f94063c610429cc887cf
 F ext/fts5/fts5_expr.c 495b24f47f4d71b63339572a5beaf9f6e1b486fe
 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246
 F ext/fts5/fts5_index.c 076c4995bf06a6d1559a6e31f9a86b90f2105374
-F ext/fts5/fts5_main.c c5ff6eb7de5fe8e062b54bbee2b1936901533685
+F ext/fts5/fts5_main.c fc47ad734dfb55765b7542a345cee981170e7caa
 F ext/fts5/fts5_storage.c 22ec9b5d35a39e2b5b65daf4ba7cd47fbb2d0df5
 F ext/fts5/fts5_tcl.c 96a3b9e982c4a64a242eefd752fa6669cd405a67
 F ext/fts5/fts5_test_mi.c 80a9e86fb4c5b6b58f8fefac05e9b96d1a6574e1
@@ -1372,7 +1372,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 61cb2fc6c12810863c965c74e90bc502e20cf810
-R d3b6dadb6d0d16c8d1ad296c14b96300
+P f7682435278419829a46bb4cc9b5625d46549e22
+R 5c7dc1bc59e7a8c21161b1ef8857c7b8
 U dan
-Z 2a4c5177ad3c19913de9e61965a0ba07
+Z c11fd987f7eb5e43e308c10674f8c3b9
index 24756f2611fd8ab943e6614f136cc245b6150bf9..584731300e9206a815d722b9e1f92893fa743577 100644 (file)
@@ -1 +1 @@
-f7682435278419829a46bb4cc9b5625d46549e22
\ No newline at end of file
+efb7c9c5d0015c8c966f8d6742c05cda82fc146a
\ No newline at end of file