]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Another optimization for fts5 prefix (and other) queries.
authordan <dan@noemail.net>
Mon, 19 Oct 2015 20:49:10 +0000 (20:49 +0000)
committerdan <dan@noemail.net>
Mon, 19 Oct 2015 20:49:10 +0000 (20:49 +0000)
FossilOrigin-Name: 60a8bde055a960c5b8cb4e231802c75617c942d8

ext/fts5/fts5Int.h
ext/fts5/fts5_buffer.c
ext/fts5/fts5_index.c
manifest
manifest.uuid

index bef185b07b6e117f75f9a1e514883a5b3a3e8199..b6c498fc3f6b2796f67615664b6c25f0bb1606c1 100644 (file)
@@ -224,6 +224,7 @@ struct Fts5Buffer {
   int nSpace;
 };
 
+int sqlite3Fts5BufferSize(int*, Fts5Buffer*, int);
 int sqlite3Fts5BufferGrow(int*, Fts5Buffer*, int);
 void sqlite3Fts5BufferAppendVarint(int*, Fts5Buffer*, i64);
 void sqlite3Fts5BufferAppendBlob(int*, Fts5Buffer*, int, const u8*);
@@ -237,13 +238,17 @@ void sqlite3Fts5BufferAppend32(int*, Fts5Buffer*, int);
 char *sqlite3Fts5Mprintf(int *pRc, const char *zFmt, ...);
 
 #define fts5BufferZero(x)             sqlite3Fts5BufferZero(x)
-#define fts5BufferGrow(a,b,c)         sqlite3Fts5BufferGrow(a,b,c)
 #define fts5BufferAppendVarint(a,b,c) sqlite3Fts5BufferAppendVarint(a,b,c)
 #define fts5BufferFree(a)             sqlite3Fts5BufferFree(a)
 #define fts5BufferAppendBlob(a,b,c,d) sqlite3Fts5BufferAppendBlob(a,b,c,d)
 #define fts5BufferSet(a,b,c,d)        sqlite3Fts5BufferSet(a,b,c,d)
 #define fts5BufferAppend32(a,b,c)     sqlite3Fts5BufferAppend32(a,b,c)
 
+#define fts5BufferGrow(pRc,pBuf,nn) ( \
+  (pBuf)->n + (nn) <= (pBuf)->nSpace ? 0 : \
+    sqlite3Fts5BufferSize((pRc),(pBuf),(nn)+(pBuf)->n) \
+)
+
 /* Write and decode big-endian 32-bit integer values */
 void sqlite3Fts5Put32(u8*, int);
 int sqlite3Fts5Get32(const u8*);
index 07d8516ce40c5d0be80efae71b91abd81e43d8c2..bb64ce70d1b18f8ddecf4807685326e58001fde3 100644 (file)
 
 #include "fts5Int.h"
 
-int sqlite3Fts5BufferGrow(int *pRc, Fts5Buffer *pBuf, int nByte){
-
-  if( (pBuf->n + nByte) > pBuf->nSpace ){
-    u8 *pNew;
-    int nNew = pBuf->nSpace ? pBuf->nSpace*2 : 64;
-
-    /* A no-op if an error has already occurred */
-    if( *pRc ) return 1;
-
-    while( nNew<(pBuf->n + nByte) ){
-      nNew = nNew * 2;
-    }
-    pNew = sqlite3_realloc(pBuf->p, nNew);
-    if( pNew==0 ){
-      *pRc = SQLITE_NOMEM;
-      return 1;
-    }else{
-      pBuf->nSpace = nNew;
-      pBuf->p = pNew;
-    }
+int sqlite3Fts5BufferSize(int *pRc, Fts5Buffer *pBuf, int nByte){
+  int nNew = pBuf->nSpace ? pBuf->nSpace*2 : 64;
+  u8 *pNew;
+  while( nNew<nByte ){
+    nNew = nNew * 2;
+  }
+  pNew = sqlite3_realloc(pBuf->p, nNew);
+  if( pNew==0 ){
+    *pRc = SQLITE_NOMEM;
+    return 1;
+  }else{
+    pBuf->nSpace = nNew;
+    pBuf->p = pNew;
   }
   return 0;
 }
 
+
 /*
 ** Encode value iVal as an SQLite varint and append it to the buffer object
 ** pBuf. If an OOM error occurs, set the error code in p.
 */
 void sqlite3Fts5BufferAppendVarint(int *pRc, Fts5Buffer *pBuf, i64 iVal){
-  if( sqlite3Fts5BufferGrow(pRc, pBuf, 9) ) return;
+  if( fts5BufferGrow(pRc, pBuf, 9) ) return;
   pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iVal);
 }
 
@@ -60,7 +54,7 @@ int sqlite3Fts5Get32(const u8 *aBuf){
 }
 
 void sqlite3Fts5BufferAppend32(int *pRc, Fts5Buffer *pBuf, int iVal){
-  if( sqlite3Fts5BufferGrow(pRc, pBuf, 4) ) return;
+  if( fts5BufferGrow(pRc, pBuf, 4) ) return;
   sqlite3Fts5Put32(&pBuf->p[pBuf->n], iVal);
   pBuf->n += 4;
 }
@@ -77,7 +71,7 @@ void sqlite3Fts5BufferAppendBlob(
   const u8 *pData
 ){
   assert( *pRc || nData>=0 );
-  if( sqlite3Fts5BufferGrow(pRc, pBuf, nData) ) return;
+  if( fts5BufferGrow(pRc, pBuf, nData) ) return;
   memcpy(&pBuf->p[pBuf->n], pData, nData);
   pBuf->n += nData;
 }
@@ -227,7 +221,7 @@ int sqlite3Fts5PoslistWriterAppend(
 ){
   static const i64 colmask = ((i64)(0x7FFFFFFF)) << 32;
   int rc = SQLITE_OK;
-  if( 0==sqlite3Fts5BufferGrow(&rc, pBuf, 5+5+5) ){
+  if( 0==fts5BufferGrow(&rc, pBuf, 5+5+5) ){
     if( (iPos & colmask) != (pWriter->iPrev & colmask) ){
       pBuf->p[pBuf->n++] = 1;
       pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos>>32));
index cf4f3d8bb3351cc70c66a5c079ae3160386a2c06..19ea73ab9639c60ce433d8f87ee44fd2b2535a4e 100644 (file)
@@ -4107,9 +4107,6 @@ static int fts5AppendPoslist(
     assert( fts5MultiIterEof(p, pMulti)==0 );
     assert( pSeg->nPos>0 );
     if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+9+9) ){
-      int iSv1;
-      int iSv2;
-      int iData;
 
       if( pSeg->iLeafOffset+pSeg->nPos<=pSeg->pLeaf->szLeaf 
        && (pColset==0 || pColset->nCol==1)
@@ -4127,6 +4124,10 @@ static int fts5AppendPoslist(
         fts5BufferSafeAppendVarint(pBuf, nPos*2);
         fts5BufferSafeAppendBlob(pBuf, pPos, nPos);
       }else{
+        int iSv1;
+        int iSv2;
+        int iData;
+
         /* Append iDelta */
         iSv1 = pBuf->n;
         fts5BufferSafeAppendVarint(pBuf, iDelta);
@@ -4152,6 +4153,7 @@ static int fts5AppendPoslist(
           }
         }
       }
+
     }
   }
 
@@ -4240,7 +4242,7 @@ static void fts5MergePrefixLists(
     memset(&out, 0, sizeof(out));
     memset(&tmp, 0, sizeof(tmp));
 
-    sqlite3Fts5BufferGrow(&p->rc, &out, p1->n + p2->n);
+    fts5BufferGrow(&p->rc, &out, p1->n + p2->n);
     fts5DoclistIterInit(p1, &i1);
     fts5DoclistIterInit(p2, &i2);
     while( p->rc==SQLITE_OK && (i1.aPoslist!=0 || i2.aPoslist!=0) ){
@@ -4603,7 +4605,7 @@ int sqlite3Fts5IndexQuery(
   /* If the QUERY_SCAN flag is set, all other flags must be clear. */
   assert( (flags & FTS5INDEX_QUERY_SCAN)==0 || flags==FTS5INDEX_QUERY_SCAN );
 
-  if( sqlite3Fts5BufferGrow(&p->rc, &buf, nToken+1)==0 ){
+  if( fts5BufferGrow(&p->rc, &buf, nToken+1)==0 ){
     memcpy(&buf.p[1], pToken, nToken);
 
 #ifdef SQLITE_DEBUG
index 84b919c29883a4aabad6ade610d62a8642df6c70..3418ca7815adb589357b6e7c6de9ca73db30081c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Another\stweak\sto\simprove\sperformance\sof\sfts5\sprefix\squeries.
-D 2015-10-19T17:43:24.360
+C Another\soptimization\sfor\sfts5\sprefix\s(and\sother)\squeries.
+D 2015-10-19T20:49:10.124
 F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 4eb750e0fdf52050a06d881e1b060f4bb116ed7e
@@ -103,13 +103,13 @@ F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252
 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95
 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0
 F ext/fts5/fts5.h 8b9a13b309b180e9fb88ea5666c0d8d73c6102d9
-F ext/fts5/fts5Int.h 0332d12fdca0f4fe2231df71bd7544b3cef81122
+F ext/fts5/fts5Int.h db1d5a18bae953c749198fe6d87862055ef55a1d
 F ext/fts5/fts5_aux.c 1f384972d606375b8fa078319f25ab4b5feb1b35
-F ext/fts5/fts5_buffer.c 9a3aa73a4e7b26b1c805b9c92c1344ba3d19d2a8
+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 8468e41855bba133107760badda415bc7f86c12c
+F ext/fts5/fts5_index.c 38d7ddd4d5650007ee83000f0f96967ff83c710c
 F ext/fts5/fts5_main.c 520a29136ba07448331f73bdc36d0ffa1e9dcfef
 F ext/fts5/fts5_storage.c 9b30115742b758706de70595a8d1d084e940c978
 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 68ee426a6432ac63655909ff70cb22bde33cf28c
-R b1e8d85157aaa205dae46563b3080619
+P 69be427c864dc3de804ca3c5f1c6addcd33cd188
+R cf51e15890c7ae1ec9dc153fd0832e0a
 U dan
-Z e2816fa336eec46724399248fb4f473f
+Z 01b7158ec138174afd0e008584d0b467
index 833def65e8c18be7499bd36ffc8ead111d3103dc..4e22ea3ddd1a01fc9767f016fcb541670bf2d3cf 100644 (file)
@@ -1 +1 @@
-69be427c864dc3de804ca3c5f1c6addcd33cd188
\ No newline at end of file
+60a8bde055a960c5b8cb4e231802c75617c942d8
\ No newline at end of file