mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Add the MemPage.noPayload boolean and use it to help
cellSizePtr() and btreeParseCellPtr() run faster. FossilOrigin-Name: 8e3375313ebbf26b68561f3ed31d2a488222e5d0
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Remove\san\sunused\sC-preprocessor\smacro.\s\sNo\sfunctional\schanges\sto\sthe\scode.
|
C Add\sthe\sMemPage.noPayload\sboolean\sand\suse\sit\sto\shelp\ncellSizePtr()\sand\sbtreeParseCellPtr()\srun\sfaster.
|
||||||
D 2014-09-23T23:12:53.118
|
D 2014-09-24T00:59:08.082
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
|
F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -172,9 +172,9 @@ F src/auth.c d8abcde53426275dab6243b441256fcd8ccbebb2
|
|||||||
F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e
|
F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e
|
||||||
F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
|
F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
|
||||||
F src/btmutex.c 49ca66250c7dfa844a4d4cb8272b87420d27d3a5
|
F src/btmutex.c 49ca66250c7dfa844a4d4cb8272b87420d27d3a5
|
||||||
F src/btree.c b10d4c349e62faca4ff86f168a02ca9988d1fd6f
|
F src/btree.c d64b3c5569bda0e7fbe9bc9388e17eaf70d63dec
|
||||||
F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
|
F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
|
||||||
F src/btreeInt.h a5a869ec2c3e56ee9e214ee748d7942716be0340
|
F src/btreeInt.h 9db0d303b203d18871dc9a1d78a3e1ae4d62c1ef
|
||||||
F src/build.c 8dbca25988045fbf2a33c9631c42706fa6449e60
|
F src/build.c 8dbca25988045fbf2a33c9631c42706fa6449e60
|
||||||
F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
|
F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
|
||||||
F src/complete.c 535183afb3c75628b78ce82612931ac7cdf26f14
|
F src/complete.c 535183afb3c75628b78ce82612931ac7cdf26f14
|
||||||
@@ -1200,7 +1200,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 4147f6671e3faa8ddffab8387a6c7d9b5b962fc8
|
P f480582ccae0e9a917d4523191025bd16016ba64
|
||||||
R ff3738f15db60d92a05b3981ec1f9ca5
|
R a8f50a441085b36b058ddd2aec76446f
|
||||||
U drh
|
U drh
|
||||||
Z 53dcb91c2d5e4a116ccba455c707085a
|
Z b0d06d7ed20970cccde4605a2a98dc92
|
||||||
|
@@ -1 +1 @@
|
|||||||
f480582ccae0e9a917d4523191025bd16016ba64
|
8e3375313ebbf26b68561f3ed31d2a488222e5d0
|
69
src/btree.c
69
src/btree.c
@@ -974,20 +974,25 @@ static void btreeParseCellPtr(
|
|||||||
u8 *pCell, /* Pointer to the cell text. */
|
u8 *pCell, /* Pointer to the cell text. */
|
||||||
CellInfo *pInfo /* Fill in this structure */
|
CellInfo *pInfo /* Fill in this structure */
|
||||||
){
|
){
|
||||||
u8 *pIter = &pCell[pPage->childPtrSize];
|
u8 *pIter; /* For scanning through pCell */
|
||||||
u32 nPayload; /* Number of bytes of cell payload */
|
u32 nPayload; /* Number of bytes of cell payload */
|
||||||
|
|
||||||
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
|
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
|
||||||
assert( pPage->leaf==0 || pPage->leaf==1 );
|
assert( pPage->leaf==0 || pPage->leaf==1 );
|
||||||
if( pPage->intKey ){
|
if( pPage->intKeyLeaf ){
|
||||||
if( pPage->hasData ){
|
assert( pPage->childPtrSize==0 );
|
||||||
assert( pIter==pCell );
|
pIter = pCell + getVarint32(pCell, nPayload);
|
||||||
pIter += getVarint32(pIter, nPayload);
|
|
||||||
}else{
|
|
||||||
nPayload = 0;
|
|
||||||
}
|
|
||||||
pIter += getVarint(pIter, (u64*)&pInfo->nKey);
|
pIter += getVarint(pIter, (u64*)&pInfo->nKey);
|
||||||
|
}else if( pPage->noPayload ){
|
||||||
|
assert( pPage->childPtrSize==4 );
|
||||||
|
pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey);
|
||||||
|
pInfo->nPayload = 0;
|
||||||
|
pInfo->nLocal = 0;
|
||||||
|
pInfo->iOverflow = 0;
|
||||||
|
pInfo->pPayload = 0;
|
||||||
|
return;
|
||||||
}else{
|
}else{
|
||||||
|
pIter = pCell + pPage->childPtrSize;
|
||||||
pIter += getVarint32(pIter, nPayload);
|
pIter += getVarint32(pIter, nPayload);
|
||||||
pInfo->nKey = nPayload;
|
pInfo->nKey = nPayload;
|
||||||
}
|
}
|
||||||
@@ -1046,9 +1051,9 @@ static void btreeParseCell(
|
|||||||
** the space used by the cell pointer.
|
** the space used by the cell pointer.
|
||||||
*/
|
*/
|
||||||
static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
|
static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
|
||||||
u8 *pIter = &pCell[pPage->childPtrSize];
|
u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */
|
||||||
u8 *pEnd;
|
u8 *pEnd; /* End mark for a varint */
|
||||||
u32 nSize;
|
u32 nSize; /* Size value to return */
|
||||||
|
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
/* The value returned by this function should always be the same as
|
/* The value returned by this function should always be the same as
|
||||||
@@ -1059,7 +1064,12 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
|
|||||||
btreeParseCellPtr(pPage, pCell, &debuginfo);
|
btreeParseCellPtr(pPage, pCell, &debuginfo);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( pPage->intKey==0 || pPage->hasData ){
|
if( pPage->noPayload ){
|
||||||
|
pEnd = &pIter[9];
|
||||||
|
while( (*pIter++)&0x80 && pIter<pEnd );
|
||||||
|
assert( pPage->childPtrSize==4 );
|
||||||
|
return (u16)(pIter - pCell);
|
||||||
|
}
|
||||||
nSize = *pIter;
|
nSize = *pIter;
|
||||||
if( nSize>=0x80 ){
|
if( nSize>=0x80 ){
|
||||||
pEnd = &pIter[9];
|
pEnd = &pIter[9];
|
||||||
@@ -1069,9 +1079,6 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
|
|||||||
}while( *(pIter)>=0x80 && pIter<pEnd );
|
}while( *(pIter)>=0x80 && pIter<pEnd );
|
||||||
}
|
}
|
||||||
pIter++;
|
pIter++;
|
||||||
}else{
|
|
||||||
nSize = 0;
|
|
||||||
}
|
|
||||||
if( pPage->intKey ){
|
if( pPage->intKey ){
|
||||||
/* pIter now points at the 64-bit integer key value, a variable length
|
/* pIter now points at the 64-bit integer key value, a variable length
|
||||||
** integer. The following block moves pIter to point at the first byte
|
** integer. The following block moves pIter to point at the first byte
|
||||||
@@ -1079,10 +1086,12 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
|
|||||||
pEnd = &pIter[9];
|
pEnd = &pIter[9];
|
||||||
while( (*pIter++)&0x80 && pIter<pEnd );
|
while( (*pIter++)&0x80 && pIter<pEnd );
|
||||||
}
|
}
|
||||||
|
|
||||||
testcase( nSize==pPage->maxLocal );
|
testcase( nSize==pPage->maxLocal );
|
||||||
testcase( nSize==pPage->maxLocal+1 );
|
testcase( nSize==pPage->maxLocal+1 );
|
||||||
if( nSize>pPage->maxLocal ){
|
if( nSize<=pPage->maxLocal ){
|
||||||
|
nSize += (u32)(pIter - pCell);
|
||||||
|
if( nSize<4 ) nSize = 4;
|
||||||
|
}else{
|
||||||
int minLocal = pPage->minLocal;
|
int minLocal = pPage->minLocal;
|
||||||
nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
|
nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
|
||||||
testcase( nSize==pPage->maxLocal );
|
testcase( nSize==pPage->maxLocal );
|
||||||
@@ -1090,15 +1099,8 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
|
|||||||
if( nSize>pPage->maxLocal ){
|
if( nSize>pPage->maxLocal ){
|
||||||
nSize = minLocal;
|
nSize = minLocal;
|
||||||
}
|
}
|
||||||
nSize += 4;
|
nSize += 4 + (u16)(pIter - pCell);
|
||||||
}
|
}
|
||||||
nSize += (u32)(pIter - pCell);
|
|
||||||
|
|
||||||
/* The minimum size of any cell is 4 bytes. */
|
|
||||||
if( nSize<4 ){
|
|
||||||
nSize = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert( nSize==debuginfo.nSize || CORRUPT_DB );
|
assert( nSize==debuginfo.nSize || CORRUPT_DB );
|
||||||
return (u16)nSize;
|
return (u16)nSize;
|
||||||
}
|
}
|
||||||
@@ -1442,12 +1444,14 @@ static int decodeFlags(MemPage *pPage, int flagByte){
|
|||||||
pBt = pPage->pBt;
|
pBt = pPage->pBt;
|
||||||
if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
|
if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
|
||||||
pPage->intKey = 1;
|
pPage->intKey = 1;
|
||||||
pPage->hasData = pPage->leaf;
|
pPage->intKeyLeaf = pPage->leaf;
|
||||||
|
pPage->noPayload = !pPage->leaf;
|
||||||
pPage->maxLocal = pBt->maxLeaf;
|
pPage->maxLocal = pBt->maxLeaf;
|
||||||
pPage->minLocal = pBt->minLeaf;
|
pPage->minLocal = pBt->minLeaf;
|
||||||
}else if( flagByte==PTF_ZERODATA ){
|
}else if( flagByte==PTF_ZERODATA ){
|
||||||
pPage->intKey = 0;
|
pPage->intKey = 0;
|
||||||
pPage->hasData = 0;
|
pPage->intKeyLeaf = 0;
|
||||||
|
pPage->noPayload = 0;
|
||||||
pPage->maxLocal = pBt->maxLocal;
|
pPage->maxLocal = pBt->maxLocal;
|
||||||
pPage->minLocal = pBt->minLocal;
|
pPage->minLocal = pBt->minLocal;
|
||||||
}else{
|
}else{
|
||||||
@@ -3855,7 +3859,7 @@ int sqlite3BtreeKeySize(BtCursor *pCur, i64 *pSize){
|
|||||||
int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){
|
int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){
|
||||||
assert( cursorHoldsMutex(pCur) );
|
assert( cursorHoldsMutex(pCur) );
|
||||||
assert( pCur->eState==CURSOR_VALID );
|
assert( pCur->eState==CURSOR_VALID );
|
||||||
assert( pCur->apPage[pCur->iPage]->intKey==1 );
|
assert( pCur->apPage[pCur->iPage]->intKeyLeaf==1 );
|
||||||
getCellInfo(pCur);
|
getCellInfo(pCur);
|
||||||
*pSize = pCur->info.nPayload;
|
*pSize = pCur->info.nPayload;
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
@@ -4690,7 +4694,7 @@ int sqlite3BtreeMovetoUnpacked(
|
|||||||
for(;;){
|
for(;;){
|
||||||
i64 nCellKey;
|
i64 nCellKey;
|
||||||
pCell = findCell(pPage, idx) + pPage->childPtrSize;
|
pCell = findCell(pPage, idx) + pPage->childPtrSize;
|
||||||
if( pPage->hasData ){
|
if( pPage->intKeyLeaf ){
|
||||||
while( 0x80 <= *(pCell++) ){
|
while( 0x80 <= *(pCell++) ){
|
||||||
if( pCell>=pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT;
|
if( pCell>=pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT;
|
||||||
}
|
}
|
||||||
@@ -5617,8 +5621,7 @@ static int fillInCell(
|
|||||||
/* Fill in the header. */
|
/* Fill in the header. */
|
||||||
nHeader = pPage->childPtrSize;
|
nHeader = pPage->childPtrSize;
|
||||||
nPayload = nData + nZero;
|
nPayload = nData + nZero;
|
||||||
if( pPage->hasData ){
|
if( pPage->intKeyLeaf ){
|
||||||
assert( pPage->intKey );
|
|
||||||
nHeader += putVarint32(&pCell[nHeader], nPayload);
|
nHeader += putVarint32(&pCell[nHeader], nPayload);
|
||||||
}else{
|
}else{
|
||||||
assert( nData==0 );
|
assert( nData==0 );
|
||||||
@@ -6391,7 +6394,7 @@ static int balance_nonroot(
|
|||||||
** leafData: 1 if pPage holds key+data and pParent holds only keys.
|
** leafData: 1 if pPage holds key+data and pParent holds only keys.
|
||||||
*/
|
*/
|
||||||
leafCorrection = apOld[0]->leaf*4;
|
leafCorrection = apOld[0]->leaf*4;
|
||||||
leafData = apOld[0]->hasData;
|
leafData = apOld[0]->intKeyLeaf;
|
||||||
for(i=0; i<nOld; i++){
|
for(i=0; i<nOld; i++){
|
||||||
int limit;
|
int limit;
|
||||||
|
|
||||||
@@ -6967,7 +6970,7 @@ static int balance(BtCursor *pCur){
|
|||||||
rc = sqlite3PagerWrite(pParent->pDbPage);
|
rc = sqlite3PagerWrite(pParent->pDbPage);
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
#ifndef SQLITE_OMIT_QUICKBALANCE
|
#ifndef SQLITE_OMIT_QUICKBALANCE
|
||||||
if( pPage->hasData
|
if( pPage->intKeyLeaf
|
||||||
&& pPage->nOverflow==1
|
&& pPage->nOverflow==1
|
||||||
&& pPage->aiOvfl[0]==pPage->nCell
|
&& pPage->aiOvfl[0]==pPage->nCell
|
||||||
&& pParent->pgno!=1
|
&& pParent->pgno!=1
|
||||||
|
@@ -273,9 +273,10 @@ typedef struct BtLock BtLock;
|
|||||||
struct MemPage {
|
struct MemPage {
|
||||||
u8 isInit; /* True if previously initialized. MUST BE FIRST! */
|
u8 isInit; /* True if previously initialized. MUST BE FIRST! */
|
||||||
u8 nOverflow; /* Number of overflow cell bodies in aCell[] */
|
u8 nOverflow; /* Number of overflow cell bodies in aCell[] */
|
||||||
u8 intKey; /* True if intkey flag is set */
|
u8 intKey; /* True if table b-trees. False for index b-trees */
|
||||||
u8 leaf; /* True if leaf flag is set */
|
u8 intKeyLeaf; /* True if the leaf of an intKey table */
|
||||||
u8 hasData; /* True if this page stores data */
|
u8 noPayload; /* True if internal intKey page (thus w/o data) */
|
||||||
|
u8 leaf; /* True if a leaf page */
|
||||||
u8 hdrOffset; /* 100 for page 1. 0 otherwise */
|
u8 hdrOffset; /* 100 for page 1. 0 otherwise */
|
||||||
u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */
|
u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */
|
||||||
u8 max1bytePayload; /* min(maxLocal,127) */
|
u8 max1bytePayload; /* min(maxLocal,127) */
|
||||||
|
Reference in New Issue
Block a user