mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Reduce the amount of memcpy() required by defragmentPage().
FossilOrigin-Name: 3edab9957cc7bb90b52fd40b02613c2cb03fc166
This commit is contained in:
15
manifest
15
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\sthe\s"PRAGMA\sintegrity_check"\scommand\sso\sthat\sit\savoids\sformatting\serror\nmessage\scontext\smessages\suntil\sit\sactually\sneeds\sto\sgenerate\san\serror\smessage.\nThis\savoids\smuch\sformatting,\sand\shence\sgreatly\simproves\sthe\sperformance\sof\n"PRAGMA\sintegrity_check"\sin\sthe\scommon\scase\swhen\sthere\sare\sno\serrors.\s\sIt\salso\nmakes\sthe\scode\sa\slittle\ssmaller.
|
C Reduce\sthe\samount\sof\smemcpy()\srequired\sby\sdefragmentPage().
|
||||||
D 2014-09-26T02:41:05.726
|
D 2014-09-27T05:00:25.096
|
||||||
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,7 +172,7 @@ 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 59f03e421dad3cb6e27cc7d2393d3a7459be4b5e
|
F src/btree.c 95a942a6ebdb23eb2a5d925526d35169aa6742f6
|
||||||
F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
|
F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
|
||||||
F src/btreeInt.h 1bd7957161a1346a914f1f09231610e777a8e58d
|
F src/btreeInt.h 1bd7957161a1346a914f1f09231610e777a8e58d
|
||||||
F src/build.c bde83dd5cf812e310a7e5ad2846790a14745bef4
|
F src/build.c bde83dd5cf812e310a7e5ad2846790a14745bef4
|
||||||
@@ -1200,7 +1200,10 @@ 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 e93aecc090c2a1d3c231bb2bde044886eff0bdf7
|
P 83913515830aa850f9e38406f9422d7e88dcab66
|
||||||
R 32be19747fff5e8f2465eed0f224b45d
|
R 66a1e1f00a844450677737824735607d
|
||||||
|
T *branch * defrag-opt
|
||||||
|
T *sym-defrag-opt *
|
||||||
|
T -sym-trunk *
|
||||||
U drh
|
U drh
|
||||||
Z f56b9000203c19d0f3a8172e8374b279
|
Z f60a1f2e4650c574e91ad245c0c67dee
|
||||||
|
@@ -1 +1 @@
|
|||||||
83913515830aa850f9e38406f9422d7e88dcab66
|
3edab9957cc7bb90b52fd40b02613c2cb03fc166
|
25
src/btree.c
25
src/btree.c
@@ -1151,6 +1151,7 @@ static int defragmentPage(MemPage *pPage){
|
|||||||
int nCell; /* Number of cells on the page */
|
int nCell; /* Number of cells on the page */
|
||||||
unsigned char *data; /* The page data */
|
unsigned char *data; /* The page data */
|
||||||
unsigned char *temp; /* Temp area for cell content */
|
unsigned char *temp; /* Temp area for cell content */
|
||||||
|
unsigned char *src; /* Source of content */
|
||||||
int iCellFirst; /* First allowable cell index */
|
int iCellFirst; /* First allowable cell index */
|
||||||
int iCellLast; /* Last possible cell index */
|
int iCellLast; /* Last possible cell index */
|
||||||
|
|
||||||
@@ -1160,15 +1161,13 @@ static int defragmentPage(MemPage *pPage){
|
|||||||
assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE );
|
assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE );
|
||||||
assert( pPage->nOverflow==0 );
|
assert( pPage->nOverflow==0 );
|
||||||
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
|
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
|
||||||
temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
|
temp = 0;
|
||||||
data = pPage->aData;
|
src = data = pPage->aData;
|
||||||
hdr = pPage->hdrOffset;
|
hdr = pPage->hdrOffset;
|
||||||
cellOffset = pPage->cellOffset;
|
cellOffset = pPage->cellOffset;
|
||||||
nCell = pPage->nCell;
|
nCell = pPage->nCell;
|
||||||
assert( nCell==get2byte(&data[hdr+3]) );
|
assert( nCell==get2byte(&data[hdr+3]) );
|
||||||
usableSize = pPage->pBt->usableSize;
|
usableSize = pPage->pBt->usableSize;
|
||||||
cbrk = get2byte(&data[hdr+5]);
|
|
||||||
memcpy(&temp[cbrk], &data[cbrk], usableSize - cbrk);
|
|
||||||
cbrk = usableSize;
|
cbrk = usableSize;
|
||||||
iCellFirst = cellOffset + 2*nCell;
|
iCellFirst = cellOffset + 2*nCell;
|
||||||
iCellLast = usableSize - 4;
|
iCellLast = usableSize - 4;
|
||||||
@@ -1187,7 +1186,7 @@ static int defragmentPage(MemPage *pPage){
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
assert( pc>=iCellFirst && pc<=iCellLast );
|
assert( pc>=iCellFirst && pc<=iCellLast );
|
||||||
size = cellSizePtr(pPage, &temp[pc]);
|
size = cellSizePtr(pPage, &src[pc]);
|
||||||
cbrk -= size;
|
cbrk -= size;
|
||||||
#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
|
#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
|
||||||
if( cbrk<iCellFirst ){
|
if( cbrk<iCellFirst ){
|
||||||
@@ -1201,8 +1200,16 @@ static int defragmentPage(MemPage *pPage){
|
|||||||
assert( cbrk+size<=usableSize && cbrk>=iCellFirst );
|
assert( cbrk+size<=usableSize && cbrk>=iCellFirst );
|
||||||
testcase( cbrk+size==usableSize );
|
testcase( cbrk+size==usableSize );
|
||||||
testcase( pc+size==usableSize );
|
testcase( pc+size==usableSize );
|
||||||
memcpy(&data[cbrk], &temp[pc], size);
|
|
||||||
put2byte(pAddr, cbrk);
|
put2byte(pAddr, cbrk);
|
||||||
|
if( temp==0 ){
|
||||||
|
int x;
|
||||||
|
if( cbrk==pc ) continue;
|
||||||
|
temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
|
||||||
|
x = get2byte(&data[hdr+5]);
|
||||||
|
memcpy(&temp[x], &data[x], (cbrk+size) - x);
|
||||||
|
src = temp;
|
||||||
|
}
|
||||||
|
memcpy(&data[cbrk], &src[pc], size);
|
||||||
}
|
}
|
||||||
assert( cbrk>=iCellFirst );
|
assert( cbrk>=iCellFirst );
|
||||||
put2byte(&data[hdr+5], cbrk);
|
put2byte(&data[hdr+5], cbrk);
|
||||||
@@ -5955,13 +5962,13 @@ static void assemblePage(
|
|||||||
assert( pPage->nCell==0 );
|
assert( pPage->nCell==0 );
|
||||||
assert( get2byteNotZero(&data[hdr+5])==nUsable );
|
assert( get2byteNotZero(&data[hdr+5])==nUsable );
|
||||||
|
|
||||||
pCellptr = &pPage->aCellIdx[nCell*2];
|
pCellptr = pPage->aCellIdx;
|
||||||
cellbody = nUsable;
|
cellbody = nUsable;
|
||||||
for(i=nCell-1; i>=0; i--){
|
for(i=0; i<nCell; i++){
|
||||||
u16 sz = aSize[i];
|
u16 sz = aSize[i];
|
||||||
pCellptr -= 2;
|
|
||||||
cellbody -= sz;
|
cellbody -= sz;
|
||||||
put2byte(pCellptr, cellbody);
|
put2byte(pCellptr, cellbody);
|
||||||
|
pCellptr += 2;
|
||||||
memcpy(&data[cellbody], apCell[i], sz);
|
memcpy(&data[cellbody], apCell[i], sz);
|
||||||
}
|
}
|
||||||
put2byte(&data[hdr+3], nCell);
|
put2byte(&data[hdr+3], nCell);
|
||||||
|
Reference in New Issue
Block a user