]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge the latest trunk enhancements into the bedrock branch.
authordrh <>
Thu, 22 Jun 2023 14:40:38 +0000 (14:40 +0000)
committerdrh <>
Thu, 22 Jun 2023 14:40:38 +0000 (14:40 +0000)
FossilOrigin-Name: 0551b79b17579a91d891c745ecd0e35b5142f944ed59eb3c95c37e5a4de8a461

24 files changed:
1  2 
Makefile.in
main.mk
manifest
manifest.uuid
src/bitvec.c
src/btree.c
src/btreeInt.h
src/build.c
src/func.c
src/main.c
src/os_unix.c
src/pager.c
src/parse.y
src/pcache1.c
src/select.c
src/sqlite.h.in
src/sqliteInt.h
src/test1.c
src/test_config.c
src/update.c
src/vacuum.c
src/vdbe.c
src/vdbeaux.c
src/wal.c

diff --cc Makefile.in
Simple merge
diff --cc main.mk
Simple merge
diff --cc manifest
index 0d0e067bbe15f02a04b6a543e337175bb31bb40e,816abbb2b142579ca97212055d3590efcfd9e375..1fef552e2287a05da32ea0fb103636d783a2415d
+++ b/manifest
@@@ -1,13 -1,13 +1,13 @@@
- C Add\sthe\ssqlite3_commit_status()\sAPI.\sFor\squerying\sa\sconnection\sfor\s(a)\sthe\sranges\sof\swal/wal2\sframes\swritten\safter\sa\ssuccessful\scommit,\sand\s(b)\sthe\sconflicting\sframe\sfollowing\sa\sfailed\scommit\sof\sa\sBEGIN\sCONCURRENT\stransaction.
- D 2023-06-19T18:16:19.942
 -C Merge\sthe\slatest\strunk\senhancements\sinto\sthe\swal2\sbranch.
 -D 2023-06-22T14:20:03.358
++C Merge\sthe\slatest\strunk\senhancements\sinto\sthe\sbedrock\sbranch.
++D 2023-06-22T14:40:38.946
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
- F Makefile.in 4921a22ab33b7f0af9854a9b089451e5e7c612eb7fe8dfb90cdff982681e368a
 -F Makefile.in 3a780c12cb464f43e680a4f36f59615d45acf5a6762b56c205b6ef51ebd26c6d
++F Makefile.in 0423d5a97be582884ffdb228216790f5bb10678bed50f359cce6f0745107bf32
  F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241
- F Makefile.msc 4ec8369d75cc0a6f833eb49cfd5a31db5a0094a83474271b488e51523eccd816
- F README.md e05bd8fcb45da04ab045c37f79a98654e8aa3b3b8f302cfbba80a0d510df75f7
- F VERSION 17f95ae2fdf21f0e9575eb0b0511ea63f15d71dfff431b21c2b4adbfa70cfbbf
+ F Makefile.msc 97f9b14ef0418943c315db08f4961932f2fc839603c13ab646079840b0d83329
+ F README.md 8ff80689b9cb9f6e9b842edf31a3358ff53bc538c351799e03dd3e5455e637e5
+ F VERSION c6366dc72582d3144ce87b013cc35fe48d62f6d07d5be0c9716ea33c862144aa
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
  F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
  F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
@@@ -94,8 -93,8 +94,8 @@@ F ext/fts5/fts5_buffer.c 3001fbabb585d6
  F ext/fts5/fts5_config.c 051056a9052f5d3a4d1c695f996fd364f920e341f136c60ab2c04aa7e267113f
  F ext/fts5/fts5_expr.c 58fb8ceddfb1cefcd54510f9f2f33c220ef9d1b3fa77462111f5ae2a825ab7b1
  F ext/fts5/fts5_hash.c d4fb70940359f2120ccd1de7ffe64cc3efe65de9e8995b822cd536ff64c96982
- F ext/fts5/fts5_index.c de3cdae2e0056594aad97a728be5c43b6d7a6cdc7e9cc16f197892b2d8689c21
+ F ext/fts5/fts5_index.c fe98ebd8835760b9c787d20f6b50d648a761afd8e3b55780e718ee34c694743b
 -F ext/fts5/fts5_main.c b4dba04a36aaf9b8e8cef0100b6dbb422cc74753eacc11d6401cac7a87c0f38d
 +F ext/fts5/fts5_main.c b49be6efe6b63b69ea6954fc690b833b2e020e4e071cc57c3d79c57abf722aaa
  F ext/fts5/fts5_storage.c 76c6085239eb44424004c022e9da17a5ecd5aaec859fba90ad47d3b08f4c8082
  F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
  F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee
@@@ -563,8 -559,7 +565,7 @@@ F ext/wasm/wasmfs.make cf9a68162d92ca2b
  F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
  F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
  F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0
- F main.mk ba55340ebf22e6473ca88859c6f44265079982b110e109c7ffb5b962e198c024
- F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
 -F main.mk b7cf0350144fdf7551ecca064272b88098dcf206cb0d4c79754ad734a8f1c24b
++F main.mk 17ab4dd35f863772967540d8ebcb659691638e18c746b68ce8a8b3f545cb8ec3
  F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
  F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
  F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421
@@@ -576,41 -571,41 +577,41 @@@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47
  F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
  F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
  F sqlite_cfg.h.in baf2e409c63d4e7a765e17769b6ff17c5a82bbd9cbf1e284fd2e4cefaff3fcf2
- F src/alter.c 482c534877fbb543f8295992cde925df55443febac5db5438d5aaba6f78c4940
- F src/analyze.c a1f3061af16c99f73aed0362160176c31a6452de1b02ada1d68f6839f2a37df0
+ F src/alter.c 3ff8c2fca0c0636d43459154bb40d79c882df1b34df77f89c4ec47ab2e2389f5
+ F src/analyze.c d4cc28738c29e009640ec20ebb6936ba6fcefff0d11aa93398d9bb9a5ead6c1f
  F src/attach.c cc9d00d30da916ff656038211410ccf04ed784b7564639b9b61d1839ed69fd39
- F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
+ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4
  F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
- F src/bitvec.c 3907fcbe8a0c8c2db58d97087d15cdabbf2842adb9125df9ab9ff87d3db16775
- F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
- F src/btree.c a1e13541545e5dd916daadb1a7730cd415ca3c8e25e2bdee73b4ee149000f77c
 -F src/bitvec.c 9eac5f42c11914d5ef00a75605bb205e934f435c579687f985f1f8b0995c8645
++F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e
+ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
 -F src/btree.c b1adc6a45e81565f6b399b98d6151a419589dd6329a4b3f936f66c1e59e42ce8
 -F src/btree.h aa354b9bad4120af71e214666b35132712b8f2ec11869cb2315c52c81fad45cc
 -F src/btreeInt.h 3b4eff7155c0cea6971dc51f62e3529934a15a6640ec607dd42a767e379cb3a9
 -F src/build.c a8ae3b32d9aa9bbd2c0e97d7c0dd80def9fbca408425de1608f57ee6f47f45f4
++F src/btree.c 2e15d2514e948ae05b4ee5f0ced9fc7cff19b031ab1b26c6b1ce578feb83ce7c
 +F src/btree.h 77a092acf63526827e74e88d0480123212d079593a841ff1fe85507adf256ef6
- F src/btreeInt.h a2c8d4894939eb7f31be5813109304e47147b5fedc3ed9e870a34ab534631ea3
- F src/build.c 52784bddd510438361a3ab1141db6aaf0aad76096e2e06208e3c23d21b279ba2
++F src/btreeInt.h c99c2c6b29c1d36f2a6cc67dcf220b080c8817cb2812e6d5ca27e158a14e1e68
++F src/build.c d1f3d6478799b6eef9bb39214fc5495c8ee940fe2e70bf0b65ad8b6984bf0db9
  F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490
  F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
  F src/ctime.c f439c21d439aaf4706950a2597474f1a796b557a0750666308202c0f601ef0fd
- F src/date.c aca9e0c08b400b21238b609aea7c09585396cd770985cf8f475560f69222dad3
+ F src/date.c f73f203b3877cef866c60ab402aec2bf89597219b60635cf50cbe3c5e4533e94
  F src/dbpage.c f3eea5f7ec47e09ee7da40f42b25092ecbe961fc59566b8e5f705f34335b2387
  F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
- F src/delete.c a9c6d3f51c0a31e9b831e0a0580a98d702904b42d216fee530940e40dec34873
- F src/expr.c 941fe758212c6cf0007c6d7daf5368e11c199376ace9b3018494296e18a27eac
+ F src/delete.c cd5f5cd06ed0b6a882ec1a8c2a0d73b3cecb28479ad19e9931c4706c5e2182be
+ F src/expr.c 36f6a47c8a2c20ec3c267a60fc598857876edd60af0cb40caf7b69b651fd73bf
  F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
- F src/fkey.c 03c134cc8bffe54835f742ddea0b72ebfc8f6b32773d175c71b8afeea6cb5c83
- F src/func.c 3537d30d5ad9095373a3a105980812ffc8a106c43691328b7a0dc8de2988ddda
+ F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
 -F src/func.c 6303e1ccb80dbd0d9b52f902a01d3b105981486fdfd66f9e1ddfd74aaf3032fc
++F src/func.c cc4f5b77c1c7f086e5087f087a5e97c58d4cd71e8f4a4b381b231348c52878ca
  F src/global.c bd0892ade7289f6e20bff44c07d06371f2ff9b53cea359e7854b9b72f65adc30
- F src/hash.c c6af5f96a7a76d000f07c5402c48c318c2566beecdee9e78b9d9f60ce7119565
+ F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220
  F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
- F src/hwtime.h b638809e083b601b618df877b2e89cb87c2a47a01f4def10be4c4ebb54664ac7
+ F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
  F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
- F src/insert.c a8de1db43335fc4946370a7a7e47d89975ad678ddb15078a150e993ba2fb37d4
- F src/json.c 39b1c7527f3111923e65f168a87b03b591f12a41400a63d05c119794bee36620
+ F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
+ F src/json.c 14c474fb1249a46eb44e878e2361f36abfe686b134039b0d1883d93d61505b4a
  F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
- F src/loadext.c be5af440f3192c58681b5d43167dbca3ccbfce394d89faa22378a14264781136
- F src/main.c 711be7ef7cc818de5f89887bad67e8196fcad8af9bd27a4ac354447e2b5a4833
+ F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465
 -F src/main.c 5fd4b65d61ae6155f36756ed508a39b38b49355b031188961e8d923f43f4bc49
++F src/main.c f39fc7d716efd7cce2290a65bd781998fb1a021fb561a1c057d348fc231f58cd
  F src/malloc.c 47b82c5daad557d9b963e3873e99c22570fb470719082c6658bf64e3012f7d23
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
- F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
+ F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
  F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75
  F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6
  F src/mem5.c b7da5c10a726aacacc9ad7cdcb0667deec643e117591cc69cf9b4b9e7f3e96ff
@@@ -628,39 -623,39 +629,39 @@@ F src/os.h 1ff5ae51d339d0e30d8a9d814f4b
  F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06
  F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a
  F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107
- F src/os_unix.c a585801080e5d36365a409221813534216f503b58f1f7a4398f225c4ae0bc424
- F src/os_win.c 2b2411279f7b24f927591561303fc5871845732df42641cbf695c23640b16975
 -F src/os_unix.c 95b407307deb902a3bd9a5d5666c7838709cccb337baeee6ef0a53f512d3673e
++F src/os_unix.c c2c3b93b716194a2115b282c37f828438e071e6f2fc4e38c5d6f24d5ba822e7a
+ F src/os_win.c 7038223a1cda0a47e2ab4db47f63bf1833fe53ba0542f0f283a062ea13894103
  F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
- F src/pager.c d41c9e4c5804de4acf00036bb26cd41a798341a051801b08b98dee73fb4999ec
 -F src/pager.c 0a7a695950183a745ec9b2cf0aa3cbc3803dea7d674a1a5a0b0080ab4aa7df9a
 -F src/pager.h c49ff262186a78bc5f27e3891edefb900afa769b9e2eaeca0322c7f3553536d4
 -F src/parse.y 8828f9e15f04d469eab9c0f2aed504e534b1c97c68836bed6f07afab29c2ac0b
++F src/pager.c 71f3c8b45890d35156518ffeb71e422274557793cbedff80585b4e292feed234
 +F src/pager.h e055e649d93f1e121ce50b30a3d01a5225e6d2c45d712c676c8477dec19beeb8
- F src/parse.y 03d4d7a079481e6fab9f9256971fa87c716af20d46fffba2ecea21583e6f05db
- F src/pcache.c 8ee13acccfd9accbf0af94910b7323dd7f7d55300d92ddafcf40e34fcc8e21be
++F src/parse.y cf35577daeb17122be7c42d41485249360d19d3c8a40496872ea8c0a200cfa44
+ F src/pcache.c 4cd4a0043167da9ba7e19b4d179a0e6354e7fe32c16f781ecf9bf0a5ff63b40b
  F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
- F src/pcache1.c f3d06b0c1bd400cf657095757d427b149f6c1788e9447b2ce019988a5344ede8
- F src/pragma.c 450aab7bd07c7570355f3b34df830869c86882f33b7acca842fbdf45146c0c8a
 -F src/pcache1.c 602acb23c471bb8d557a6f0083cc2be641d6cafcafa19e481eba7ef4c9ca0f00
++F src/pcache1.c 181baf62714c20e41c77655360bd4179661f519ecd952314cdeacf60460a1878
+ F src/pragma.c 3a7c0f8e06b94ee34ded7468002b4a502fcdd23bb58c3677a185a4addae7604b
 -F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
 +F src/pragma.h 1f421360eed1a7721e8c521463df8519a7c8d0d5893ebd9dbfe0dba8de996f8c
- F src/prepare.c 6350675966bd0e7ac3a464af9dbfe26db6f0d4237f4e1f1acdb17b12ad371e6e
+ F src/prepare.c d6c4354f8ea0dc06962fbabc4b68c4471a45276a2918c929be00f9f537f69eb1
  F src/printf.c b9320cdbeca0b336c3f139fd36dd121e4167dd62b35fbe9ccaa9bab44c0af38d
 -F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 +F src/random.c 9bd018738ec450bf35d28050b4b33fa9a6eebf3aaefb1a1cff42dc14a7725673
- F src/resolve.c 3e53e02ce87c9582bd7e7d22f13f4094a271678d9dc72820fa257a2abb5e4032
- F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
- F src/select.c ead092c26ba1c6d525fc6319923581a34a0b6ae28d05bb3196ed0106b69c37d4
- F src/shell.c.in 52836b4002a2cad8095b451f0c39a6542c23a231eb0ed5e39387bc8b1f7aaa9e
- F src/sqlite.h.in 12f208a569d0340814b52e50c3e30a43fc32b5ff24c4b9854edb85fa555f5196
+ F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9
+ F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 -F src/select.c 383b9dba12493c365ee2036bcadd73013b7c0f7d2afcda0c378317c335d60ac2
++F src/select.c 411e67407ac2219c99398879caa5f26ad75c91dd1a9bc55bc1c7c9f465916e9f
+ F src/shell.c.in bdd1fdfc77a67651cdc5a158bc9107cf3c2cf3ddb62d7a4da06c6eaaa5e72037
 -F src/sqlite.h.in 3076d78836b6dac53b3ab0875fc8fd15bca8077aad4d33c85336e05af6aef8c7
++F src/sqlite.h.in 22387ee5e1b24edfc479eba19a3ae1996e0cf354763686e7d67e3f9f0aa312b7
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4
- F src/sqliteInt.h d52ede4c29dd1af380f882f29fc0209dc0f20439e953ac349a417ca0f4ed5661
- F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
 -F src/sqliteInt.h 8974b60740b108269f51e833e85191be6bf9f06f317ee34a53b7ec215762cf8c
++F src/sqliteInt.h f7d3a6992623e633ebda13375a47a22cc9129446b536191369124715def48950
+ F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
  F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
  F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
- F src/tclsqlite.c 8522a04fb9c84faa1d80354430ae0ee9349727a3a4b32e3cfe39b9be8324cabd
- F src/test1.c 2b1cee78d45a95b08cf7c7aded6072c65401b73e69debec4ded579a034dbf772
+ F src/tclsqlite.c ecbc3c99c0d0c3ed122a913f143026c26d38d57f33e06bb71185dd5c1efe37cd
 -F src/test1.c e6ab4a00671f052366a01bcb7fdf2e2f6bb4aa884cd01e738c5590dcf47a99ca
++F src/test1.c a7a6efa83d4fc08c020fd535a9c9b71863b752b2f0cd945a839c282df9b72a3e
  F src/test2.c 827446e259a3b7ab949da1542953edda7b5117982576d3e6f1c24a0dd20a5cef
- F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644
+ F src/test3.c e5178558c41ff53236ae0271e9acb3d6885a94981d2eb939536ee6474598840e
  F src/test4.c 4533b76419e7feb41b40582554663ed3cd77aaa54e135cf76b3205098cd6e664
  F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d
- F src/test6.c ae73a3a42bbc982fb9e301b84d30bda65a307be48c6dff20aba1461e17a9b0ce
- F src/test8.c 0c856d6ff6b0d2ff6696addc467a15ed17c6910f14475302cd5b3b4e54406161
+ F src/test6.c e53bc69dc3cb3815fb74df74f38159ec05ba6dd5273216062e26bc797f925530
+ F src/test8.c ccc5d3e2a2bf7248f7da185e2afc4c08b4c6840447f5eb4dd106db165fddbdbc
  F src/test9.c 12e5ba554d2d1cbe0158f6ab3f7ffcd7a86ee4e5
  F src/test_async.c 195ab49da082053fdb0f949c114b806a49ca770a
  F src/test_autoext.c 915d245e736652a219a907909bb6710f0d587871
@@@ -668,10 -663,10 +669,10 @@@ F src/test_backup.c bf5da90c9926df0a4b9
  F src/test_bestindex.c 68c62586d2ae9f032903fe53be743657d0c2aac0a850b880938b668e1161d516
  F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce
  F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274
- F src/test_config.c c7a93ef3c0c881e3c46ff14163af886a602317206d82a7dc4ebbf400e661a6ff
 -F src/test_config.c f0cc1f517deaa96dd384822ae2bb91534fa56aa458528b439830d709941d3932
++F src/test_config.c 4ad524247225326ccc0046b8820e4ae2cefd687d0263f752f59259704e05d98a
  F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f
  F src/test_demovfs.c 38a459d1c78fd9afa770445b224c485e079018d6ac07332ff9bd07b54d2b8ce9
- F src/test_devsym.c aff2255ea290d7718da08af30cdf18e470ff7325a5eff63e0057b1496ed66593
+ F src/test_devsym.c 649434ed34d0b03fbd5a6b42df80f0f9a7e53f94dd1710aad5dd8831e91c4e86
  F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480
  F src/test_func.c 24df3a346c012b1fc9e1001d346db6054deb426db0a7437e92490630e71c9b0a
  F src/test_hexio.c a605a100e628d39330044ae5f34cb19d50843061ed3178c3f83b37aef65f7e0a
@@@ -706,34 -701,34 +707,34 @@@ F src/test_windirent.h da2e5b73c32d0990
  F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f
  F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
  F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
- F src/tokenize.c 1305797eab3542a0896b552c6e7669c972c1468e11e92b370533c1f37a37082b
- F src/treeview.c fccf3b8c517c1f55cb380c1522febe6921fcb2bd800c16c78cab571d0eb0ccbd
+ F src/tokenize.c 0fb405f9adf3f757c26bfc1ae6d58ac5dccbb918917ba9e5ef0e6673a06563d3
+ F src/treeview.c 1d52fbc4e97161e65858d36e3424ea6e3fc045dd8a679c82b4b9593dc30de3bd
  F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0
- F src/update.c d45803226442cc84bfe9d48dde9978f5bd51e526b703a836719815eacf8e440c
 -F src/update.c 0aa36561167a7c40d01163238c297297962f31a15a8d742216b3c37cdf25f731
++F src/update.c 94a803cf0e45208d12952250500c4210f9ca1b6401fc822033009484f2d39331
  F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
  F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
- F src/util.c d4bcb560471cd94e6e17d448311f8d5bf81a7e5276295a53501058ef1b95dd1a
- F src/vacuum.c f6e47729554e0d2c576bb710c415d5bc414935be0d7a70f38d1f58ffa7a6d8c0
- F src/vdbe.c fb5e47fce79990f8bebcc3c75f79538c88a90446065866ce42298f93a2d4708d
- F src/vdbe.h 637ae853b7d42ae3951034cc63ab7c8af837861f79504cdb5399552fcd89a884
- F src/vdbeInt.h a4147a4ddf613cb1bcb555ace9e9e74a9c099d65facd88155f191b1fb4d74cfb
- F src/vdbeapi.c b4982cde547054c4f7341198db3c3008a48e1eb028f757601bf5bf2fc026cbcf
- F src/vdbeaux.c f6d04ddce4450244ef4e845deb74462edd01f731bc57b737ae2d5a13d34a6092
+ F src/util.c 6f9d2f278dcc8d41c618980cd3cfe88e1bafc0626209b917c6773d8202d29ef6
 -F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
 -F src/vdbe.c e3af55622d9ee9d269c9a6e4c1aaa58af2ffda019d8643a45cd7178ab3a53ba8
++F src/vacuum.c b1dd6d73869229b6e08bac910ac011dc9da42e3120ec2b7241accc5a752bd419
++F src/vdbe.c 5cfca43a3b69cfc46beb521e6de5ec06ac3779ce58e5b56dfdec3739e17a48ec
+ F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
+ F src/vdbeInt.h 7bd49eef8f89c1a271fbf12d80a206bf56c876814c5fc6bee340f4e1907095ae
+ F src/vdbeapi.c de9703f8705afc393cc2864669ce28cf9516983c8331d59aa2b978de01634365
 -F src/vdbeaux.c 4d5e68a3850d0b193a692eca6442d7afe35252aaf29728a67adcb542ecabd9ce
++F src/vdbeaux.c 736c7dcf8c99dcc03c6931bde5913cee29bf83a755984778ff1a600c05d3a7c5
  F src/vdbeblob.c 2516697b3ee8154eb8915f29466fb5d4f1ae39ee8b755ea909cefaf57ec5e2ce
- F src/vdbemem.c 1cac4028c0dabbf1f3259f107440e2780e05ac9fe419e9709e6eb4e166ba714b
- F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35
+ F src/vdbemem.c 710119a8e35e47813681c48703d65a80ba22792192de90bc51dc0d6366f2a79e
+ F src/vdbesort.c 0d40dca073c94e158ead752ef4225f4fee22dee84145e8c00ca2309afb489015
  F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
  F src/vdbevtab.c aae4bd769410eb7e1d02c42613eec961d514459b1c3c1c63cfc84e92a137daac
- F src/vtab.c 4758a96d36c9a120848386ae603b1ab32a4876e0a1faf81bfcfb524455e583dc
+ F src/vtab.c 1ecf8c3745d29275688d583e12822fa984d421e0286b5ef50c137bc3bf6d7a64
  F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
- F src/wal.c e78a2f4af580db963f987761922a79fa40bc466b37c203ceeb30034b89e29df3
 -F src/wal.c 2515a345761855b3451895b58f974b3f7d5ec62eaaaf4cca008eb5497fccda33
 -F src/wal.h d01234e828943e002040c22a7e017642962f9fd9b2dc142fa599769ae4e459e9
++F src/wal.c 4db49fcda8ceca946b61d234356fa580399ee5e81323c48fe393e1a338ebe4b6
 +F src/wal.h dd2cd9880f308a1bda0a72f36a29c3d4388d47db45f321ebe936a378ac845e32
- F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
- F src/where.c b74a83b4c8f65b218c5c1c8d9122433f85ee1300fd9263ba1697d0e1040eeb36
- F src/whereInt.h e25203e5bfee149f5f1225ae0166cfb4f1e65490c998a024249e98bb0647377c
- F src/wherecode.c b300db0bcd84ad6c2642bf3f509f92fad7b7d697b9856b64dd66d692d184d054
- F src/whereexpr.c 22cf19b0ececeaf838daed1039c5231a8778784eba5ad67b991442a23473fd3f
- F src/window.c e075ea85bea322e30e361fa6e69eddba74f461e99e2a564dc09973f8a1fb27d9
+ F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2
+ F src/where.c 2dc708cf8b6a691fb79f16bbc46567497ee6f991043318d421e294b2da114d93
+ F src/whereInt.h c7d19902863beadec1d04e66aca39c0bcd60b74f05f0eaa7422c7005dfc5d51a
+ F src/wherecode.c bff0bc56cb1a382de266c2db3a691135c18a4360b6ad5e069e5c415d57eb0c38
+ F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00
+ F src/window.c b7ad9cff3ce8ae6f8cc25e18e1a258426cb6bd2999aace6f5248d781b2a74098
  F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
  F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
  F test/affinity3.test f094773025eddf31135c7ad4cde722b7696f8eb07b97511f98585addf2a510a9
@@@ -2107,8 -2055,8 +2078,8 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9
  F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
  F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
  F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P 1348c2a59027d6e260d4c7543479093eaf7baccaa3ea61a0d091c44e0dea4b8c
- R c8cdea1b9aa49524702d53e388aa9458
- U dan
- Z 69c8dd77f80c6e6120460e3d71577e65
 -P 137057f95778b3c913854d2182d0fbbfd9dd117db5566dabb5a22d927a59de62 2e9734c2335d8c06fedc9f4cca02baaf326f7fa276bd464f3214f383715a48d6
 -R 2f5c3f8e0a859440ee9e176d7384494a
++P 4b08d4dad6b254a342353e3f765066c85cbc5450fe13501665c648627cca21cd 80ac494f734d9720fbbb1111741aa99fc319c6c9a32e7f13b5962001d6ace828
++R 4b8d19d5230182dc120ea3dbf79d17ea
+ U drh
 -Z 1c322048b32c8289d43928aaf4abece7
++Z bcdc3e9e4eb8771cadc69859c408bf41
  # Remove this line to create a well-formed Fossil manifest.
diff --cc manifest.uuid
index 6ea029c061230ec71b7def4d8aacf51b6639b986,a820650b224e1c1d3c44c105486e9455da31423e..be3c3c161be0c475562a2b77272de69e5f302240
@@@ -1,1 -1,1 +1,1 @@@
- 4b08d4dad6b254a342353e3f765066c85cbc5450fe13501665c648627cca21cd
 -80ac494f734d9720fbbb1111741aa99fc319c6c9a32e7f13b5962001d6ace828
++0551b79b17579a91d891c745ecd0e35b5142f944ed59eb3c95c37e5a4de8a461
diff --cc src/bitvec.c
Simple merge
diff --cc src/btree.c
index 2022f4bc31009d3d226cad931188e375eade394e,9be539ee3a084a8b9cc979bfc68a4127fb656701..15055a6d50349cf62493b968e0667b5bd5a9110d
@@@ -2588,50 -2336,25 +2576,36 @@@ static int getAndInitPage
    }
    rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly);
    if( rc ){
-     goto getAndInitPage_error1;
+     *ppPage = 0;
+     return rc;
    }
-   *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage);
-   if( (*ppPage)->isInit==0 ){
+   pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage);
+   if( pPage->isInit==0 ){
      btreePageFromDbPage(pDbPage, pgno, pBt);
-     rc = btreeInitPage(*ppPage);
+     rc = btreeInitPage(pPage);
      if( rc!=SQLITE_OK ){
-       goto getAndInitPage_error2;
+       releasePage(pPage);
+       *ppPage = 0;
+       return rc;
      }
    }
-   assert( (*ppPage)->pgno==pgno || CORRUPT_DB );
-   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) ){
-     rc = SQLITE_CORRUPT_PGNO(pgno);
-     goto getAndInitPage_error2;
-   }
+   assert( pPage->pgno==pgno || CORRUPT_DB );
+   assert( pPage->aData==sqlite3PagerGetData(pDbPage) );
+   *ppPage = pPage;
    return SQLITE_OK;
- getAndInitPage_error2:
-   releasePage(*ppPage);
- getAndInitPage_error1:
-   if( pCur ){
-     pCur->iPage--;
-     pCur->pPage = pCur->apPage[pCur->iPage];
-   }
-   testcase( pgno==0 );
-   assert( pgno!=0 || rc!=SQLITE_OK );
-   return rc;
  }
  
 +#ifndef SQLITE_OMIT_CONCURRENT
 +/* 
 +** Set the value of the MemPage.pgnoRoot variable, if it exists.
 +*/
 +static void setMempageRoot(MemPage *pPg, u32 pgnoRoot){
 +  pPg->pgnoRoot = pgnoRoot;
 +}
 +#else
 +# define setMempageRoot(x,y)
 +#endif
 +
  /*
  ** Release a MemPage.  This should be called once for each prior
  ** call to btreeGetPage.
@@@ -5789,9 -5326,7 +5793,8 @@@ const void *sqlite3BtreePayloadFetch(Bt
  ** vice-versa).
  */
  static int moveToChild(BtCursor *pCur, u32 newPgno){
 +  BtShared *pBt = pCur->pBt;
    int rc;
    assert( cursorOwnsBtShared(pCur) );
    assert( pCur->eState==CURSOR_VALID );
    assert( pCur->iPage<BTCURSOR_MAX_DEPTH );
    pCur->apPage[pCur->iPage] = pCur->pPage;
    pCur->ix = 0;
    pCur->iPage++;
-   rc = getAndInitPage(pBt, newPgno, &pCur->pPage,
-                         pCur, pCur->curPagerFlags);
 -  rc = getAndInitPage(pCur->pBt, newPgno, &pCur->pPage, pCur->curPagerFlags);
 -  if( rc==SQLITE_OK
 -   && (pCur->pPage->nCell<1 || pCur->pPage->intKey!=pCur->curIntKey)
 -  ){
 -    releasePage(pCur->pPage);
 -    rc = SQLITE_CORRUPT_PGNO(newPgno);
++  rc = getAndInitPage(pBt, newPgno, &pCur->pPage, pCur->curPagerFlags);
 +  if( rc==SQLITE_OK ){
 +    setMempageRoot(pCur->pPage, pCur->pgnoRoot);
++    if( pCur->pPage->nCell<1 || pCur->pPage->intKey!=pCur->curIntKey ){
++      releasePage(pCur->pPage);
++      rc = SQLITE_CORRUPT_PGNO(newPgno);
++    }
+   }
+   if( rc ){
+     pCur->pPage = pCur->apPage[--pCur->iPage];
    }
    return rc;
  }
@@@ -7489,12 -7044,12 +7524,12 @@@ static int fillInCell
        }
  #endif
        rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0);
 -#ifndef SQLITE_OMIT_AUTOVACUUM
 +
        /* If the database supports auto-vacuum, and the second or subsequent
        ** overflow page is being allocated, add an entry to the pointer-map
-       ** for that page now. 
+       ** for that page now.
        **
-       ** If this is the first overflow page, then write a partial entry 
+       ** If this is the first overflow page, then write a partial entry
        ** to the pointer-map. If we write nothing to this pointer-map slot,
        ** then the optimistic overflow chain processing in clearCell()
        ** may misinterpret the uninitialized values and delete the
@@@ -9042,12 -8596,12 +9077,12 @@@ static int balance_nonroot
    **   b) if the sibling pages are not leaves, the child page associated
    **      with the cell.
    **
-   ** If the sibling pages are not leaves, then the pointer map entry 
-   ** associated with the right-child of each sibling may also need to be 
-   ** updated. This happens below, after the sibling pages have been 
+   ** If the sibling pages are not leaves, then the pointer map entry
+   ** associated with the right-child of each sibling may also need to be
+   ** updated. This happens below, after the sibling pages have been
    ** populated, not here.
    */
 -  if( ISAUTOVACUUM(pBt) ){
 +  if( REQUIRE_PTRMAP ){
      MemPage *pOld;
      MemPage *pNew = pOld = apNew[0];
      int cntOldNext = pNew->nCell + pNew->nOverflow;
@@@ -9486,11 -9042,11 +9523,11 @@@ static int balance(BtCursor *pCur)
            */
            u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize);
            rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1,
 -                               pCur->hints&BTREE_BULKLOAD);
 +                               pCur->hints&BTREE_BULKLOAD, pCur->pgnoRoot);
            if( pFree ){
-             /* If pFree is not NULL, it points to the pSpace buffer used 
+             /* If pFree is not NULL, it points to the pSpace buffer used
              ** by a previous call to balance_nonroot(). Its contents are
-             ** now stored either on real database pages or within the 
+             ** now stored either on real database pages or within the
              ** new pSpace buffer, so it may be safely freed here. */
              sqlite3PageFree(pFree);
            }
@@@ -9880,8 -9435,8 +9917,8 @@@ int sqlite3BtreeInsert
      BTREE_CLEAR_CELL(rc, pPage, oldCell, info);
      testcase( pCur->curFlags & BTCF_ValidOvfl );
      invalidateOverflowCache(pCur);
-     if( info.nSize==szNew && info.nLocal==info.nPayload 
+     if( info.nSize==szNew && info.nLocal==info.nPayload
 -     && (!ISAUTOVACUUM(p->pBt) || szNew<pPage->minLocal)
 +     && (!REQUIRE_PTRMAP || szNew<pPage->minLocal)
      ){
        /* Overwrite the old cell with the new if they are the same size.
        ** We could also try to do this if the old cell is smaller, then add
@@@ -10484,10 -10038,9 +10521,10 @@@ static int clearDatabasePage
    if( pgno>btreePagecount(pBt) ){
      return SQLITE_CORRUPT_BKPT;
    }
-   rc = getAndInitPage(pBt, pgno, &pPage, 0, 0);
+   rc = getAndInitPage(pBt, pgno, &pPage, 0);
    if( rc ) return rc;
-   if( (pBt->openFlags & BTREE_SINGLE)==0 
 +  setMempageRoot(pPage, pgnoRoot);
+   if( (pBt->openFlags & BTREE_SINGLE)==0
     && sqlite3PagerPageRefcount(pPage->pDbPage) != (1 + (pgno==1))
    ){
      rc = SQLITE_CORRUPT_BKPT;
@@@ -11932,38 -11379,3 +11970,37 @@@ int sqlite3BtreeConnectionCount(Btree *
    return p->pBt->nRef;
  }
  #endif
 +
 +/*
 +** Access details of recent COMMIT commands. This function allows various
 +** details related to the most recent COMMIT command to be accessed. 
 +** The requested value is always returned via output parameter (*piVal).
 +** The specific value requested is identified by parameter op (see
 +** below).
 +**
 +** SQLITE_OK is returned if successful, or SQLITE_ERROR if the "op" or
 +** "zDb" paramters are unrecognized.
 +*/
 +int sqlite3_commit_status(
 +  sqlite3 *db,                    /* Database handle */
 +  const char *zDb,                /* Name of database - "main" etc. */
 +  int op,                         /* SQLITE_COMMIT_XXX constant */
 +  unsigned int *piVal             /* OUT: Write requested value here */
 +){
 +  int rc = SQLITE_OK;
 +#ifndef SQLITE_OMIT_CONCURRENT
 +  if( op<0 || op>SQLITE_COMMIT_CONFLICT_PGNO ){
 +    rc = SQLITE_ERROR;
 +  }else if( op==SQLITE_COMMIT_FIRSTFRAME || op==SQLITE_COMMIT_NFRAME ){
 +    int iDb = sqlite3FindDbName(db, zDb);
 +    if( iDb<0 ){
 +      rc = SQLITE_ERROR;
 +    }else{
 +      *piVal = db->aDb[iDb].pBt->aCommit[op];
 +    }
 +  }else{
 +    *piVal = db->aCommit[op];
 +  }
 +#endif
 +  return rc;
 +}
diff --cc src/btreeInt.h
Simple merge
diff --cc src/build.c
Simple merge
diff --cc src/func.c
index 5f28e6ac6b8490f22fcd457ee871c51ad8a48b3e,14f485d4dea57d326f9284c4840267cf94a4f78b..f4328295365abc06757942add0539bc9e8669565
@@@ -523,11 -523,10 +523,11 @@@ static void randomFunc
    sqlite3_value **NotUsed2
  ){
    sqlite_int64 r;
 +  sqlite3 *db = sqlite3_context_db_handle(context);
    UNUSED_PARAMETER2(NotUsed, NotUsed2);
 -  sqlite3_randomness(sizeof(r), &r);
 +  sqlite3FastRandomness(&db->sPrng, sizeof(r), &r);
    if( r<0 ){
-     /* We need to prevent a random number of 0x8000000000000000 
+     /* We need to prevent a random number of 0x8000000000000000
      ** (or -9223372036854775808) since when you do abs() of that
      ** number of you get the same value back again.  To do this
      ** in a way that is testable, mask the sign bit off of negative
diff --cc src/main.c
Simple merge
diff --cc src/os_unix.c
index e78f3592b0b54951dfbcf33e4868b53580d84ae2,aed4ac213fbbdecbc441b337d538e276639e2d48..16be92635d89808b8a17d25f93f5f4c142c5aa41
@@@ -5240,12 -5086,9 +5240,12 @@@ static void unixShmBarrier
    sqlite3_file *fd                /* Database file holding the shared memory */
  ){
    UNUSED_PARAMETER(fd);
 +#ifdef SQLITE_MUTEXFREE_SHMLOCK
 +  __sync_synchronize();
 +#else
    sqlite3MemoryBarrier();         /* compiler-defined memory barrier */
-   assert( fd->pMethods->xLock==nolockLock 
-        || unixFileMutexNotheld((unixFile*)fd) 
+   assert( fd->pMethods->xLock==nolockLock
+        || unixFileMutexNotheld((unixFile*)fd)
    );
    unixEnterMutex();               /* Also mutex, for redundancy */
    unixLeaveMutex();
diff --cc src/pager.c
index 917856670b29e838aa24ddc874354b70abc31eee,98692c4162632b9c3b019c1ab11d3d2c2a4c887b..ad8301bf4cdce16da2e4309924c3df5698ba94bd
@@@ -1860,12 -1808,13 +1860,12 @@@ static void pagerFreeBitvecs(Pager *pPa
  */
  static void pager_unlock(Pager *pPager){
  
-   assert( pPager->eState==PAGER_READER 
-        || pPager->eState==PAGER_OPEN 
-        || pPager->eState==PAGER_ERROR 
+   assert( pPager->eState==PAGER_READER
+        || pPager->eState==PAGER_OPEN
+        || pPager->eState==PAGER_ERROR
    );
  
 -  sqlite3BitvecDestroy(pPager->pInJournal);
 -  pPager->pInJournal = 0;
 +  pagerFreeBitvecs(pPager);
    releaseAllSavepoints(pPager);
  
    if( pagerUseWal(pPager) ){
@@@ -4638,14 -4570,8 +4638,14 @@@ static int pagerStress(void *p, PgHdr *
    pPager->aStat[PAGER_STAT_SPILL]++;
    pPg->pDirty = 0;
    if( pagerUseWal(pPager) ){
 +#ifndef SQLITE_OMIT_CONCURRENT
 +    /* If the transaction is a "BEGIN CONCURRENT" transaction, the page 
 +    ** cannot be flushed to disk. Return early in this case. */
 +    if( pPager->pAllRead ) return SQLITE_OK;
 +#endif
 +
      /* Write a single frame for this page to the log. */
-     rc = subjournalPageIfRequired(pPg); 
+     rc = subjournalPageIfRequired(pPg);
      if( rc==SQLITE_OK ){
        rc = pagerWalFrames(pPager, pPg, 0, 0);
      }
@@@ -5908,17 -5817,14 +5903,17 @@@ static int pager_open_journal(Pager *pP
  }
  
  /*
- ** Begin a write-transaction on the specified pager object. If a 
+ ** Begin a write-transaction on the specified pager object. If a
  ** write-transaction has already been opened, this function is a no-op.
  **
 -** If the exFlag argument is false, then acquire at least a RESERVED
 -** lock on the database file. If exFlag is true, then acquire at least
 +** If the exFlag argument is 0, then acquire at least a RESERVED
 +** lock on the database file. If exFlag is >0, then acquire at least
- ** an EXCLUSIVE lock. If such a lock is already held, no locking 
+ ** an EXCLUSIVE lock. If such a lock is already held, no locking
  ** functions need be called.
  **
 +** If (exFlag<0) and the database is in WAL mode, do not take any locks.
 +** The transaction will run in CONCURRENT mode instead.
 +**
  ** If the subjInMemory argument is non-zero, then any sub-journal opened
  ** within this transaction will be opened as an in-memory file. This
  ** has no effect if the sub-journal is already opened (as it may be when
diff --cc src/parse.y
Simple merge
diff --cc src/pcache1.c
Simple merge
diff --cc src/select.c
Simple merge
diff --cc src/sqlite.h.in
Simple merge
diff --cc src/sqliteInt.h
Simple merge
diff --cc src/test1.c
Simple merge
Simple merge
diff --cc src/update.c
Simple merge
diff --cc src/vacuum.c
Simple merge
diff --cc src/vdbe.c
index 7b043638f3ad28e7528c04dc1899e390a6a4fc5d,b58efcb27254ccde98d3d66a6d6e3613aed8a269..39e31e8f0ed1a46974dadc2122fb8ac447987161
@@@ -3713,11 -3713,10 +3713,11 @@@ case OP_Savepoint: 
      }else{
  
        /* Determine whether or not this is a transaction savepoint. If so,
-       ** and this is a RELEASE command, then the current transaction 
-       ** is committed. 
+       ** and this is a RELEASE command, then the current transaction
+       ** is committed.
        */
        int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint;
 +      assert( db->eConcurrent==0 || db->isTransactionSavepoint==0 );
        if( isTransaction && p1==SAVEPOINT_RELEASE ){
          if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
            goto vdbe_return;
@@@ -3837,17 -3828,10 +3837,17 @@@ case OP_AutoCommit: 
        assert( desiredAutoCommit==1 );
        sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK);
        db->autoCommit = 1;
 -    }else if( desiredAutoCommit && db->nVdbeWrite>0 ){
 -      /* If this instruction implements a COMMIT and other VMs are writing
 -      ** return an error indicating that the other VMs must complete first.
 -      */
 +      db->eConcurrent = CONCURRENT_NONE;
 +    }else if( desiredAutoCommit
 +            && (db->nVdbeWrite>0 || (db->eConcurrent && db->nVdbeActive>1)) ){
 +      /* A transaction may only be committed if there are no other active
 +      ** writer VMs. If the transaction is CONCURRENT, then it may only be
 +      ** committed if there are no active VMs at all (readers or writers).
 +      **
 +      ** If this instruction is a COMMIT and the transaction may not be
 +      ** committed due to one of the conditions above, return an error
-       ** indicating that other VMs must complete before the COMMIT can 
++      ** indicating that other VMs must complete before the COMMIT can
 +      ** be processed.  */
        sqlite3VdbeError(p, "cannot commit transaction - "
                            "SQL statements in progress");
        rc = SQLITE_BUSY;
@@@ -7946,13 -7911,8 +7947,13 @@@ case OP_CursorUnlock: 
  */
  case OP_TableLock: {
    u8 isWriteLock = (u8)pOp->p3;
 +#ifndef SQLITE_OMIT_CONCURRENT
 +  if( isWriteLock && db->eConcurrent && pOp->p2==1 && pOp->p1!=1 ){
 +    db->eConcurrent = CONCURRENT_SCHEMA;
 +  }
 +#endif
    if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommit) ){
-     int p1 = pOp->p1; 
+     int p1 = pOp->p1;
      assert( p1>=0 && p1<db->nDb );
      assert( DbMaskTest(p->btreeMask, p1) );
      assert( isWriteLock==0 || isWriteLock==1 );
diff --cc src/vdbeaux.c
Simple merge
diff --cc src/wal.c
index c19713ab17d8a4d302c43d3a86919e0c090898f7,a78c6d97bd9d04ff3fbc199e87b68dc9a97afbb0..0b8bb1496ad209b0ec188e521f2a390c6417642a
+++ b/src/wal.c
@@@ -4059,37 -4026,8 +4063,37 @@@ Pgno sqlite3WalDbsize(Wal *pWal)
    return 0;
  }
  
 +/*
 +** Take the WRITER lock on the WAL file. Return SQLITE_OK if successful,
 +** or an SQLite error code otherwise. This routine does not invoke any
 +** busy-handler callbacks, that is done at a higher level.
 +*/
 +static int walWriteLock(Wal *pWal){
 +  int rc;
 +
 +  /* Cannot start a write transaction without first holding a read lock */
 +  assert( pWal->readLock>=0 );
 +  assert( pWal->writeLock==0 );
 +  assert( pWal->iReCksum==0 );
 +
 +  /* If this is a read-only connection, obtaining a write-lock is not
 +  ** possible. In this case return SQLITE_READONLY. Otherwise, attempt
 +  ** to grab the WRITER lock. Set Wal.writeLock to true and return
 +  ** SQLITE_OK if successful, or leave Wal.writeLock clear and return 
 +  ** an SQLite error code (possibly SQLITE_BUSY) otherwise. */
 +  if( pWal->readOnly ){
 +    rc = SQLITE_READONLY;
 +  }else{
 +    rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1);
 +    if( rc==SQLITE_OK ){
 +      pWal->writeLock = 1;
 +    }
 +  }
 +
 +  return rc;
 +}
  
- /* 
+ /*
  ** This function starts a write transaction on the WAL.
  **
  ** A read transaction must have already been started by a prior call
@@@ -4433,39 -4121,15 +4437,39 @@@ int sqlite3WalUndo
      assert( isWalMode2(pWal) || iWal==0 );
  
      /* Restore the clients cache of the wal-index header to the state it
-     ** was in before the client began writing to the database. 
+     ** was in before the client began writing to the database.
      */
      memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr));
 -    assert( walidxGetFile(&pWal->hdr)==iWal );
      iNew = walidxGetMxFrame(&pWal->hdr, walidxGetFile(&pWal->hdr));
  
 +    /* BEGIN CONCURRENT transactions are different, as the header just
 +    ** memcpy()d into pWal->hdr may not be the same as the current header 
 +    ** when the transaction was started. Instead, pWal->hdr now contains
 +    ** the header written by the most recent successful COMMIT. Because
 +    ** Wal.writeLock is set, if this is a BEGIN CONCURRENT transaction,
 +    ** the rollback must be taking place because an error occurred during
 +    ** a COMMIT.
 +    **
 +    ** The code below is still valid. All frames between (iNew+1) and iMax 
 +    ** must have been written by this transaction before the error occurred.
 +    ** The exception is in wal2 mode - if the current wal file at the time
 +    ** of the last COMMIT is not wal file iWal, then the error must have
 +    ** occurred in WalLockForCommit(), before any pages were written
 +    ** to the database file. In this case return early.  */
 +#ifndef SQLITE_OMIT_CONCURRENT
 +    if( bConcurrent ){
 +      pWal->hdr.aCksum[0]++;
 +    }
 +    if( walidxGetFile(&pWal->hdr)!=iWal ){
 +      assert( bConcurrent && isWalMode2(pWal) );
 +      return SQLITE_OK;
 +    }
 +#endif
 +    assert( walidxGetFile(&pWal->hdr)==iWal );
 +
      for(iFrame=iNew+1; ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; iFrame++){
        /* This call cannot fail. Unless the page for which the page number
-       ** is passed as the second argument is (a) in the cache and 
+       ** is passed as the second argument is (a) in the cache and
        ** (b) has an outstanding reference, then xUndo is either a no-op
        ** (if (a) is false) or simply expels the page from the cache (if (b)
        ** is false).