From: dan Date: Tue, 12 Aug 2014 08:36:00 +0000 (+0000) Subject: Automatically resize the hash table used by fts5. X-Git-Tag: version-3.8.11~114^2~135 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e2fb318e341e3dfe9c670f02f409b2723ba842fc;p=thirdparty%2Fsqlite.git Automatically resize the hash table used by fts5. FossilOrigin-Name: f1cb48f412a5f200f1fe04f91072864f379db08f --- diff --git a/ext/fts5/fts5_hash.c b/ext/fts5/fts5_hash.c index 3b50f3ac78..97dd0dc0ec 100644 --- a/ext/fts5/fts5_hash.c +++ b/ext/fts5/fts5_hash.c @@ -116,15 +116,46 @@ void sqlite3Fts5HashClear(Fts5Hash *pHash){ pHash->aSlot[i] = 0; } } + pHash->nEntry = 0; } -static unsigned int fts5HashKey(Fts5Hash *pHash, const char *p, int n){ +static unsigned int fts5HashKey(int nSlot, const char *p, int n){ int i; unsigned int h = 13; for(i=n-1; i>=0; i--){ h = (h << 3) ^ h ^ p[i]; } - return (h % pHash->nSlot); + return (h % nSlot); +} + +/* +** Resize the hash table by doubling the number of slots. +*/ +static int fts5HashResize(Fts5Hash *pHash){ + int nNew = pHash->nSlot*2; + int i; + Fts5HashEntry **apNew; + Fts5HashEntry **apOld = pHash->aSlot; + + apNew = (Fts5HashEntry**)sqlite3_malloc(nNew*sizeof(Fts5HashEntry*)); + if( !apNew ) return SQLITE_NOMEM; + memset(apNew, 0, nNew*sizeof(Fts5HashEntry*)); + + for(i=0; inSlot; i++){ + while( apOld[i] ){ + int iHash; + Fts5HashEntry *p = apOld[i]; + apOld[i] = p->pNext; + iHash = fts5HashKey(nNew, p->zKey, strlen(p->zKey)); + p->pNext = apNew[iHash]; + apNew[iHash] = p; + } + } + + sqlite3_free(apOld); + pHash->nSlot = nNew; + pHash->aSlot = apNew; + return SQLITE_OK; } /* @@ -153,7 +184,7 @@ int sqlite3Fts5HashWrite( int iPos, /* Position of token within column */ const char *pToken, int nToken /* Token to add or remove to or from index */ ){ - unsigned int iHash = fts5HashKey(pHash, pToken, nToken); + unsigned int iHash = fts5HashKey(pHash->nSlot, pToken, nToken); Fts5HashEntry *p; u8 *pPtr; int nIncr = 0; /* Amount to increment (*pHash->pnByte) by */ @@ -168,6 +199,12 @@ int sqlite3Fts5HashWrite( int nByte = sizeof(Fts5HashEntry) + nToken + 1 + 64; if( nByte<128 ) nByte = 128; + if( (pHash->nEntry*2)>=pHash->nSlot ){ + int rc = fts5HashResize(pHash); + if( rc!=SQLITE_OK ) return rc; + iHash = fts5HashKey(pHash->nSlot, pToken, nToken); + } + p = (Fts5HashEntry*)sqlite3_malloc(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, sizeof(Fts5HashEntry)); @@ -179,6 +216,7 @@ int sqlite3Fts5HashWrite( p->iRowid = iRowid; p->pNext = pHash->aSlot[iHash]; pHash->aSlot[iHash] = p; + pHash->nEntry++; nIncr += p->nData; } @@ -317,6 +355,7 @@ static int fts5HashEntrySort(Fts5Hash *pHash, Fts5HashEntry **ppSorted){ pList = fts5HashEntryMerge(pList, ap[i]); } + pHash->nEntry = 0; sqlite3_free(ap); *ppSorted = pList; return SQLITE_OK; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index a21f881e61..9676ad4b45 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3293,7 +3293,7 @@ static void fts5IndexFlush(Fts5Index *p){ ** to the document with rowid iRowid. */ void sqlite3Fts5IndexBeginWrite(Fts5Index *p, i64 iRowid){ - if( iRowid<=p->iWriteRowid ){ + if( iRowid<=p->iWriteRowid || (p->nPendingData > p->nMaxPendingData) ){ fts5IndexFlush(p); } p->iWriteRowid = iRowid; diff --git a/manifest b/manifest index fab8b27016..0e007fa42a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\sway\sposition\slists\sare\scopied\swhen\smerging\sdata. -D 2014-08-11T20:26:34.077 +C Automatically\sresize\sthe\shash\stable\sused\sby\sfts5. +D 2014-08-12T08:36:00.189 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in b03432313a3aad96c706f8164fb9f5307eaf19f5 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -110,8 +110,8 @@ F ext/fts5/fts5_aux.c 31e581413ecab0962ce2b37468f9f658f36f4b0e F ext/fts5/fts5_buffer.c 248c61ac9fec001602efc72a45704f3b8d367c00 F ext/fts5/fts5_config.c f4ebf143e141b8c77355e3b15aba81b7be51d710 F ext/fts5/fts5_expr.c 7b8e380233176053841904a86006696ee8f6cd24 -F ext/fts5/fts5_hash.c 2af412d00f65ad427f18acbe421c113413cdef06 -F ext/fts5/fts5_index.c 687736cba90a735ecd3cf9bf0e4174e7e5cc3f60 +F ext/fts5/fts5_hash.c 63fa8379c5f2ac107d47c2b7d9ac04c95ef8a279 +F ext/fts5/fts5_index.c 0453bb593fe0ef6245762b6823e88839757fdc75 F ext/fts5/fts5_storage.c fa3c8fc4766d850a4977bf1d4b71c37e7b07ab8b F ext/fts5/fts5parse.y 777da8e5819f75c217982c79c29d014c293acac9 F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43 @@ -1202,7 +1202,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 617e2fac1c128212254f71b1a8fddaf0d1d90262 -R b29d729688c110acdf84d0128dad3fdf +P 9f8d678a0ea75e169daf8b3f00bd05f52a050ea6 +R 0ec55f1e05fde288099bbb5e345c2533 U dan -Z 772c48dd1029e003fed3d46062572012 +Z 0fd4a4dea7b2432712fcac248306942e diff --git a/manifest.uuid b/manifest.uuid index 7afe20b569..aa7d7d2665 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9f8d678a0ea75e169daf8b3f00bd05f52a050ea6 \ No newline at end of file +f1cb48f412a5f200f1fe04f91072864f379db08f \ No newline at end of file