From 8dd1c25388ee0e683f5a2a1e3f35491d4ff09869 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 4 Nov 2015 22:31:02 +0000 Subject: [PATCH] Performance improvements in the getAndInitPage() routine of btree.c. FossilOrigin-Name: 2aa50f6f2029e3c91a4cb91224df8ec1194f215e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 22 +++++++++++++--------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 9cd40fae02..5f18b6c079 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rename\sthe\ssqlite3PagerAcquire()\sfunction\sto\ssqlite3PagerGet().\s\sThe\sformer\nmacro\scalled\ssqlite3PagerGet()\shas\sbeen\sremoved. -D 2015-11-04T20:22:37.219 +C Performance\simprovements\sin\sthe\sgetAndInitPage()\sroutine\sof\sbtree.c. +D 2015-11-04T22:31:02.432 F Makefile.in 3a705bb4bd12e194212ddbdbf068310d17153cdb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 702d3e98f3afc6587a78481257f3c4c900efc3a4 @@ -282,7 +282,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 2869a76c03eb393ee795416e2387005553df72bc F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 692ca3e69ade4e86844899dd5f85b2220daf3d76 +F src/btree.c 080c3cb5440261dac7e9a03c45a948553338e1de F src/btree.h b512723e4f27d7ba16b4b985cdecdb82c0f6d0c0 F src/btreeInt.h 3ab435ed27adea54d040584b0bcc488ee7db1e38 F src/build.c ca574d33ffb1763cfd2979383f4d507095bfbe19 @@ -1398,7 +1398,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3fece5d02a8790701d8f0af18db4b4db33986369 -R ed171729fbc3a46f9021f6d576752c27 +P 708253be34084b89987efe955c34557516171a3a +R 95c8020c01e129a733cf3a0e93c349e0 U drh -Z bcdee87febad0b65031e24eb55987e22 +Z 87f3216156230480787028b4d8a81ee0 diff --git a/manifest.uuid b/manifest.uuid index 0601045f98..c998de4c97 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -708253be34084b89987efe955c34557516171a3a \ No newline at end of file +2aa50f6f2029e3c91a4cb91224df8ec1194f215e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 1db2a77b64..c29463e9de 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1901,11 +1901,14 @@ static void zeroPage(MemPage *pPage, int flags){ */ static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){ MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); - pPage->aData = sqlite3PagerGetData(pDbPage); - pPage->pDbPage = pDbPage; - pPage->pBt = pBt; - pPage->pgno = pgno; - pPage->hdrOffset = pgno==1 ? 100 : 0; + if( pgno!=pPage->pgno ){ + pPage->aData = sqlite3PagerGetData(pDbPage); + pPage->pDbPage = pDbPage; + pPage->pBt = pBt; + pPage->pgno = pgno; + pPage->hdrOffset = pgno==1 ? 100 : 0; + } + assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); return pPage; } @@ -2000,20 +2003,21 @@ static int getAndInitPage( if( rc ){ goto getAndInitPage_error; } - *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt); + *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); if( (*ppPage)->isInit==0 ){ + btreePageFromDbPage(pDbPage, pgno, pBt); rc = btreeInitPage(*ppPage); if( rc!=SQLITE_OK ){ releasePage(*ppPage); goto getAndInitPage_error; } } + assert( (*ppPage)->pgno==pgno ); + assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); /* If obtaining a child page for a cursor, we must verify that the page is ** compatible with the root page. */ - if( pCur - && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) - ){ + if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ rc = SQLITE_CORRUPT_BKPT; releasePage(*ppPage); goto getAndInitPage_error;