From: dan Date: Mon, 7 Aug 2017 14:06:01 +0000 (+0000) Subject: Fix a bug on this branch involving mmap mode and readonly transactions. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=44bbccc05abf9c1c3bb19e167046eb5085a7c227;p=thirdparty%2Fsqlite.git Fix a bug on this branch involving mmap mode and readonly transactions. FossilOrigin-Name: 355c594e821bb5ad782faf0e8d512305f4e1d7fd60949887a8270beed67d03e3 --- diff --git a/manifest b/manifest index aa980ac04d..163a29b0a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sdocumentation\sfile\s./README-server-edition.html. -D 2017-07-31T19:55:56.996 +C Fix\sa\sbug\son\sthis\sbranch\sinvolving\smmap\smode\sand\sreadonly\stransactions. +D 2017-08-07T14:06:01.846 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -440,7 +440,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 98df292b72d8c15c6292be663ee917ac0316a0d9ec652e6e55e06bc4d83f84b7 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 9c2006fb3c4d4a985e79de21cb5e5be22c8ae663159cbd0bf5e708803bf53678 +F src/pager.c d03c63437f7218c1a1f28b8ca4427afc6df13610a8a488a8a0a505d0a117deeb F src/pager.h 316dac0671fd7555af9e73d4357febd5f2d3ce6a185ffd8d77b7fc0423ac8b1a F src/parse.y 3a1babd6645a8103898a5e7e239dcf56cdafbdc25fd8133bb4a9160f9471d42d F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 @@ -454,8 +454,8 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/select.c c6bf96a7f9d7d68f929de84738c599a30d0a725ab0b54420e70545743cd5ee7b -F src/server.c ef4a69ea4124c89fe73ee0889929c089290e240a3a5f27fa28beea51cb855e51 -F src/server.h adcc122084f9370c91479bd9f7bbac1ccd7f63784249de40f63dae8a9fae1bfe +F src/server.c d69efa7284074e69d43c38d5d649ef3b20add1db31c9d8e7f01cabd95d0ee72b +F src/server.h d7555e68ee34008ca02705e44f861938a67b85a97ffe64d9326e03bd15dcd06b F src/shell.c bd6a37cbe8bf64ef6a6a74fdc50f067d3148149b4ce2b4d03154663e66ded55f F src/shell.c.in b5725acacba95ccefa57b6d068f710e29ba8239c3aa704628a1902a1f729c175 F src/sqlite.h.in 753ca32f31228a250a3a22ba90b0a39d21913cdc765dce9600e54ab872243f48 @@ -1647,7 +1647,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 b42c87790e2dfdc4e52c42967257decf4b44ded909403ea4ac47fe41acfd7077 -R 0649fc2cf3ba1c03f8e547dfbc16afc9 +P fbc4f4ad259cfe04b28d698ef025f179b6708ac788939976c401db2caf8f92c1 +R eae9c7f2718fecb4f38f6083d68585eb U dan -Z c48da8fd6893915c8bae54b12ad68f68 +Z 6ffb27438a4983c698bbeb9ee0c29536 diff --git a/manifest.uuid b/manifest.uuid index 16ed4d7fdd..9241ba91be 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbc4f4ad259cfe04b28d698ef025f179b6708ac788939976c401db2caf8f92c1 \ No newline at end of file +355c594e821bb5ad782faf0e8d512305f4e1d7fd60949887a8270beed67d03e3 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index ab232f8c60..e83ee0a406 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1052,6 +1052,9 @@ static void setGetterMethod(Pager *pPager){ pPager->xGet = getPageError; #if SQLITE_MAX_MMAP_SIZE>0 }else if( USEFETCH(pPager) +#ifdef SQLITE_SERVER_EDITION + && sqlite3ServerIsReadonly(pPager->pServer)==0 +#endif #ifdef SQLITE_HAS_CODEC && pPager->xCodec==0 #endif @@ -5453,6 +5456,7 @@ int sqlite3PagerSharedLock(Pager *pPager, int bReadonly){ if( rc==SQLITE_OK ){ rc = sqlite3ServerLock(pPager->pServer, 1, 0, 0); } + setGetterMethod(pPager); } #endif if( rc==SQLITE_OK && pagerUseWal(pPager) ){ diff --git a/src/server.c b/src/server.c index 2e0ac47cfc..26193640ab 100644 --- a/src/server.c +++ b/src/server.c @@ -691,4 +691,14 @@ ServerPage *sqlite3ServerBuffer(Server *p){ return pRet; } +/* +** Return true if the handle passed as the only argument is not NULL and +** currently has an open readonly transaction (one started with BEGIN +** READONLY). Return false if the argument is NULL, if there is no open +** transaction, or if the open transaction is read/write. +*/ +int sqlite3ServerIsReadonly(Server *p){ + return (p && p->eTrans==SERVER_TRANS_READONLY); +} + #endif /* ifdef SQLITE_SERVER_EDITION */ diff --git a/src/server.h b/src/server.h index a86bd0a38f..30bdf5dd3a 100644 --- a/src/server.h +++ b/src/server.h @@ -47,6 +47,7 @@ int sqlite3ServerHasLock(Server *p, Pgno pgno, int bWrite); ServerPage *sqlite3ServerBuffer(Server*); /* For "BEGIN READONLY" clients. */ +int sqlite3ServerIsReadonly(Server*); void sqlite3ServerReadPage(Server*, Pgno, u8**); void sqlite3ServerEndReadPage(Server*, Pgno);