From: drh Date: Tue, 13 Dec 2016 18:34:01 +0000 (+0000) Subject: In the pager, avoid checking for the illegal page number 0 except when creating X-Git-Tag: version-3.16.0~48^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Fpager-get-method;p=thirdparty%2Fsqlite.git In the pager, avoid checking for the illegal page number 0 except when creating a new page. FossilOrigin-Name: dee20ba982125ea98c280ad1571789af0f393903 --- diff --git a/manifest b/manifest index a88cc6c349..a735100eb0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\srefinements\sto\sthe\svirtual\smethod\simplementation\sof\s\nsqlite3PagerGet(). -D 2016-12-13T15:53:22.192 +C In\sthe\spager,\savoid\schecking\sfor\sthe\sillegal\spage\snumber\s0\sexcept\swhen\screating\na\snew\spage. +D 2016-12-13T18:34:01.957 F Makefile.in 7639c6a09da11a9c7c6f2630fc981ee588d1072d F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da @@ -375,10 +375,10 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c cf90abd4e50d9f56d2c20ce8e005aff55d7bd8e9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 642b1968fdaa6219aa562ae17b9a3745dfca10f5 +F src/pager.c 38b3a02f5f5e49224a006d17c842c106a93cb5b9 F src/pager.h d1e944291030351f362a0a7da9b5c3e34e603e39 F src/parse.y 29153738a7322054359320eb00b5a4cd44389f20 -F src/pcache.c 219fc5238d5c80e2990ab01e1459db3a96866447 +F src/pcache.c 51070ec9b8251bbf9c6ea3d35fd96a458752929e F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490 F src/pcache1.c e3967219b2a92b9edcb9324a4ba75009090d3953 F src/pragma.c d932ba278654617cdd281f88a790a3185fca7c44 @@ -1536,7 +1536,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P df5bb90d208e0633056389e97696d260e3830e8d -R f50bcbf9b53ee7a4a76924f315bdb191 +P 67df44464847b43f8c0b186157e31cc66c1e5796 +R 96cb62ad3fe18d08872a93c1ec7681b1 U drh -Z 01ed48a40bff392ec009867b80e6ecce +Z 5d3a5e7b85c439c40dd9c8767b987c29 diff --git a/manifest.uuid b/manifest.uuid index be9ae7f0eb..e5fa81fb64 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -67df44464847b43f8c0b186157e31cc66c1e5796 \ No newline at end of file +dee20ba982125ea98c280ad1571789af0f393903 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 4cda7c92ce..d40c1f4117 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5366,15 +5366,11 @@ static int getPageNormal( u8 noContent; /* True if PAGER_GET_NOCONTENT is set */ sqlite3_pcache_page *pBase; - if( pgno==0 ){ - return SQLITE_CORRUPT_BKPT; - } assert( pPager->errCode==SQLITE_OK ); assert( pPager->eState>=PAGER_READER ); assert( assert_pager_state(pPager) ); assert( pPager->hasHeldSharedLock==1 ); - pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); if( pBase==0 ){ pPg = 0; @@ -5399,17 +5395,19 @@ static int getPageNormal( }else{ /* The pager cache has created a new page. Its content needs to - ** be initialized. */ - - pPg->pPager = pPager; - - /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page - ** number greater than this, or the unused locking-page, is requested. */ - if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){ + ** be initialized. But first some error checks: + ** + ** (1) Minimum page number is 1 + ** (2) The maximum page number is 2^31 + ** (3) Never try to fetch the locking page + */ + if( pgno==0 || pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){ rc = SQLITE_CORRUPT_BKPT; goto pager_acquire_err; } + pPg->pPager = pPager; + assert( !isOpen(pPager->fd) || !MEMDB ); noContent = (flags & PAGER_GET_NOCONTENT)!=0; if( !isOpen(pPager->fd) || pPager->dbSizepgno>0 ); /* Page number is 1 or more */ + assert( pPg->pgno>0 || pPg->pPager==0 ); /* Page number is 1 or more */ pCache = pPg->pCache; assert( pCache!=0 ); /* Every page has an associated PCache */ if( pPg->flags & PGHDR_CLEAN ){ @@ -372,7 +372,6 @@ sqlite3_pcache_page *sqlite3PcacheFetch( assert( pCache!=0 ); assert( pCache->pCache!=0 ); assert( createFlag==3 || createFlag==0 ); - assert( pgno>0 ); assert( pCache->eCreate==((pCache->bPurgeable && pCache->pDirty) ? 1 : 2) ); /* eCreate defines what to do if the page does not exist.