]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Further optimizations for fts5 prefix queries without a prefix index.
authordan <dan@noemail.net>
Wed, 7 Oct 2015 19:06:21 +0000 (19:06 +0000)
committerdan <dan@noemail.net>
Wed, 7 Oct 2015 19:06:21 +0000 (19:06 +0000)
FossilOrigin-Name: 83dc1ff7fa010715ca7f406a572f4ee444a967d7

ext/fts5/fts5_index.c
manifest
manifest.uuid

index 5b2914ab49f3c7ef6f15907114e0aa0ed2052cf6..ec9ed3b9218de4297cf40455fdbcd9503d51e5bb 100644 (file)
@@ -313,6 +313,7 @@ struct Fts5DoclistIter {
   i64 iRowid;
   u8 *aPoslist;
   int nPoslist;
+  int nSize;
 };
 
 /*
@@ -4048,7 +4049,6 @@ static int fts5MultiIterPoslist(
   Fts5Index *p,
   Fts5IndexIter *pMulti,
   Fts5Colset *pColset,
-  int bSz,                        /* Append a size field before the data */
   Fts5Buffer *pBuf
 ){
   if( p->rc==SQLITE_OK ){
@@ -4058,16 +4058,14 @@ static int fts5MultiIterPoslist(
     Fts5SegIter *pSeg = &pMulti->aSeg[ pMulti->aFirst[1].iFirst ];
     assert( fts5MultiIterEof(p, pMulti)==0 );
 
-    if( bSz ){
-      /* WRITEPOSLISTSIZE */
-      iSz = pBuf->n;
-      fts5BufferAppendVarint(&p->rc, pBuf, pSeg->nPos*2);
-      iData = pBuf->n;
-    }
+    /* WRITEPOSLISTSIZE */
+    iSz = pBuf->n;
+    fts5BufferSafeAppendVarint(pBuf, pSeg->nPos*2);
+    iData = pBuf->n;
 
     fts5SegiterPoslist(p, pSeg, pColset, pBuf);
 
-    if( bSz && pColset ){
+    if( pColset ){
       int nActual = pBuf->n - iData;
       if( nActual!=pSeg->nPos ){
         /* WRITEPOSLISTSIZE */
@@ -4086,7 +4084,7 @@ static int fts5MultiIterPoslist(
 }
 
 static void fts5DoclistIterNext(Fts5DoclistIter *pIter){
-  u8 *p = pIter->aPoslist + pIter->nPoslist;
+  u8 *p = pIter->aPoslist + pIter->nSize + pIter->nPoslist;
 
   assert( pIter->aPoslist );
   if( p>=pIter->aEof ){
@@ -4100,11 +4098,11 @@ static void fts5DoclistIterNext(Fts5DoclistIter *pIter){
     /* Read position list size */
     if( p[0] & 0x80 ){
       int nPos;
-      p += fts5GetVarint32(p, nPos);
+      pIter->nSize = fts5GetVarint32(p, nPos);
       pIter->nPoslist = (nPos>>1);
     }else{
       pIter->nPoslist = ((int)(p[0])) >> 1;
-      p++;
+      pIter->nSize = 1;
     }
 
     pIter->aPoslist = p;
@@ -4174,17 +4172,13 @@ static void fts5MergePrefixLists(
       if( i2.aPoslist==0 || (i1.aPoslist && i1.iRowid<i2.iRowid) ){
         /* Copy entry from i1 */
         fts5MergeAppendDocid(&out, iLastRowid, i1.iRowid);
-        /* WRITEPOSLISTSIZE */
-        fts5BufferSafeAppendVarint(&out, i1.nPoslist * 2);
-        fts5BufferSafeAppendBlob(&out, i1.aPoslist, i1.nPoslist);
+        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);
-        /* WRITEPOSLISTSIZE */
-        fts5BufferSafeAppendVarint(&out, i2.nPoslist * 2);
-        fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.nPoslist);
+        fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.nPoslist+i2.nSize);
         fts5DoclistIterNext(&i2);
       }
       else{
@@ -4192,6 +4186,8 @@ static void fts5MergePrefixLists(
         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));
@@ -4200,19 +4196,19 @@ static void fts5MergePrefixLists(
         fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
         fts5BufferZero(&tmp);
 
-        sqlite3Fts5PoslistNext64(i1.aPoslist, i1.nPoslist, &iOff1, &iPos1);
-        sqlite3Fts5PoslistNext64(i2.aPoslist, i2.nPoslist, &iOff2, &iPos2);
+        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(i1.aPoslist, i1.nPoslist, &iOff1, &iPos1);
+            sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
           }else{
             iNew = iPos2;
-            sqlite3Fts5PoslistNext64(i2.aPoslist, i2.nPoslist, &iOff2, &iPos2);
+            sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
             if( iPos1==iPos2 ){
-              sqlite3Fts5PoslistNext64(i1.aPoslist, i1.nPoslist, &iOff1,&iPos1);
+              sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1,&iPos1);
             }
           }
           p->rc = sqlite3Fts5PoslistWriterAppend(&tmp, &writer, iNew);
@@ -4290,7 +4286,7 @@ static void fts5SetupPrefixIter(
         int iSave = doclist.n;
         assert( doclist.n!=0 || iLastRowid==0 );
         fts5BufferSafeAppendVarint(&doclist, iRowid - iLastRowid);
-        if( fts5MultiIterPoslist(p, p1, pColset, 1, &doclist) ){
+        if( fts5MultiIterPoslist(p, p1, pColset, &doclist) ){
           doclist.n = iSave;
         }else{
           iLastRowid = iRowid;
@@ -5239,7 +5235,7 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum){
     fts5TestTerm(p, &term, z, n, cksum2, &cksum3);
 
     poslist.n = 0;
-    fts5MultiIterPoslist(p, pIter, 0, 0, &poslist);
+    fts5SegiterPoslist(p, &pIter->aSeg[pIter->aFirst[1].iFirst] , 0, &poslist);
     while( 0==sqlite3Fts5PoslistNext64(poslist.p, poslist.n, &iOff, &iPos) ){
       int iCol = FTS5_POS2COLUMN(iPos);
       int iTokOff = FTS5_POS2OFFSET(iPos);
index 3b569407f94703f78ff40a4becfb0980772f2a9d..3b1dbcf4a366c2506d69eb162d427da16483ebe3 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sharmless\scompiler\swarning\sin\sFTS5.
-D 2015-10-07T17:06:17.479
+C Further\soptimizations\sfor\sfts5\sprefix\squeries\swithout\sa\sprefix\sindex.
+D 2015-10-07T19:06:21.871
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -112,7 +112,7 @@ F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf
 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695
 F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d
 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246
-F ext/fts5/fts5_index.c 6b818dd5b68237d5d0f7723795a329f0fb2e9987
+F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000
 F ext/fts5/fts5_main.c aa96828990274927e2b404e0b6e60f9ae1274254
 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995
 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37
@@ -1390,7 +1390,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 baec1b96cb64a6a6317143a8df841e502afe3914
-R 450be658799fba4e5ff2cf0a8c0976d8
-U mistachkin
-Z d352d6bcf527145b85d125184e9bb23e
+P 13adcd038fc20dd1b6f344f79b449b4034f8f8f2
+R daa87d323013657b7e115de7ca0f256c
+U dan
+Z 2a38bec14f47e4ff1536197bd0ad1f10
index f85da3f615266e9c8e6ec0c1d91d5d2a921f844d..64c8e6c95fb32cc534beba1be6cbfafa90ca999b 100644 (file)
@@ -1 +1 @@
-13adcd038fc20dd1b6f344f79b449b4034f8f8f2
\ No newline at end of file
+83dc1ff7fa010715ca7f406a572f4ee444a967d7
\ No newline at end of file