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; i<pHash->nSlot; 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;
}
/*
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 */
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));
p->iRowid = iRowid;
p->pNext = pHash->aSlot[iHash];
pHash->aSlot[iHash] = p;
+ pHash->nEntry++;
nIncr += p->nData;
}
pList = fts5HashEntryMerge(pList, ap[i]);
}
+ pHash->nEntry = 0;
sqlite3_free(ap);
*ppSorted = pList;
return SQLITE_OK;
-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
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
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