diff options
author | drh <drh@noemail.net> | 2009-04-21 16:15:15 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2009-04-21 16:15:15 +0000 |
commit | cd5a9729d25b00314e88fa7e6b6d58d5b44828eb (patch) | |
tree | f14cdf0f552269712518ebf3cf8c53064f72f473 /src | |
parent | ade9760aeac023d8ec26f9f19dd841bb9b6878e0 (diff) | |
download | sqlite-cd5a9729d25b00314e88fa7e6b6d58d5b44828eb.tar.gz sqlite-cd5a9729d25b00314e88fa7e6b6d58d5b44828eb.zip |
Allocate the initial RowHash object using lookaside. (CVS 6530)
FossilOrigin-Name: 9b30ab7199d8b51bdea8ec7f0410281527623673
Diffstat (limited to 'src')
-rw-r--r-- | src/rowhash.c | 33 | ||||
-rw-r--r-- | src/sqliteInt.h | 4 | ||||
-rw-r--r-- | src/vdbe.c | 4 |
3 files changed, 20 insertions, 21 deletions
diff --git a/src/rowhash.c b/src/rowhash.c index 35ddbbfc5..c1569ed29 100644 --- a/src/rowhash.c +++ b/src/rowhash.c @@ -31,7 +31,7 @@ ** The caller is responsible for insuring that there are no duplicate ** INSERTs. ** -** $Id: rowhash.c,v 1.2 2009/04/21 15:05:19 drh Exp $ +** $Id: rowhash.c,v 1.3 2009/04/21 16:15:15 drh Exp $ */ #include "sqliteInt.h" @@ -136,16 +136,14 @@ struct RowHashBlock { ** around and used as opaque handles by code in other modules. */ struct RowHash { - /* Variables populated by sqlite3RowhashInsert() */ - int nEntry; /* Number of used entries over all RowHashBlocks */ - RowHashBlock *pBlock; /* Linked list of RowHashBlocks */ - - /* Variables populated by makeHashTable() */ - int iBatch; /* The current insert batch number */ - int iMod; /* Number of buckets in hash table */ - int nHeight; /* Height of tree of hash pages */ - RowHashPage *pHash; /* Pointer to root of hash table tree */ - int nLinearLimit; /* Linear search limit (used if pHash==0) */ + int nEntry; /* Number of used entries over all RowHashBlocks */ + int iBatch; /* The current insert batch number */ + u8 nHeight; /* Height of tree of hash pages */ + u8 nLinearLimit; /* Linear search limit (used if pHash==0) */ + int nBucket; /* Number of buckets in hash table */ + RowHashPage *pHash; /* Pointer to root of hash table tree */ + RowHashBlock *pBlock; /* Linked list of RowHashBlocks */ + sqlite3 *db; /* Associated database connection */ }; @@ -205,7 +203,7 @@ static RowHashElem **findHashBucket(RowHash *pRowHash, i64 iVal){ int aOffset[16]; int n; RowHashPage *pPage = pRowHash->pHash; - int h = (((u64)iVal) % pRowHash->iMod); + int h = (((u64)iVal) % pRowHash->nBucket); assert( pRowHash->nHeight < sizeof(aOffset)/sizeof(aOffset[0]) ); for(n=0; n<pRowHash->nHeight; n++){ @@ -233,7 +231,7 @@ static RowHashElem **findHashBucket(RowHash *pRowHash, i64 iVal){ */ static int makeHashTable(RowHash *p, int iBatch){ RowHashBlock *pBlock; - int iMod; + int nBucket; int nLeaf, n; /* Delete the old hash table. */ @@ -250,7 +248,7 @@ static int makeHashTable(RowHash *p, int iBatch){ /* Determine how many leaves the hash-table will comprise. */ nLeaf = 1 + (p->nEntry / (ROWHASH_POINTER_PER_PAGE*ROWHASH_COLLISION_LENGTH)); - p->iMod = iMod = nLeaf*ROWHASH_POINTER_PER_PAGE; + p->nBucket = nBucket = nLeaf*ROWHASH_POINTER_PER_PAGE; /* Set nHeight to the height of the tree that contains the leaf pages. If ** RowHash.nHeight is zero, then the whole hash-table fits on a single @@ -341,15 +339,16 @@ int sqlite3RowhashTest( ** Return SQLITE_OK if all goes as planned. If a malloc() fails, return ** SQLITE_NOMEM. */ -int sqlite3RowhashInsert(RowHash **pp, i64 iVal){ +int sqlite3RowhashInsert(sqlite3 *db, RowHash **pp, i64 iVal){ RowHash *p = *pp; /* If the RowHash structure has not been allocated, allocate it now. */ if( !p ){ - p = (RowHash*)sqlite3MallocZero(sizeof(RowHash)); + p = (RowHash*)sqlite3DbMallocZero(db, sizeof(RowHash)); if( !p ){ return SQLITE_NOMEM; } + p->db = db; *pp = p; } @@ -383,6 +382,6 @@ void sqlite3RowhashDestroy(RowHash *p){ pNext = pBlock->data.pNext; sqlite3_free(pBlock); } - sqlite3_free(p); + sqlite3DbFree(p->db, p); } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 712d0191e..fe2b89333 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -11,7 +11,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.855 2009/04/21 09:02:47 danielk1977 Exp $ +** @(#) $Id: sqliteInt.h,v 1.856 2009/04/21 16:15:15 drh Exp $ */ #ifndef _SQLITEINT_H_ #define _SQLITEINT_H_ @@ -2402,7 +2402,7 @@ void sqlite3RowSetClear(RowSet*); void sqlite3RowSetInsert(RowSet*, i64); int sqlite3RowSetNext(RowSet*, i64*); -int sqlite3RowhashInsert(RowHash **pp, i64 iVal); +int sqlite3RowhashInsert(sqlite3*, RowHash **pp, i64 iVal); int sqlite3RowhashTest(RowHash *p, int iSet, i64 iVal, int *pExists); void sqlite3RowhashDestroy(RowHash *p); diff --git a/src/vdbe.c b/src/vdbe.c index 64760d392..6f22d9148 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -43,7 +43,7 @@ ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. ** -** $Id: vdbe.c,v 1.834 2009/04/21 15:05:19 drh Exp $ +** $Id: vdbe.c,v 1.835 2009/04/21 16:15:15 drh Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" @@ -4647,7 +4647,7 @@ case OP_RowHash: { /* jump, in1, in3 */ } } if( iSet>=0 ){ - rc = sqlite3RowhashInsert(&pIn1->u.pRowHash, pIn3->u.i); + rc = sqlite3RowhashInsert(db, &pIn1->u.pRowHash, pIn3->u.i); } break; } |