]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge recent trunk enhancements into the begin-concurrent branch.
authordrh <>
Thu, 22 Jun 2023 13:28:30 +0000 (13:28 +0000)
committerdrh <>
Thu, 22 Jun 2023 13:28:30 +0000 (13:28 +0000)
FossilOrigin-Name: 5bd26fea6a0720897a6c8384249b1e41c1838ef98f8f48d463d0cdde631477b9

23 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/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 5e1cab574a59013e257cd1578ecb58642feaf6ac,078f72b8b23b0c677d21448ca15032411c5d3653..191605b19e3732a4d26a46806621c0e7eeaea8c3
+++ b/manifest
@@@ -1,13 -1,13 +1,13 @@@
- C Merge\sall\s3.42.0\srelease\schanges\sinto\sthe\sbegin-concurrent\sbranch.
- D 2023-05-16T12:56:38.851
 -C Simplification\sto\sthe\sgetAndInitPage()\sroutine\sthat\sresults\sin\simproved\nperformance.
 -D 2023-06-22T01:03:39.798
++C Merge\srecent\strunk\senhancements\sinto\sthe\sbegin-concurrent\sbranch.
++D 2023-06-22T13:28:30.583
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
- F Makefile.in c4e763adb43bd7b189eb07cb36f56da052d29a50dbd12d7e1b2167461e91a215
 -F Makefile.in 0f4cb3955aaff8a40ec3857ba1784bd98b69802e51eff979f874b65713b627b2
++F Makefile.in 114bde7003dd31a813475be1fa848afd5741715a7fac56cabf3b081035137626
  F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241
- F Makefile.msc ce7bea7931e1ef96b0f44c0362074a8bb62e61a0e7cfdb05afebd928adaacc2b
- F README.md e05bd8fcb45da04ab045c37f79a98654e8aa3b3b8f302cfbba80a0d510df75f7
- F VERSION 17f95ae2fdf21f0e9575eb0b0511ea63f15d71dfff431b21c2b4adbfa70cfbbf
+ F Makefile.msc 7248d860f71ab164b4cec3c415e6cc1bd9fee860c370d65bd8bb49e9572521e2
+ F README.md 8ff80689b9cb9f6e9b842edf31a3358ff53bc538c351799e03dd3e5455e637e5
+ F VERSION c6366dc72582d3144ce87b013cc35fe48d62f6d07d5be0c9716ea33c862144aa
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
  F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
  F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
@@@ -499,16 -496,16 +501,16 @@@ F ext/wasm/api/post-js-header.js 47b6b2
  F ext/wasm/api/pre-js.c-pp.js ad906703f7429590f2fbf5e6498513bf727a1a4f0ebfa057afb08161d7511219
  F ext/wasm/api/sqlite3-api-cleanup.js cc21e3486da748463e02bbe51e2464c6ac136587cdfd5aa00cd0b5385f6ca808
  F ext/wasm/api/sqlite3-api-glue.js f1b2dcb944de5138bb5bd9a1559d2e76a4f3ec25260963d709e8237476688803
- F ext/wasm/api/sqlite3-api-oo1.js 2691a34a741015127b210954a1b9586764d3ff0c8a20f00fd15c00f339ecc79f
+ F ext/wasm/api/sqlite3-api-oo1.js 9678dc4d9a5d39632b6ffe6ea94a023119260815bf32f265bf5f6c36c9516db8
  F ext/wasm/api/sqlite3-api-prologue.js 17f4ec398ba34c5c666fea8e8c4eb82064a35b302f2f2eb355283cd8d3f68ed5
- F ext/wasm/api/sqlite3-api-worker1.js 40a5b1813fcbe789f23ae196c833432c8c83e7054d660194ddfc51eab1c5b9bf
+ F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b1738645c0134562bb84e88e2fec
  F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89
- F ext/wasm/api/sqlite3-opfs-async-proxy.js 70914ae97784d3028150bbf252e07a423056c42cc345903c81b5fae661ce512f
+ F ext/wasm/api/sqlite3-opfs-async-proxy.js 961bbc3ccc1fa4e91d6519a96e8811ad7ae60173bd969fee7775dacb6eee1da2
  F ext/wasm/api/sqlite3-v-helper.js e5c202a9ecde9ef818536d3f5faf26c03a1a9f5192b1ddea8bdabf30d75ef487
- F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 89640e4874a60cb2d973306b272384ffb45c7915375c7bb0355c7586f88dc39c
+ F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 05f2563ddebfdc7a0f0ac0eb7cb381bb72043299aae1600ba9367c12f52b3fcc
  F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
  F ext/wasm/api/sqlite3-wasm.c 12a096d8e58a0af0589142bae5a3c27a0c7e19846755a1a37d2c206352fbedda
 -F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f
 +F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js c5ac33e39f21a3481812d7333ca6e18853640d423a01960ca8dbc6e7c5c3c21c
  F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75
  F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8
  F ext/wasm/batch-runner.js 0dad6a02ad796f1003d3b7048947d275c4d6277f63767b8e685c27df8fdac93e
@@@ -560,8 -557,7 +562,7 @@@ F ext/wasm/wasmfs.make cf9a68162d92ca2b
  F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
  F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
  F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0
- F main.mk 35eee5299cda961a23af337b6a0d6388ed724fa309aad83271ef1e3320111de0
- F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
 -F main.mk 0eb735008653412026092961cecdf7d698156c060e4062a69d911335982d471c
++F main.mk f52ead41e999d2f13d1ffc2abf851726fb436f321652d7073cbfb8bf90f72c0b
  F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
  F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
  F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421
@@@ -573,41 -569,41 +574,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 d9eb74049de919647765eb8bb7adb94678a69772b7e88d461c191259d30af0d1
 -F src/bitvec.c 9eac5f42c11914d5ef00a75605bb205e934f435c579687f985f1f8b0995c8645
++F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e
+ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
 -F src/btree.c c0c93b6cb4dc133b528c1290bb4ad0f2414452f9a5758ff2b106af718874f39e
 -F src/btree.h aa354b9bad4120af71e214666b35132712b8f2ec11869cb2315c52c81fad45cc
 -F src/btreeInt.h 3b4eff7155c0cea6971dc51f62e3529934a15a6640ec607dd42a767e379cb3a9
 -F src/build.c a8ae3b32d9aa9bbd2c0e97d7c0dd80def9fbca408425de1608f57ee6f47f45f4
++F src/btree.c 15a5cba9d9833f0bb55735a9330fd4eb55e41eba5d40191bcfddf18c002e90c4
 +F src/btree.h 77a092acf63526827e74e88d0480123212d079593a841ff1fe85507adf256ef6
- F src/btreeInt.h 757425aeff908b819f2f086eadcc44ca847a672617ced5161c56c60c6b39c226
- F src/build.c e68566439c2694ec880ee7fd7277de9a267f16fcd740aad3ef81780b2856d2b1
++F src/btreeInt.h c490cf859feeec542d60e6df7976dc8f99a82c587a8a96e432be66b3a08fc83c
++F src/build.c 84238806b9a9ca5373ccaea65a86129717d023bc582919f7f5a91d1b92e1a4c1
  F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490
  F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
  F src/ctime.c 20507cc0b0a6c19cd882fcd0eaeda32ae6a4229fb4b024cfdf3183043d9b703d
- 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
@@@ -625,39 -621,39 +626,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 db9ded173327ef541a96ecf3f58604bab36eec58468a0b32806eb2bfe4690b37
- F src/os_win.c 2b2411279f7b24f927591561303fc5871845732df42641cbf695c23640b16975
 -F src/os_unix.c 95b407307deb902a3bd9a5d5666c7838709cccb337baeee6ef0a53f512d3673e
++F src/os_unix.c 421305c7de30080ec58ebd1d9c4dbfccb971fb46206d679465ed42db8685026c
+ F src/os_win.c 7038223a1cda0a47e2ab4db47f63bf1833fe53ba0542f0f283a062ea13894103
  F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
- F src/pager.c 24fe15ba66304e7c52f26cde2296f32ef45cd22e084b7bbfbe382e8e605d6fc6
 -F src/pager.c 5ddf3a74c633a008ea6b2f5b3186167e88e2c8ca8a252ecab06ab3f1eb48e60f
 -F src/pager.h f82e9844166e1585f5786837ddc7709966138ced17f568c16af7ccf946c2baa3
 -F src/parse.y 8828f9e15f04d469eab9c0f2aed504e534b1c97c68836bed6f07afab29c2ac0b
++F src/pager.c e2039b61af0fdb3e5c4a476b064d20a2c7a41eb86e41de1c03a8093fb28cbcaa
 +F src/pager.h 7b2ec7bba30b21a97b68d5bdc0dbb82a75f48c4b1457180988f9d409fb789e16
- 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 dee95e3cd2b61e6512dc814c5ab76d5eb36f0bfc9441dbb4260fccc0d12bbddc
- F src/pragma.c 26ed2cfdc5c12aa1c707178635709684960288cacc9cff9d491a38ff10e395f1
+ F src/pcache1.c 602acb23c471bb8d557a6f0083cc2be641d6cafcafa19e481eba7ef4c9ca0f00
+ F src/pragma.c 37b8fb02d090262280c86e1e2654bf59d8dbfbfe8dc6733f2b968a11374c095a
 -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 a3e70f8515721ff24d2c0e6afd83923e8faab5ab79ececea4c1bf9fe4049fbb2
- 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 bd6db733c0f8559c5c28e14c406c27a28635d47c09bd9e0c2778ea1d30a291ab
+ 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 2d9fe0df0a6943aaf2d26358bef08d37bb266bbec649b46c42e064ca9d57fd46
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4
- F src/sqliteInt.h a7bcc8232a0f6476de7fe9956ffa03276c8acabbdbc7ef4441378ea08d4ae0e7
- F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
 -F src/sqliteInt.h 8974b60740b108269f51e833e85191be6bf9f06f317ee34a53b7ec215762cf8c
++F src/sqliteInt.h 63694b09d3effe63f8d09909f7c067960dc79bfa253aec613f1ce7e1506393b0
+ F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
  F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
  F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
- F src/tclsqlite.c 8522a04fb9c84faa1d80354430ae0ee9349727a3a4b32e3cfe39b9be8324cabd
- F src/test1.c fce757d6c5cc7ecf010283fabe674cb021c1ce3f874803b21c978e6c768138e1
+ F src/tclsqlite.c ecbc3c99c0d0c3ed122a913f143026c26d38d57f33e06bb71185dd5c1efe37cd
 -F src/test1.c e6ab4a00671f052366a01bcb7fdf2e2f6bb4aa884cd01e738c5590dcf47a99ca
++F src/test1.c dd1cf6dbb2507e735582d011c8d7e9f55b649b2d8cff4f7b818405c2cc435140
  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
@@@ -665,10 -661,10 +666,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 9478e56a0f08e07841a014a93b20e4ba2709ab56d039d1ca8020e26846aa19bd
@@@ -703,34 -699,34 +704,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 82588046b02f57c354a50a4999a303ff88abad547ee5853542d636785e496f83
 -F src/update.c 0aa36561167a7c40d01163238c297297962f31a15a8d742216b3c37cdf25f731
++F src/update.c 2dbef4481774a43891fbf217e394cf229a3c2d6a926ad47bb2836536cc521f11
  F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
  F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
- F src/util.c d4bcb560471cd94e6e17d448311f8d5bf81a7e5276295a53501058ef1b95dd1a
- F src/vacuum.c f6e47729554e0d2c576bb710c415d5bc414935be0d7a70f38d1f58ffa7a6d8c0
- F src/vdbe.c ff263dbc22033121cf5fd196b4de8b23fe278e6542bae3c08ae324c00a400338
- 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 6c0de640ef3be08cf2992d588a7501aee0f1003027bc952a6916a35f6e33b4cf
++F src/vacuum.c b1dd6d73869229b6e08bac910ac011dc9da42e3120ec2b7241accc5a752bd419
++F src/vdbe.c 786a0cc7956a601720d246164a9c19322bc1e950aad412958d365e3632d68908
+ 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 f8d61811ccee37783569d52b6092ef590c622a4b7c19a7487ff5a9f4029f3276
 -F src/wal.c cbfeeb7415baa545efa244dd34bb5af4ae953a206fed720c6fa7f1ef763ec122
 -F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
++F src/wal.c 40f4fb16300fb810bdb6a13cc3d98621720ae62a86df55ed4867874a78bc3007
 +F src/wal.h 7ffe787437f20a098af347011967a6d3bb8e5c3dc645e6be59eff44d2b2c5297
- 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
@@@ -2087,8 -2041,8 +2058,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 18c5e16b55ac63b92c1516f387cf9f5625156027cc23dc230d14afd778357203 831d0fb2836b71c9bc51067c49fee4b8f18047814f2ff22d817d25195cf350b0
- R 4f70341be8719b97a33f22c82006395e
 -P dc468cfdb825083b3a4b6cb95c913961e9312e22103c5a0cd923b75c83c65e13
 -R 61e892d0fc1ac1905da44ab1762c00e7
++P 804bb138f536f64bfa397eed5e7223e34945cff97894633b26fa677818bf6fcd 2e9734c2335d8c06fedc9f4cca02baaf326f7fa276bd464f3214f383715a48d6
++R 789504a3f6529dcfd2d246a7de8c676e
  U drh
- Z c2a4c1a4a4ec2237411b6aae733f8bab
 -Z c0e995c2a64328b6123221956a5cefda
++Z 8b5134b065a15fc23288205486a9ea8c
  # Remove this line to create a well-formed Fossil manifest.
diff --cc manifest.uuid
index 1d7d34bbc7928d60b188593441b758bad775428e,293cf2062a806751802b0e1a47d9769790b636c5..39e6101c9d502a3fe25de1b8a3e2a3ee37096192
@@@ -1,1 -1,1 +1,1 @@@
- 804bb138f536f64bfa397eed5e7223e34945cff97894633b26fa677818bf6fcd
 -2e9734c2335d8c06fedc9f4cca02baaf326f7fa276bd464f3214f383715a48d6
++5bd26fea6a0720897a6c8384249b1e41c1838ef98f8f48d463d0cdde631477b9
diff --cc src/bitvec.c
Simple merge
diff --cc src/btree.c
index 7f44ed6c59855c644e945f4858c99f84cf14889b,aa4e286013c415f2da9404845bc7f9259657d0c2..eb54be4547f265418174f6263bbd2d966b4aacb2
@@@ -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.
@@@ -5773,9 -5326,7 +5777,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;
  }
@@@ -7473,12 -7044,12 +7508,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
@@@ -9024,12 -8596,12 +9059,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;
@@@ -9468,11 -9042,11 +9505,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);
            }
@@@ -9862,8 -9435,8 +9899,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
@@@ -10466,10 -10038,9 +10503,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;
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
Simple merge
diff --cc src/pager.c
index 8322161b5afd5cbdbcd09bf83b02d79769678d35,7f2cb5ba76388b1c55b5fae5e7deb3790c4ce93f..3748a570cc10b10bdd6a93b4deb3341e630395de
@@@ -1871,12 -1819,13 +1871,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) ){
@@@ -4644,14 -4576,8 +4644,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);
      }
@@@ -5911,17 -5820,14 +5906,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/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 8873ca0f556a21a6516cc248982fff51be35ef8f,7045a1e4bd3ab75424ada566c7d1bf01581b78f7..9ead85380d940d96559e4f5a6142d211f80685e0
@@@ -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;
@@@ -7934,13 -7898,8 +7934,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 ebef95b417c1ab025389b90713b6575ba7ecfae9,f4d0328b2b4f86ec122e11bc5ac56d82e9b1b683..0bdccce3ef6000e53f65b1c51a164b99f8aec6b2
+++ b/src/wal.c
@@@ -3297,37 -3284,8 +3297,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
@@@ -3585,31 -3368,19 +3585,31 @@@ int sqlite3WalEndWriteTransaction(Wal *
  ** Otherwise, if the callback function does not return an error, this
  ** function returns SQLITE_OK.
  */
 -int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){
 +int sqlite3WalUndo(
 +  Wal *pWal, 
 +  int (*xUndo)(void *, Pgno), 
 +  void *pUndoCtx,
 +  int bConcurrent                 /* True if this is a CONCURRENT transaction */
 +){
    int rc = SQLITE_OK;
 -  if( ALWAYS(pWal->writeLock) ){
 +  if( pWal->writeLock ){
      Pgno iMax = pWal->hdr.mxFrame;
      Pgno iFrame;
-   
      /* 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));
 +#ifndef SQLITE_OMIT_CONCURRENT
 +    if( bConcurrent ){
 +      pWal->hdr.aCksum[0]++;
 +    }
 +#else
 +    UNUSED_PARAMETER(bConcurrent);
 +#endif
  
-     for(iFrame=pWal->hdr.mxFrame+1; 
-         ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; 
+     for(iFrame=pWal->hdr.mxFrame+1;
+         ALWAYS(rc==SQLITE_OK) && iFrame<=iMax;
          iFrame++
      ){
        /* This call cannot fail. Unless the page for which the page number