mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Avoid an unnecessary malloc() for the page usage bitmap when running
a partial integrity_check. FossilOrigin-Name: 2904fcbeebba9189cebc48e58d12fc46f78ee23d8c4d46644606691f8cabb80c
This commit is contained in:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
||||
C Fix\sa\sproblem\sallowing\sa\sCOMMIT\sfollowing\san\sOOM\sto\scause\sfts5\scorruption.
|
||||
D 2023-10-20T19:59:12.660
|
||||
C Avoid\san\sunnecessary\smalloc()\sfor\sthe\spage\susage\sbitmap\swhen\srunning\na\spartial\sintegrity_check.
|
||||
D 2023-10-21T11:06:03.224
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@@ -659,9 +659,9 @@ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4
|
||||
F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
|
||||
F src/bitvec.c 9eac5f42c11914d5ef00a75605bb205e934f435c579687f985f1f8b0995c8645
|
||||
F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
|
||||
F src/btree.c 63fb3269c93924e734e0586c22816effa530cee933df4aeb2b2e045de0339280
|
||||
F src/btree.c 58f5cca2aced6888824ed69d19a0c398d288d0840b1c72c0834525e82b10c076
|
||||
F src/btree.h 03e3356f5208bcab8eed4e094240fdac4a7f9f5ddf5e91045ce589f67d47c240
|
||||
F src/btreeInt.h 91a9e0c41a0e71fa91a742ec285c63dd8dcb38b73d14fae0ed7209174ff0fdc1
|
||||
F src/btreeInt.h ef12a72b708677e48d6bc8dcd66fed25434740568b89e2cfa368093cfc5b9d15
|
||||
F src/build.c 1a9061ab67987cfa9c7f9d52ccc862a31d37ad2b05faaf0d72eeb4b4b5ee37cf
|
||||
F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
@@ -2135,8 +2135,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 5cb61c6788d7c0170b587e4667ee57d588c991a9901951762e33b97c6a135a82
|
||||
R 04eef64adc8baa80e96c39c8b85b43af
|
||||
U dan
|
||||
Z c4161b04175a3850db328dc9504c42b8
|
||||
P fba3129d1362dd3ee04d61cb3d3c48518cd98dde3febc85298f411776d60073e
|
||||
R e2705175b24cd3b2e01ea68ed578aaef
|
||||
U drh
|
||||
Z cc633995022531837a5b59b3eaccd09f
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
@@ -1 +1 @@
|
||||
fba3129d1362dd3ee04d61cb3d3c48518cd98dde3febc85298f411776d60073e
|
||||
2904fcbeebba9189cebc48e58d12fc46f78ee23d8c4d46644606691f8cabb80c
|
22
src/btree.c
22
src/btree.c
@@ -10459,7 +10459,7 @@ static void checkAppendMsg(
|
||||
** corresponds to page iPg is already set.
|
||||
*/
|
||||
static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){
|
||||
assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 );
|
||||
assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 );
|
||||
return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07)));
|
||||
}
|
||||
|
||||
@@ -10467,7 +10467,7 @@ static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){
|
||||
** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg.
|
||||
*/
|
||||
static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
|
||||
assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 );
|
||||
assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 );
|
||||
pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07));
|
||||
}
|
||||
|
||||
@@ -10481,7 +10481,8 @@ static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
|
||||
** Also check that the page number is in bounds.
|
||||
*/
|
||||
static int checkRef(IntegrityCk *pCheck, Pgno iPage){
|
||||
if( iPage>pCheck->nPage || iPage==0 ){
|
||||
if( iPage>pCheck->nCkPage || iPage==0 ){
|
||||
if( pCheck->nCkPage==0 ) return 0; /* omit reference counting */
|
||||
checkAppendMsg(pCheck, "invalid page number %u", iPage);
|
||||
return 1;
|
||||
}
|
||||
@@ -10979,19 +10980,24 @@ int sqlite3BtreeIntegrityCheck(
|
||||
sCheck.db = db;
|
||||
sCheck.pBt = pBt;
|
||||
sCheck.pPager = pBt->pPager;
|
||||
sCheck.nPage = btreePagecount(sCheck.pBt);
|
||||
sCheck.nCkPage = btreePagecount(sCheck.pBt);
|
||||
sCheck.mxErr = mxErr;
|
||||
sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH);
|
||||
sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL;
|
||||
if( sCheck.nPage==0 ){
|
||||
if( sCheck.nCkPage==0 ){
|
||||
goto integrity_ck_cleanup;
|
||||
}
|
||||
|
||||
sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1);
|
||||
if( bPartial ){
|
||||
sCheck.nCkPage = 0;
|
||||
sCheck.aPgRef = 0;
|
||||
}else{
|
||||
sCheck.aPgRef = sqlite3MallocZero((sCheck.nCkPage / 8)+ 1);
|
||||
if( !sCheck.aPgRef ){
|
||||
checkOom(&sCheck);
|
||||
goto integrity_ck_cleanup;
|
||||
}
|
||||
}
|
||||
sCheck.heap = (u32*)sqlite3PageMalloc( pBt->pageSize );
|
||||
if( sCheck.heap==0 ){
|
||||
checkOom(&sCheck);
|
||||
@@ -10999,7 +11005,7 @@ int sqlite3BtreeIntegrityCheck(
|
||||
}
|
||||
|
||||
i = PENDING_BYTE_PAGE(pBt);
|
||||
if( i<=sCheck.nPage ) setPageReferenced(&sCheck, i);
|
||||
if( i<=sCheck.nCkPage ) setPageReferenced(&sCheck, i);
|
||||
|
||||
/* Check the integrity of the freelist
|
||||
*/
|
||||
@@ -11050,7 +11056,7 @@ int sqlite3BtreeIntegrityCheck(
|
||||
/* Make sure every page in the file is referenced
|
||||
*/
|
||||
if( !bPartial ){
|
||||
for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){
|
||||
for(i=1; i<=sCheck.nCkPage && sCheck.mxErr; i++){
|
||||
#ifdef SQLITE_OMIT_AUTOVACUUM
|
||||
if( getPageReferenced(&sCheck, i)==0 ){
|
||||
checkAppendMsg(&sCheck, "Page %u: never used", i);
|
||||
|
@@ -695,7 +695,7 @@ struct IntegrityCk {
|
||||
BtShared *pBt; /* The tree being checked out */
|
||||
Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */
|
||||
u8 *aPgRef; /* 1 bit per page in the db (see above) */
|
||||
Pgno nPage; /* Number of pages in the database */
|
||||
Pgno nCkPage; /* Pages in the database. 0 for partial check */
|
||||
int mxErr; /* Stop accumulating errors when this reaches zero */
|
||||
int nErr; /* Number of messages written to zErrMsg so far */
|
||||
int rc; /* SQLITE_OK, SQLITE_NOMEM, or SQLITE_INTERRUPT */
|
||||
|
Reference in New Issue
Block a user