mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
Size reduction and performance increase in defragementPage() of btree.c.
FossilOrigin-Name: 1b03f197b5572084177012a58990f8dba7ff10382ff5657fda62867a4d0b1af9
This commit is contained in:
12
manifest
12
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Size\sreduction\sand\sperformance\sincrease\sin\sthe\spageFindSlot()\sroutine\sof\nbtree.c.
|
C Size\sreduction\sand\sperformance\sincrease\sin\sdefragementPage()\sof\sbtree.c.
|
||||||
D 2022-07-07T20:29:49.982
|
D 2022-07-07T21:04:03.223
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@@ -510,7 +510,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
|
|||||||
F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
|
F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
|
||||||
F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
|
F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
|
||||||
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
|
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
|
||||||
F src/btree.c 6599d972b674cbbcb76e9a9db0e206d3bf9b60186464c08ef82ab6fda0622d44
|
F src/btree.c 85e73fcdad6ca71caf083427d7a84ee31bce23a844f0ca3dd41f176f905090c9
|
||||||
F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
|
F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
|
||||||
F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e
|
F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e
|
||||||
F src/build.c 23f874642825d7eaaeeb7a3281b2b1a75e1d4c4dd9ae4dceddcd908266634214
|
F src/build.c 23f874642825d7eaaeeb7a3281b2b1a75e1d4c4dd9ae4dceddcd908266634214
|
||||||
@@ -1979,8 +1979,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 7d7aed053f600659c63d8bac6d5da77879936c3fc57bfd058a4943b3bc530575
|
P 5d247e38560b97975568e8a48324acaca1002ec2ef7fa3efc9c8aa7d83412aad
|
||||||
R 573750a14fc9838f7267df2add226c79
|
R a83c6075a9fd94646d9131a381899d86
|
||||||
U drh
|
U drh
|
||||||
Z 6e9989a326ed7411def6db942d22ad53
|
Z fd00ac09a5e7246ba9e920ca18028a40
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
5d247e38560b97975568e8a48324acaca1002ec2ef7fa3efc9c8aa7d83412aad
|
1b03f197b5572084177012a58990f8dba7ff10382ff5657fda62867a4d0b1af9
|
58
src/btree.c
58
src/btree.c
@@ -1513,7 +1513,6 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
|
|||||||
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 = 0;
|
|
||||||
src = data = pPage->aData;
|
src = data = pPage->aData;
|
||||||
hdr = pPage->hdrOffset;
|
hdr = pPage->hdrOffset;
|
||||||
cellOffset = pPage->cellOffset;
|
cellOffset = pPage->cellOffset;
|
||||||
@@ -1568,39 +1567,38 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
|
|||||||
cbrk = usableSize;
|
cbrk = usableSize;
|
||||||
iCellLast = usableSize - 4;
|
iCellLast = usableSize - 4;
|
||||||
iCellStart = get2byte(&data[hdr+5]);
|
iCellStart = get2byte(&data[hdr+5]);
|
||||||
for(i=0; i<nCell; i++){
|
if( nCell>0 ){
|
||||||
u8 *pAddr; /* The i-th cell pointer */
|
temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
|
||||||
pAddr = &data[cellOffset + i*2];
|
memcpy(&temp[iCellStart], &data[iCellStart], usableSize - iCellStart);
|
||||||
pc = get2byte(pAddr);
|
src = temp;
|
||||||
testcase( pc==iCellFirst );
|
for(i=0; i<nCell; i++){
|
||||||
testcase( pc==iCellLast );
|
u8 *pAddr; /* The i-th cell pointer */
|
||||||
/* These conditions have already been verified in btreeInitPage()
|
pAddr = &data[cellOffset + i*2];
|
||||||
** if PRAGMA cell_size_check=ON.
|
pc = get2byte(pAddr);
|
||||||
*/
|
testcase( pc==iCellFirst );
|
||||||
if( pc<iCellStart || pc>iCellLast ){
|
testcase( pc==iCellLast );
|
||||||
return SQLITE_CORRUPT_PAGE(pPage);
|
/* These conditions have already been verified in btreeInitPage()
|
||||||
|
** if PRAGMA cell_size_check=ON.
|
||||||
|
*/
|
||||||
|
if( pc<iCellStart || pc>iCellLast ){
|
||||||
|
return SQLITE_CORRUPT_PAGE(pPage);
|
||||||
|
}
|
||||||
|
assert( pc>=iCellStart && pc<=iCellLast );
|
||||||
|
size = pPage->xCellSize(pPage, &src[pc]);
|
||||||
|
cbrk -= size;
|
||||||
|
if( cbrk<iCellStart || pc+size>usableSize ){
|
||||||
|
return SQLITE_CORRUPT_PAGE(pPage);
|
||||||
|
}
|
||||||
|
assert( cbrk+size<=usableSize && cbrk>=iCellStart );
|
||||||
|
testcase( cbrk+size==usableSize );
|
||||||
|
testcase( pc+size==usableSize );
|
||||||
|
put2byte(pAddr, cbrk);
|
||||||
|
memcpy(&data[cbrk], &src[pc], size);
|
||||||
}
|
}
|
||||||
assert( pc>=iCellStart && pc<=iCellLast );
|
|
||||||
size = pPage->xCellSize(pPage, &src[pc]);
|
|
||||||
cbrk -= size;
|
|
||||||
if( cbrk<iCellStart || pc+size>usableSize ){
|
|
||||||
return SQLITE_CORRUPT_PAGE(pPage);
|
|
||||||
}
|
|
||||||
assert( cbrk+size<=usableSize && cbrk>=iCellStart );
|
|
||||||
testcase( cbrk+size==usableSize );
|
|
||||||
testcase( pc+size==usableSize );
|
|
||||||
put2byte(pAddr, cbrk);
|
|
||||||
if( temp==0 ){
|
|
||||||
if( cbrk==pc ) continue;
|
|
||||||
temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
|
|
||||||
memcpy(&temp[iCellStart], &data[iCellStart], usableSize - iCellStart);
|
|
||||||
src = temp;
|
|
||||||
}
|
|
||||||
memcpy(&data[cbrk], &src[pc], size);
|
|
||||||
}
|
}
|
||||||
data[hdr+7] = 0;
|
data[hdr+7] = 0;
|
||||||
|
|
||||||
defragment_out:
|
defragment_out:
|
||||||
assert( pPage->nFree>=0 );
|
assert( pPage->nFree>=0 );
|
||||||
if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){
|
if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){
|
||||||
return SQLITE_CORRUPT_PAGE(pPage);
|
return SQLITE_CORRUPT_PAGE(pPage);
|
||||||
|
Reference in New Issue
Block a user