From: dan Date: Wed, 12 Aug 2015 15:36:58 +0000 (+0000) Subject: Minor optimization for fts5 API xInst(). X-Git-Tag: version-3.9.0~225 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7899fa78c1447dc0256bbb2498740e5812ee9b69;p=thirdparty%2Fsqlite.git Minor optimization for fts5 API xInst(). FossilOrigin-Name: efb7c9c5d0015c8c966f8d6742c05cda82fc146a --- diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 5115fe7d96..1f42716514 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -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=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{ diff --git a/manifest b/manifest index f14c5e00be..c0121c70db 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 24756f2611..584731300e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f7682435278419829a46bb4cc9b5625d46549e22 \ No newline at end of file +efb7c9c5d0015c8c966f8d6742c05cda82fc146a \ No newline at end of file