From: dan Date: Wed, 7 Oct 2015 19:06:21 +0000 (+0000) Subject: Further optimizations for fts5 prefix queries without a prefix index. X-Git-Tag: version-3.9.0~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=98e713bb8d8870ecf9bf18c6cc1d791d888f2963;p=thirdparty%2Fsqlite.git Further optimizations for fts5 prefix queries without a prefix index. FossilOrigin-Name: 83dc1ff7fa010715ca7f406a572f4ee444a967d7 --- diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 5b2914ab49..ec9ed3b921 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -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.iRowidrc==SQLITE_OK && (iPos1>=0 || iPos2>=0) ){ i64 iNew; if( iPos2<0 || (iPos1>=0 && iPos1rc = 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); diff --git a/manifest b/manifest index 3b569407f9..3b1dbcf4a3 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index f85da3f615..64c8e6c95f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -13adcd038fc20dd1b6f344f79b449b4034f8f8f2 \ No newline at end of file +83dc1ff7fa010715ca7f406a572f4ee444a967d7 \ No newline at end of file