]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge latest trunk changes into this branch.
authordan <dan@noemail.net>
Mon, 18 May 2020 17:18:28 +0000 (17:18 +0000)
committerdan <dan@noemail.net>
Mon, 18 May 2020 17:18:28 +0000 (17:18 +0000)
FossilOrigin-Name: 16b1eca922d6e10a0ebce1deb559c6c7dd74f8655e3456bad8384c6f4637e6d6

13 files changed:
1  2 
Makefile.in
Makefile.msc
main.mk
manifest
manifest.uuid
src/btree.c
src/pager.c
src/pager.h
src/pragma.c
src/vdbe.c
src/wal.c
src/wal.h
test/wal.test

diff --cc Makefile.in
Simple merge
diff --cc Makefile.msc
Simple merge
diff --cc main.mk
Simple merge
diff --cc manifest
index c09e1ca4759b5452adb697235708c79834c94b97,09bc31b90444d3d89c07b59875ed9f2a67a8ef43..84440f7bf4e62b81f2c02cabd056a1beac5846b3
+++ b/manifest
@@@ -1,11 -1,11 +1,11 @@@
- C Merge\srecent\strunk\senhancements\sinto\sthe\swal2\sbranch.
- D 2020-04-09T18:46:15.945
 -C Avoid\sharmless\sUB\sin\smemcpy()\sin\sthe\sJSON\sextension.
 -D 2020-05-17T13:47:28.477
++C Merge\slatest\strunk\schanges\sinto\sthis\sbranch.
++D 2020-05-18T17:18:28.234
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
- F Makefile.in a830a84749ce3312f5e0217698415516ca7f26897821970f662cafc817d3359d
 -F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238
++F Makefile.in 24e217b2b738eab3c0ad8832a04ebad94d56539d764f1021607252ae9af5bd2f
  F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241
- F Makefile.msc 3a8bf24fcbfe4be4b053201a3e1976aacde9356282e7c535c1931d8b1a3bf790
 -F Makefile.msc 14bbe230f81498ed1d5a4df79317c9abdbd2f950cb8030527acccf4e2eddfd34
++F Makefile.msc 493e20799ae7571ff51cad0c3d6d03dec4f363da2d81ce78551f60ffb1b5c76b
  F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a
  F VERSION 980d78a2ce04a1fd0ebefbaabd665f7f9186563820629ee29c6e350e96f19b52
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
@@@ -455,7 -455,7 +457,7 @@@ F ext/userauth/userauth.c 7f00cded7dcaa
  F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
  F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
  F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
- F main.mk c538a7e0f5106a7d72c7ce2c8153123458319f87ce28973a8e8955c14cb29c9a
 -F main.mk addd0a300e90ad090dc4a934df8a6f1b6c52c057a1aebb93682aed29fb68a345
++F main.mk 50c169e0b33358e178174218e57bd1fcc55872affa3c677f2988e7378f903e12
  F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
  F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
  F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
@@@ -467,20 -467,20 +469,20 @@@ F spec.template 86a4a43b99ebb3e75e6b9a7
  F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
  F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
  F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
- F src/alter.c fa2c3be9b0ebecfafb7062072a0ae6eda126d3e5a9fd51b2eded5acd95dc783c
- F src/analyze.c 831bb090988477a00d3b4c000746e1b0454dcc93b10b793e6ebe1c47f25d193a
+ F src/alter.c 826bc4561456094cf758f095776026f25892a2bb3a7cd86742323267dc9bdb5f
+ F src/analyze.c 953a6c43870ccaf080597244e1eeb4dc2ff6cb84f9501b24e46323de36970b61
  F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1
  F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06
- F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b
+ F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de
  F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
  F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
- F src/btree.c 05522a88df0ef5af26cc082f05656b3bf90980605c2453f7ed1ed698cb80351f
- F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471
- F src/btreeInt.h dee1a1d0c621524e006bb260bd6b66d5d1867da6fe38cba9ad7b6a9bb9c0c175
- F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36
 -F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025
++F src/btree.c 8977eed059a51320352f9a79bce388b4cb3679c8ae785bc485ca2bc3eeac9855
+ F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a
+ F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67
+ F src/build.c ca9e7a33b74f1bf2eb3a5f37f9d07dfed335469f2d70c0bd350e0dd42a50183a
  F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c
  F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
- F src/ctime.c 6a77ec9e0eb87aea929e002c816298907e337094a7b556898ae2d1e6be209f90
+ F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6
  F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384
  F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
  F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f
@@@ -517,19 -517,19 +519,19 @@@ F src/os.c 669cc3839cc35d20f81faf0be1ab
  F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432
  F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
  F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
- F src/os_unix.c 06593ba4bdfae42b30a897b3b4e59abb88a11d50dd0cad39003da955d822b8d1
- F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7
+ F src/os_unix.c 13f983da988b6460ef3c4c22099c67ab0938291e543644ac4d99eccc8ba604f1
+ F src/os_win.c 317718e8f04c449e7d9e1eacac0d14e7508e4a77c9d4c3cb7382299bd24561b7
  F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
- F src/pager.c f9e65a8d42d1a4aea4eb479233ca473b10ce6a8170bf767405388846109c4488
- F src/pager.h 4afe684c21a128314d5eb26c9bddf29e4186af0de78d5c0d65584ae59280eb7b
 -F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111
 -F src/pager.h 8d1dc9a2c3fc5eb6eeed75f48a076f425e77706f8935f05817fa05a308f587b5
++F src/pager.c 5683689017800028c2f06602b1283474daf49b0848bfbcca03e109e269a28472
++F src/pager.h 57058a96dc235ffdbd36a6b23400573a1c39a34a3b3c43a4acc41ee3830ad61c
  F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add
  F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177
  F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
  F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a
- F src/pragma.c ad117cc1a80f65cc81997d9a4b29558afb2e1baaee9e324a47a7d4d58174d106
- F src/pragma.h 9473160d220416456b40f27323bb4b316d4e4e08ffbf8bf88c5f7045d49c38e5
 -F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f
++F src/pragma.c 6ac2af3f44124d1e42eeee977f1aa979d425226fefb98a34996e122ce95d2bed
+ F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae
  F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28
- F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
+ F src/printf.c ebf563cff3122f6a61149964b738b470196d3619df31d6a720d0ff72fcfd7c7b
  F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
  F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4
  F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
@@@ -604,20 -604,21 +606,21 @@@ F src/update.c 3199098455830fc2d8c8fc4a
  F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78
  F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7
  F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118
- F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9
- F src/vdbe.c 6e8d20b72049d227443b774ab21e01a9fd4ccb4d75620121668476089e1b85fb
- F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9
- F src/vdbeInt.h 0b728ee662862a38b1912af741e2ac64f524de3c77aa86cf4306c42bdcd9de59
- F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141
- F src/vdbeaux.c 8349559e72bf0cfa2258b1159b004ec4d1717a054d2e1829c8cc897c32da8752
+ F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3
 -F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3
++F src/vdbe.c d8a95ca518c10963198938e26c15b8e646840e1d538866ace82e9b1c8b4205af
+ F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35
+ F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef
+ F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8
+ F src/vdbeaux.c 80626786d21296d9e7936186850343afe5fc6368ad9724a172e151788425a063
  F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1
  F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22
  F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df
  F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0
- F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515
+ F src/vdbevtab.c ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144
+ F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c
  F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
- F src/wal.c 1e5289e9ff8ce701738df9d1b06281c987831b6fbdad95c94f5d88d0bf0d90f4
- F src/wal.h d2a69695c84137f76e19a247a342cb02ab0131001b6f58153d94b71195bbd84d
 -F src/wal.c d0365581aed11a75e176f67cdbdc1bdfe685c5381a052360a00bbf58d3252fa0
 -F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
++F src/wal.c a12866b518cb4362445601d837e17c1c28cef5e7b95ecd3a352a4d031849a4c8
++F src/wal.h d01234e828943e002040c22a7e017642962f9fd9b2dc142fa599769ae4e459e9
  F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed
  F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9
  F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c
@@@ -1657,18 -1660,8 +1662,18 @@@ F test/vtab_alter.test 736e66fb5ec7b4fe
  F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65
  F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad
  F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12
- F test/wal.test a233cd4733928a5aaef24738727c4094d561ea68089f93cccd1f6e9dec610212
 -F test/wal.test 16180bc4becda176428ad02eaea437b4b8f5ae099314de443a4e12b2dcc007a2
++F test/wal.test 09c9e05591a5e513ecf14f72b4ca86726fca778a7abab1063a16f3ceb8cf2a86
  F test/wal2.test 537f59e5c5932e3b45bf3591ae3e48a2601360c2e52821b633e222fe6ebd5b09
 +F test/wal2big.test 0b4ec526f9ca4bbabc355042c38045ae2e253fb46eb327bb7693d0122bc6968b
 +F test/wal2fault.test 2e8e60cacd5bcd451618aeffd05f676894d17202d3e2986e288d36e2c5993249
 +F test/wal2lock.test 0ef98d72dc6bcf7711dedd684760488400d9a9a6eec0dc5d3822060437793552
 +F test/wal2recover.test ba8f4bc9397c838734619f9e759bd98b00e355347b3cf80a2e677610d231d5d8
 +F test/wal2recover2.test 0c46afc759e4392a3c12fba17432b880c93a13bf4246d1be5101b00bae4c5f01
 +F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c
 +F test/wal2rollback.test 23adc4a099b23f6aaea8b04fdca1c35861d887dd80f8be7da2d5273eb777e428
 +F test/wal2savepoint.test 2c82bd6a6ee5066c156040d2e9c2415646fcf96116ae7ad127eaf0c0b4a85f22
 +F test/wal2simple.test 96206c98bf64ab20ec00a1c0f6c709e258b98b39f2149889361f31966ce5a703
 +F test/wal2snapshot.test 7a5f4629a3c43a43c3440b8b2ea9f07de91a46b0b9eea5f08f62b5bf5b6468df
  F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2
  F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c
  F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9
@@@ -1872,7 -1866,7 +1878,7 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9
  F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
  F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
  F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P 6ad4d6b7ff2b34385039490f1dc8b020254e06fb70b9bff69d453d0c0affc2a2 85d3dc8c50d8dbb8eac1956e8976e861d3b671e03355ca9257060fa3dca51cc4
- R 56357a06e014ebdb8f82dd2df4b542a7
 -P 1313557b512297e7b75ed748894379b2022aecf696d5a58318e46a668321c1ff
 -R 0a3aaa0509481c9d6269f1e12c4b65a3
--U drh
- Z e99da54d6788761e960990b4fdaf3360
 -Z c1782df13623caf985a15e6cbac97877
++P 6fb870625cb7007fe5055609da35f6af87f3b375b7a43fd4e842d40dfef9169f 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece
++R c2ab80ad5e65c7322c33833a421871e0
++U dan
++Z 2201cfa00c678efbefa3c7153a345e7b
diff --cc manifest.uuid
index a71ef6da8ccf0947a70f95d6a384c036812bf91a,892a8523c0d669097c4d7d0145f17285a5d61d36..9389bdff6846428071e400f965357a75804df007
@@@ -1,1 -1,1 +1,1 @@@
- 6fb870625cb7007fe5055609da35f6af87f3b375b7a43fd4e842d40dfef9169f
 -69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece
++16b1eca922d6e10a0ebce1deb559c6c7dd74f8655e3456bad8384c6f4637e6d6
diff --cc src/btree.c
Simple merge
diff --cc src/pager.c
Simple merge
diff --cc src/pager.h
index d6b4e81c84cef1387ff87cc5beac8ddc1b70709c,62a371ef89f74d5a6205b42541cfcb19ca34f460..3c97f763558529d7b5c633b9bb7204532f079538
@@@ -191,11 -174,11 +191,11 @@@ int sqlite3PagerSharedLock(Pager *pPage
    int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*);
    int sqlite3PagerWalSupported(Pager *pPager);
    int sqlite3PagerWalCallback(Pager *pPager);
 -  int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen);
 +  int sqlite3PagerOpenWal(Pager *pPager, int, int *pisOpen);
    int sqlite3PagerCloseWal(Pager *pPager, sqlite3*);
  # ifdef SQLITE_ENABLE_SNAPSHOT
-   int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot);
-   int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot);
+   int sqlite3PagerSnapshotGet(Pager*, sqlite3_snapshot **ppSnapshot);
+   int sqlite3PagerSnapshotOpen(Pager*, sqlite3_snapshot *pSnapshot);
    int sqlite3PagerSnapshotRecover(Pager *pPager);
    int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot);
    void sqlite3PagerSnapshotUnlock(Pager *pPager);
diff --cc src/pragma.c
Simple merge
diff --cc src/vdbe.c
Simple merge
diff --cc src/wal.c
index c475028172f83bc4a705589ae9d112927819d0a6,e8f7f24f85d7b47b9d846a13091f14a9b754211e..5d451131ab415021648459302be354b0a35feee2
+++ b/src/wal.c
@@@ -727,7 -467,9 +727,10 @@@ struct Wal 
  #ifdef SQLITE_ENABLE_SNAPSHOT
    WalIndexHdr *pSnapshot;    /* Start transaction here if not NULL */
  #endif
 +  int bWal2;                 /* bWal2 flag passed to WalOpen() */
+ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+   sqlite3 *db;
+ #endif
  };
  
  /*
@@@ -1595,17 -1127,10 +1598,12 @@@ static int walTruncateWal2(Wal *pWal)
  */
  static int walIndexRecover(Wal *pWal){
    int rc;                         /* Return Code */
 -  i64 nSize;                      /* Size of log file */
 -  u32 aFrameCksum[2] = {0, 0};
    int iLock;                      /* Lock offset to lock for checkpoint */
 +  u32 nCkpt1 = 0xFFFFFFFF;
 +  u32 nCkpt2 = 0xFFFFFFFF;
 +  int bZero = 0;
 +  WalIndexHdr hdr;
  
- #ifdef SQLITE_ENABLE_SETLK_TIMEOUT
-   int tmout = 0;
-   sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout);
- #endif
    /* Obtain an exclusive lock on all byte in the locking range not already
    ** locked by the caller. The caller is guaranteed to have locked the
    ** WAL_WRITE_LOCK byte, and may have also locked the WAL_CKPT_LOCK byte.
@@@ -2479,31 -1983,25 +2567,28 @@@ static int walCheckpoint
          rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset);
          if( rc!=SQLITE_OK ) break;
        }
+       sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0);
  
 -      /* If work was actually accomplished... */
 -      if( rc==SQLITE_OK ){
 -        if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){
 +      /* If work was actually accomplished, truncate the db file, sync the wal
 +      ** file and set WalCkptInfo.nBackfill to indicate so. */
 +      if( rc==SQLITE_OK && (bWal2 || mxSafeFrame==walIndexHdr(pWal)->mxFrame) ){
 +        if( !bWal2 ){
            i64 szDb = pWal->hdr.nPage*(i64)szPage;
            testcase( IS_BIG_INT(szDb) );
            rc = sqlite3OsTruncate(pWal->pDbFd, szDb);
 -          if( rc==SQLITE_OK ){
 -            rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags));
 -          }
          }
-         if( rc==SQLITE_OK ){
-           rc = sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0);
-           if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK;
-         }
          if( rc==SQLITE_OK ){
 -          AtomicStore(&pInfo->nBackfill, mxSafeFrame);
 +          rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags));
          }
        }
-         pInfo->nBackfill = bWal2 ? 1 : mxSafeFrame;
 +      if( rc==SQLITE_OK ){
++        AtomicStore(&pInfo->nBackfill, (bWal2 ? 1 : mxSafeFrame));
 +      }
  
        /* Release the reader lock held while backfilling */
 -      walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1);
 +      if( bWal2==0 ){
 +        walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1);
 +      }
      }
  
      if( rc==SQLITE_BUSY ){
@@@ -3394,16 -2847,28 +3482,29 @@@ int sqlite3WalBeginReadTransaction(Wal 
  #ifdef SQLITE_ENABLE_SNAPSHOT
    int bChanged = 0;
    WalIndexHdr *pSnapshot = pWal->pSnapshot;
-   if( pSnapshot && isWalMode2(pWal) ) return SQLITE_ERROR;
-   if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){
-     bChanged = 1;
-   }
- #endif
+   if( pSnapshot ){
++    if( isWalMode2(pWal) ) return SQLITE_ERROR;
+     if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){
+       bChanged = 1;
+     }
  
- #ifdef SQLITE_ENABLE_SETLK_TIMEOUT
-   /* Disable blocking locks. They are not useful when trying to open a
-   ** read-transaction, and blocking may cause deadlock anyway. */
-   sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout);
+     /* It is possible that there is a checkpointer thread running 
+     ** concurrent with this code. If this is the case, it may be that the
+     ** checkpointer has already determined that it will checkpoint 
+     ** snapshot X, where X is later in the wal file than pSnapshot, but 
+     ** has not yet set the pInfo->nBackfillAttempted variable to indicate 
+     ** its intent. To avoid the race condition this leads to, ensure that
+     ** there is no checkpointer process by taking a shared CKPT lock 
+     ** before checking pInfo->nBackfillAttempted.  */
+     (void)walEnableBlocking(pWal);
+     rc = walLockShared(pWal, WAL_CKPT_LOCK);
+     walDisableBlocking(pWal);
+     if( rc!=SQLITE_OK ){
+       return rc;
+     }
+     pWal->ckptLock = 1;
+   }
  #endif
  
    do{
    testcase( (rc&0xff)==SQLITE_IOERR );
    testcase( rc==SQLITE_PROTOCOL );
    testcase( rc==SQLITE_OK );
 +  
 +  if( rc==SQLITE_OK && pWal->hdr.iVersion==WAL_VERSION2 ){
 +    rc = walOpenWal2(pWal);
 +  }
  
- #ifdef SQLITE_ENABLE_SETLK_TIMEOUT
-   /* If they were disabled earlier and the read-transaction has been
-   ** successfully opened, re-enable blocking locks. This is because the
-   ** connection may attempt to upgrade to a write-transaction, which does
-   ** benefit from using blocking locks.  */
-   if( rc==SQLITE_OK ){
-     sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout);
-   }
- #endif
  #ifdef SQLITE_ENABLE_SNAPSHOT
    if( rc==SQLITE_OK ){
      if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){
@@@ -3741,9 -3106,19 +3826,19 @@@ Pgno sqlite3WalDbsize(Wal *pWal)
  int sqlite3WalBeginWriteTransaction(Wal *pWal){
    int rc;
  
+ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+   /* If the write-lock is already held, then it was obtained before the
+   ** read-transaction was even opened, making this call a no-op.
+   ** Return early. */
+   if( pWal->writeLock ){
+     assert( !memcmp(&pWal->hdr,(void *)walIndexHdr(pWal),sizeof(WalIndexHdr)) );
+     return SQLITE_OK;
+   }
+ #endif
    /* Cannot start a write transaction without first holding a read
    ** transaction. */
 -  assert( pWal->readLock>=0 );
 +  assert( pWal->readLock!=WAL_LOCK_NONE );
    assert( pWal->writeLock==0 && pWal->iReCksum==0 );
  
    if( pWal->readOnly ){
diff --cc src/wal.h
index ccc2888f97554c59069b43e31e0bb12f1a39ad3d,02e2bab36053886842a7a19f58427a0f1435a880..445fdeb8832da03471ea6421ba1a38527a2b0741
+++ b/src/wal.h
@@@ -147,8 -146,10 +147,13 @@@ int sqlite3WalFramesize(Wal *pWal)
  /* Return the sqlite3_file object for the WAL file */
  sqlite3_file *sqlite3WalFile(Wal *pWal);
  
 +/* Return the journal mode (WAL or WAL2) used by this Wal object. */
 +int sqlite3WalJournalMode(Wal *pWal);
 +
+ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+ int sqlite3WalWriteLock(Wal *pWal, int bLock);
+ void sqlite3WalDb(Wal *pWal, sqlite3 *db);
+ #endif
  #endif /* ifndef SQLITE_OMIT_WAL */
  #endif /* SQLITE_WAL_H */
diff --cc test/wal.test
Simple merge