]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge recent enhancements from trunk.
authordrh <drh@noemail.net>
Mon, 28 Aug 2017 17:19:35 +0000 (17:19 +0000)
committerdrh <drh@noemail.net>
Mon, 28 Aug 2017 17:19:35 +0000 (17:19 +0000)
FossilOrigin-Name: d53108e76307fb24ef1d8f75fe82c180f5588ad8e65eeceace92f4cecadfa452

16 files changed:
1  2 
main.mk
manifest
manifest.uuid
src/btree.c
src/btree.h
src/btreeInt.h
src/build.c
src/main.c
src/pager.c
src/sqlite.h.in
src/sqliteInt.h
src/vdbe.c
src/vdbeaux.c
src/wal.c
src/wal.h
test/wal2.test

diff --cc main.mk
Simple merge
diff --cc manifest
index c5496f596697ce89a15d3d65e7ea0737acb5531b,c1fc26d824475865bb484a79283c9a971c8da2ea..7aadbc91b54183d64cefc4b0d5559ab4ae60fcb8
+++ b/manifest
@@@ -1,8 -1,8 +1,8 @@@
- C Test\sBEGIN\sCONCURRENT\stransactions\sthat\sconsist\sentirely\sof\sread-only\nstatements.
- D 2017-08-24T10:10:28.736
- F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8
 -C Add\sthe\s--enable-update-limit\soption\sto\sthe\s./configure\sscript.
 -D 2017-08-28T17:00:12.028
++C Merge\srecent\senhancements\sfrom\strunk.
++D 2017-08-28T17:19:35.967
+ F Makefile.in c644bbe8ebe4aae82ad6783eae6b6beea4c727b99ff97568b847ced5e2ac7afb
  F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
- F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016
+ F Makefile.msc 25b154da7f0b3d4924f27378c1f8d006285b80811f1ccf3ed953dbebf6282136
  F README.md f5c87359573c4d255425e588a56554b50fdcc2afba4e017a2e02a43701456afd
  F VERSION f81232df28e2d3ff049feefad5fbd5489cc33697f6bd2ecf61af7f0dde3b83d0
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
@@@ -381,7 -380,7 +384,7 @@@ F ext/userauth/userauth.c 3410be31283ab
  F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
  F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
  F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
- F main.mk ab1d9ee22955523a6288b3a3c887e480e80ded44ac429bcaee744c35a90b2d1d
 -F main.mk da75a0527a56da0b7f568a976b3cb69756613080f16e4d208b6c6a0495bfb132
++F main.mk 1773e6741a68c4307487eb29a9e812e5254552f63b17105940412ab9a47474b2
  F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
  F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
  F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
@@@ -396,15 -395,15 +399,15 @@@ F sqlite3.pc.in 48fed132e7cb71ab676105d
  F src/alter.c cf7a8af45cb0ace672f47a1b29ab24092a9e8cd8d945a9974e3b5d925f548594
  F src/analyze.c 0d0ccf7520a201d8747ea2f02c92c26e26f801bc161f714f27b9f7630dde0421
  F src/attach.c 07b706e336fd3cedbd855e1f8266d10e82fecae07daf86717b5760cd7784c584
- F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c
+ F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73
  F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b
 -F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
 +F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf
  F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca
- F src/btree.c 91e4c8414e6e5ddddb673e06934a796f333b1ae171d4a31d4c8ac2858ace26c3
- F src/btree.h e8045998d865a21de226a417467cc64cf9d66e41b91b7436539f99ee464b5402
- F src/btreeInt.h 4a4cc19595e98c471c05cd9d7fc824da3397c303c7293019f4df7706caacf2fe
- F src/build.c 7c5d92a0a78311372adf2a8267d9bf9b3cff4d6fe3697c3e2a05a7e14c4898be
- F src/callback.c 930648a084a3adc741c6471adfbdc50ba47ba3542421cb80a26f259f467de65e
 -F src/btree.c 1033b88fe50aba7d364b5a19666a9a274caa8d4c25ab7f3914221997b46af44a
 -F src/btree.h 32ef5d3f25dc70ef1ee9cecf84a023c21378f06a57cd701d2e866e141b150f09
 -F src/btreeInt.h 55b702efce17e5d1941865464227d3802cfc9c7c832fac81d4c94dced47a71fc
 -F src/build.c b47a0320c6d237718b8f493ac97d37d1071bce12aca668b15219187150c41295
++F src/btree.c fd5d4ce00607bb0f5c2d66e312497ebc5b19ac076c25418229d8ae3a7645e472
++F src/btree.h feafd0647331366f4ef17f7e68597e9029f001e7ab16a125e2f176c598a7ef4a
++F src/btreeInt.h 0e0abe97427b4139092ec8782d396a4ad18566964e992c60043e370d4c86fd99
++F src/build.c a720180d5d1b701ce0b71a569a8f2dce0a9d587bebfc63991a21b8c537c5e3fc
+ F src/callback.c 28a8ede982fde4129b828350f78f2c01fe7d12c74d1a0a05d7108ab36f308688
  F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
  F src/ctime.c ff1be3eed7bdd75aaca61ca8dc848f7c9f850ef2fb9cb56f2734e922a098f9c0
  F src/date.c 48f743d88bbe88f848532d333cca84f26e52a4f217e86f86be7fc1b919c33d74
@@@ -422,8 -421,8 +425,8 @@@ F src/in-operator.md 10cd8f4bcd225a3251
  F src/insert.c d2d1bf12d2b5382450620d7cede84c7ffe57e6a89fa9a908f1aba68df2731cd9
  F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
  F src/loadext.c 20865b183bb8a3723d59cf1efffc3c50217eb452c1021d077b908c94da26b0b2
- F src/main.c 299da61b7ee007e04ed69873b1b750eed6b7a8463d601dd098c99d39b967e2be
- F src/malloc.c e20bb2b48abec52d3faf01cce12e8b4f95973755fafec98d45162dfdab111978
 -F src/main.c 227a83d3f840d55e40360a1a8370c120f1466ea7d73b1fffb74b8f59ad0f4046
++F src/main.c 0442ec813c4b2ec787e4a82cf2c2f7ffc43c72016203b4ff4ac2468114a3653c
+ F src/malloc.c e069cec00407e029d71fbc9440ebbb5833a629416324b592ade8fed93b045c83
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
  F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3
@@@ -441,34 -440,34 +444,34 @@@ F src/os.c 93e0979b9b55df29c0c4923f73b4
  F src/os.h 8e976e59eb4ca1c0fca6d35ee803e38951cb0343
  F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
  F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
- F src/os_unix.c a361273749229755f92c8f0e3e4855054ad39bbc5c65773e8db5d0b79afa632c
+ F src/os_unix.c 489aa972ccc34f7b4770b891694b32101c59ddd4be4ef0ddd9a4da58c145c1a6
  F src/os_win.c 964165b66cde03abc72fe948198b01be608436894732eadb94c8720d2467f223
  F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
- F src/pager.c fac516ae6a04a45b2e84804245d0d0c38be07e8dd62be1f7613c83913f681570
 -F src/pager.c bf51378c57c8e05d7f4d7bb9861f403a2e40cde82e25513401216d1ed30bc3e5
 -F src/pager.h f2a99646c5533ffe11afa43e9e0bea74054e4efa
 -F src/parse.y 52ef3cecd0934e9da4a45b585883a03243ad615d338ad94f44501a05891dcdfa
++F src/pager.c 94a8f8f56a5c643128a766c41c79af185ccb49eb7348acf52b040267aacbaa19
 +F src/pager.h 403b7d242616f8742ec149ede4a06b3e66896c554ce09c2abeddb926fdd1b707
 +F src/parse.y bcd8c5d9442518887df1fc9c35d454126927f705ae262cd3981c16bf297e910e
  F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870
  F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11
- F src/pcache1.c 0b793738b5dddaf0a645784835c6b5557b1ecfaee339af9c26810c6ecdb273aa
- F src/pragma.c cd6aeda3587be6c5c08f9b2d45eae6068666a03c9d077c8c43cdb85fb0aa70f2
+ F src/pcache1.c ad5bc71727c2e825dcbf342413e1b4b09ed8520cd83903671e8bd03bc30b4c98
+ F src/pragma.c a4e5028dfc8af4c5c347cd0e91bd2f0c0f81fcd9b2c6e0acf8da7da51df7f1fe
  F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
- F src/prepare.c 3cbb99757d7295997674972f9dd2331c5c544368854ca08954c9beb1e9b6145a
- F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2
+ F src/prepare.c 9a141a1b02dca53beaa9771699d390aafcac01f5d1f1c0ae6e23ded8dcdb709a
+ F src/printf.c 40aee47ae9be4bd3dbdc8968bd07fddc027be8edec8daddf24d3391d36698a1c
  F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
  F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20
  F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
- F src/select.c 3fd19c98c5223d411b883502d1ac928ddb762a1ea8f031d910210316545fc67c
- F src/shell.c bd6a37cbe8bf64ef6a6a74fdc50f067d3148149b4ce2b4d03154663e66ded55f
- F src/shell.c.in b5725acacba95ccefa57b6d068f710e29ba8239c3aa704628a1902a1f729c175
- F src/sqlite.h.in 803d2c969bccaf78ef087269c73f1f00f8870c122b3514414b8c47c4fde73e82
+ F src/select.c c9b3d8444bbf6f167d84f41ca6f3672e2521cb163a8c706b19058dc82fffe9b8
+ F src/shell.c 117305aab365a0448505d8cfcc27d58b0182ea314f0201bd26c340a5717419a4
+ F src/shell.c.in af3fb9eabdc0a95beace2f760597d213be0988c974eca116208eb220cd24469c
 -F src/sqlite.h.in f18eef5b101d5f33f98ca43decb1f025c1b629f091ad77fe2190128e93938a5a
++F src/sqlite.h.in 8d2f6ea62113defeac791fdbdaef5ab0d4576dbde4fa076fc2773b7927fb6e38
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h a1fd3aa82f967da436164e0728a7d6841651fd0c6e27b9044e0eb9f6c8462e47
- F src/sqliteInt.h 0eccf839f75dab42f46559ea529c51921b8bf427b3d9a170a45e8e58cb4304bd
 -F src/sqliteInt.h 9a283ecf57bb81e0040d243d56e91beae76f6d5762b3ac33c7f3ec6076a71d99
++F src/sqliteInt.h 7a7f342f654805f3ad150fb6e3b4d1a08198830797e7230138847d45fe2093e8
  F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
- F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
+ F src/status.c 90450a491f3f59f6978ca9832023c31238f592064e405eeda971f3c0829564eb
  F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
  F src/tclsqlite.c 487951d81f9704800fd9f0ffdaa2f935a83ccb6be3575c2c4ef83e4789b4c828
 -F src/test1.c 8513b17ca4a7a9ba28748535d178b6e472ec7394ae0eea53907f2d3bcdbab2df
 +F src/test1.c 41d8a3bfe6dfd6dee8405ff1fcba6301cb9ca497d5299778ded2c5d8d85f58de
  F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5
  F src/test3.c b8434949dfb8aff8dfa082c8b592109e77844c2135ed3c492113839b6956255b
  F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6
@@@ -523,25 -522,25 +526,25 @@@ F src/treeview.c 2ee4a5dada213d5ab08a74
  F src/trigger.c 48e0f7ed6749ce4d50a695e09e20ce9cf84ecabf2691852c965a51e0b620eccc
  F src/update.c 5404be9e840717323a69209190cdbc9d0d34adaedaaf1d1a1069babf2c4171c0
  F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
- F src/util.c fc081ec6f63448dcd80d3dfad35baecfa104823254a815b081a4d9fe76e1db23
+ F src/util.c 773843506ce694714bc96fe67c30c37015f90ef515d0e70f1f8d5c9c24088152
 -F src/vacuum.c 90839322fd5f00df9617eb21b68beda9b6e2a2937576b0d65985e4aeb1c53739
 -F src/vdbe.c 82fc4553a0986a06bdd0d2b03a424e159bba5c74802fabb2841aa6cd27ccd962
 +F src/vacuum.c 07eec96f821c7dcbdca2fadffc6e38ea2c24bf409fcb15fe9fb3ac444d632dfe
- F src/vdbe.c 1fdd90ce55be0c6f490cafc8884282ad36e9900ad6d6c6b37b424ec194993f5c
++F src/vdbe.c 5d1f7944ffbfe25eb6d697d68ed80ef8f819b35da098908d3056be9968b7a745
  F src/vdbe.h d50cadf12bcf9fb99117ef392ce1ea283aa429270481426b6e8b0280c101fd97
- F src/vdbeInt.h ff2b7db0968d20e6184aee256d2e535d565f5a172e3588a78adb166a41fc4911
- F src/vdbeapi.c 05d6b14ab73952db0d73f6452d6960216997bd966a710266b2fe051f25326abc
- F src/vdbeaux.c 8d4a286c7e6ee62acb1349dd20f310d0bd54231f58f4fc9ecec5565fe6ef1ede
+ F src/vdbeInt.h 1fe00770144c12c4913128f35262d11527ef3284561baaab59b947a41c08d0d9
+ F src/vdbeapi.c 9c670ca0dcc1cd86373aa353b747b26fe531ca5cd4331690c611d1f03842e2a1
 -F src/vdbeaux.c 2dff8186d34e0e525838f77b2fac70bd480f0273a77015bf21b6a08f2792da82
++F src/vdbeaux.c 410ba18e53851bd09c83b25188195cdb38c6360116dbc885329cfc5dabf48faa
  F src/vdbeblob.c db3cf91060f6f4b2f1358a4200e844697990752177784c7c95da00b7ac9f1c7b
- F src/vdbemem.c b7fac20534c79b7554dab2e8a180c585a8bc1b9c85149d1b2d9746cf314d06ed
- F src/vdbesort.c fea2bea25f5e9ccd91e0760d7359f0365f9fba1aaeac7216c71cad78765f58e3
- F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834
+ F src/vdbemem.c 2f9d672af5260f0145787e1dc2c6985414987cc0dc575133a0dc17dda767d868
+ F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f
+ F src/vdbetrace.c 48e11ebe040c6b41d146abed2602e3d00d621d7ebe4eb29b0a0f1617fd3c2f6c
  F src/vtab.c f1d5c23132fb0247af3e86146404112283ddedb6c518de0d4edc91cfb36970ef
  F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
- F src/wal.c ab94c3cc7bfe006c424b5f5945ad8285ffcda36222f0d40048d46bafb43dab69
- F src/wal.h 1ea51dc499d6451529b822a8aaac053eafeef10b7fd9e5a4c9cc413182be429f
- F src/walker.c a7ca64ce08a83a20d32186fbe06bca9234e348cfcf07959ee322fdc3e8a6173a
- F src/where.c cbe8ddffbcec7ce86f7a800fe8fd10aee412c76c87e0dd3732a1682e68d74cd9
 -F src/wal.c 839db09792fead5052bb35e533fa485e134913d547d05b5f42e537b73e63f07a
 -F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a
++F src/wal.c e439b1235b9c366f45dc627f25cec64bdfc024bc3ea23513e9fc6348953e3e6d
++F src/wal.h 1713fefe4587678c295bbeb91c4e7442998ad74f19249869ce49dda9e8ce5d53
+ F src/walker.c 3ccfa8637f95355bff61144e01a615b8ef26f79c312880848da73f03367da1e6
+ F src/where.c 0aaa1b085a018c1c2e2da367b48491ce2686aea351bd17772c46b7e04eb51e3d
  F src/whereInt.h 93bb90b77d39901eda31b44d8e90da1351193ccfe96876f89b58a93a33b84c3d
- F src/wherecode.c e7be3b7f4c11908500cdf02b299d190d3742659533f58e0f4047962fdb5a48da
+ F src/wherecode.c d246d19f5453d3f154ed8fcea892ce6d70ae4a5ddaebae34bd49d73f4c913bc7
  F src/whereexpr.c fe1fe600d7334e91f3d9d487021362d543fba8ab2f1be5e0d68063d619379c05
  F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
  F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
@@@ -660,13 -658,7 +663,13 @@@ F test/collate9.test 3adcc799229545940d
  F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6
  F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95
  F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1
- F test/colname.test b111edd2a84f558567320904bb94c779d7eec47254265b5f0a3d1f3e52cc28e0
+ F test/colname.test c47639d26cbeba6977457e5ef2c2c55c5b6c889478dd7eb0ed858ba894e7fa93
 +F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43
 +F test/concurrent.test a801cd60c370f0ed851657c9576b102f9ab1dd846c6a88e6ae45939a8deeda7c
 +F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8
 +F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170
 +F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44
 +F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5
  F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db
  F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c
  F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9
@@@ -1494,7 -1487,7 +1498,7 @@@ F test/vtab_alter.test 736e66fb5ec7b4fe
  F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
  F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad
  F test/wal.test 613efec03e517e1775d86b993a54877d2e29a477
- F test/wal2.test 7effe771f5c194edc3c38922f71c2f4c789d998e
 -F test/wal2.test 6ac39b94a284ebac6efb6be93b0cdfe73ee6083f129555e3144d8a615e9900ef
++F test/wal2.test 3055879e7bf83c8d1b6130a4bdccdb3c230bc023a696850912ef6207d68dd24a
  F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2
  F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c
  F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9
@@@ -1657,7 -1651,7 +1662,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 4256072399f44f48ed0856aa8112226af6feaf8676923612bde6cea239ebf920
- R 03a159c270fd82b6d54f5498b523d32e
- U dan
- Z fcb6179847dc0180b01d1fb922b3b8b6
 -P 1ba051e34d7512ab5e8fc969c1b5aaaf827b8e6493ba4235895257aca78b500f
 -R 7e1ed169d6d4a03a64afe06fcba95957
++P c3fe1f4b7e8dcadcb516622719d000b808effe3ad497244ba44f57d52dc2cc08 64a8ae68381b7fbb29b659901ca7ce8d50510e4753758d5761f7e41539288cef
++R eb725478e3f2e12486ea89d9d4b34aaa
+ U drh
 -Z 13247c5e6bbeac642354740051347480
++Z c5d300513f55dd3f5d74222bd7b7dcdc
diff --cc manifest.uuid
index 7d481eeeee7751c3a2659f7e91f763d0eb5ffd5c,09eebfb4e5e501c678c3861cf65b1b900213f4b0..49fc7ad80ff3cbf23648a34e46a88fbf8cb29532
@@@ -1,1 -1,1 +1,1 @@@
- c3fe1f4b7e8dcadcb516622719d000b808effe3ad497244ba44f57d52dc2cc08
 -64a8ae68381b7fbb29b659901ca7ce8d50510e4753758d5761f7e41539288cef
++d53108e76307fb24ef1d8f75fe82c180f5588ad8e65eeceace92f4cecadfa452
diff --cc src/btree.c
index 0c2447cc7a0b4d54617460315a9fe69f58f6615d,9ec61507cbf9ae388dcb16e7408e7e062b3958bf..d95b3d9167f7310e49e8d9db032b963fdf8813ae
@@@ -439,204 -439,8 +439,204 @@@ static void downgradeAllSharedCacheTabl
  
  #endif /* SQLITE_OMIT_SHARED_CACHE */
  
 -static void releasePage(MemPage *pPage);
 +#ifndef SQLITE_OMIT_CONCURRENT
 +/*
 +** The following structure - BtreePtrmap - stores the in-memory pointer map
 +** used for newly allocated pages in CONCURRENT transactions. Such pages are
 +** always allocated in a contiguous block (from the end of the file) starting
 +** with page BtreePtrmap.iFirst.
 +*/
 +typedef struct RollbackEntry RollbackEntry;
 +typedef struct PtrmapEntry PtrmapEntry;
 +struct PtrmapEntry {
 +  Pgno parent;
 +  u8 eType;
 +};
 +struct RollbackEntry {
 +  Pgno pgno;
 +  Pgno parent;
 +  u8 eType;
 +};
 +struct BtreePtrmap {
 +  Pgno iFirst;                    /* First new page number aPtr[0] */
 +
 +  int nPtrAlloc;                  /* Allocated size of aPtr[] array */
 +  PtrmapEntry *aPtr;              /* Array of parent page numbers */
 +
 +  int nSvpt;                      /* Used size of aSvpt[] array */
 +  int nSvptAlloc;                 /* Allocated size of aSvpt[] */
 +  int *aSvpt;                     /* First aRollback[] entry for savepoint i */
 +
 +  int nRollback;                  /* Used size of aRollback[] array */
 +  int nRollbackAlloc;             /* Allocated size of aRollback[] array */
 +  RollbackEntry *aRollback;       /* Array of rollback entries */
 +};
 +
 +/* !defined(SQLITE_OMIT_CONCURRENT)
 +**
 +** If page number pgno is greater than or equal to BtreePtrmap.iFirst, 
 +** store an entry for it in the pointer-map structure.
 +*/
 +static int btreePtrmapStore(
 +  BtShared *pBt,
 +  Pgno pgno,
 +  u8 eType, 
 +  Pgno parent
 +){
 +  BtreePtrmap *pMap = pBt->pMap;
 +  if( pgno>=pMap->iFirst ){
 +    int iEntry = pgno - pMap->iFirst;
 +
 +    /* Grow the aPtr[] array as required */
 +    while( iEntry>=pMap->nPtrAlloc ){
 +      int nNew = pMap->nPtrAlloc ? pMap->nPtrAlloc*2 : 16;
 +      PtrmapEntry *aNew = (PtrmapEntry*)sqlite3_realloc(
 +          pMap->aPtr, nNew*sizeof(PtrmapEntry)
 +      );
 +      if( aNew==0 ){
 +        return SQLITE_NOMEM;
 +      }else{
 +        int nByte = (nNew-pMap->nPtrAlloc)*sizeof(PtrmapEntry);
 +        memset(&aNew[pMap->nPtrAlloc], 0, nByte);
 +        pMap->aPtr = aNew;
 +        pMap->nPtrAlloc = nNew;
 +      }
 +    }
 +
 +    /* Add an entry to the rollback log if required */
 +    if( pMap->nSvpt>0 && pMap->aPtr[iEntry].parent ){
 +      if( pMap->nRollback>=pMap->nRollbackAlloc ){
 +        int nNew = pMap->nRollback ? pMap->nRollback*2 : 16;
 +        RollbackEntry *aNew = (RollbackEntry*)sqlite3_realloc(
 +            pMap->aRollback, nNew*sizeof(RollbackEntry)
 +        );
 +        if( aNew==0 ){
 +          return SQLITE_NOMEM;
 +        }else{
 +          pMap->aRollback = aNew;
 +          pMap->nRollbackAlloc = nNew;
 +        }
 +      }
 +
 +      pMap->aRollback[pMap->nRollback].pgno = pgno;
 +      pMap->aRollback[pMap->nRollback].parent = pMap->aPtr[iEntry].parent;
 +      pMap->aRollback[pMap->nRollback].eType = pMap->aPtr[iEntry].eType;
 +      pMap->nRollback++;
 +    }
 +
 +    /* Update the aPtr[] array */
 +    pMap->aPtr[iEntry].parent = parent;
 +    pMap->aPtr[iEntry].eType = eType;
 +  }
 +
 +  return SQLITE_OK;
 +}
 +
 +/* !defined(SQLITE_OMIT_CONCURRENT)
 +**
 +** Open savepoint iSavepoint, if it is not already open.
 +*/
 +static int btreePtrmapBegin(BtShared *pBt, int nSvpt){
 +  BtreePtrmap *pMap = pBt->pMap;
 +  if( pMap && nSvpt>pMap->nSvpt ){
 +    int i;
 +    if( nSvpt>=pMap->nSvptAlloc ){
 +      int nNew = pMap->nSvptAlloc ? pMap->nSvptAlloc*2 : 16;
 +      int *aNew = sqlite3_realloc(pMap->aSvpt, sizeof(int) * nNew);
 +      if( aNew==0 ){
 +        return SQLITE_NOMEM;
 +      }else{
 +        pMap->aSvpt = aNew;
 +        pMap->nSvptAlloc = nNew;
 +      }
 +    }
 +
 +    for(i=pMap->nSvpt; i<nSvpt; i++){
 +      pMap->aSvpt[i] = pMap->nRollback;
 +    }
 +    pMap->nSvpt = nSvpt;
 +  }
 +
 +  return SQLITE_OK;
 +}
 +
 +/* !defined(SQLITE_OMIT_CONCURRENT)
 +**
 +** Rollback (if op==SAVEPOINT_ROLLBACK) or release (if op==SAVEPOINT_RELEASE)
 +** savepoint iSvpt.
 +*/
 +static void btreePtrmapEnd(BtShared *pBt, int op, int iSvpt){
 +  BtreePtrmap *pMap = pBt->pMap;
 +  if( pMap ){
 +    assert( op==SAVEPOINT_ROLLBACK || op==SAVEPOINT_RELEASE );
 +    assert( iSvpt>=0 || (iSvpt==-1 && op==SAVEPOINT_ROLLBACK) );
 +    if( iSvpt<0 ){
 +      pMap->nSvpt = 0;
 +      pMap->nRollback = 0;
 +      memset(pMap->aPtr, 0, sizeof(Pgno) * pMap->nPtrAlloc);
 +    }else if( iSvpt<pMap->nSvpt ){
 +      if( op==SAVEPOINT_ROLLBACK ){
 +        int ii;
 +        for(ii=pMap->nRollback-1; ii>=pMap->aSvpt[iSvpt]; ii--){
 +          RollbackEntry *p = &pMap->aRollback[ii];
 +          PtrmapEntry *pEntry = &pMap->aPtr[p->pgno - pMap->iFirst];
 +          pEntry->parent = p->parent;
 +          pEntry->eType = p->eType;
 +        }
 +      }
 +      pMap->nSvpt = iSvpt + (op==SAVEPOINT_ROLLBACK);
 +      pMap->nRollback = pMap->aSvpt[iSvpt];
 +    }
 +  }
 +}
 +
 +/* !defined(SQLITE_OMIT_CONCURRENT)
 +**
 +** This function is called after an CONCURRENT transaction is opened on the
 +** database. It allocates the BtreePtrmap structure used to track pointers
 +** to allocated pages and zeroes the nFree/iTrunk fields in the database 
 +** header on page 1.
 +*/
 +static int btreePtrmapAllocate(BtShared *pBt){
 +  int rc = SQLITE_OK;
 +  if( pBt->pMap==0 ){
 +    BtreePtrmap *pMap = sqlite3_malloc(sizeof(BtreePtrmap));
 +    if( pMap==0 ){
 +      rc = SQLITE_NOMEM;
 +    }else{
 +      memset(&pBt->pPage1->aData[32], 0, sizeof(u32)*2);
 +      memset(pMap, 0, sizeof(BtreePtrmap));
 +      pMap->iFirst = pBt->nPage + 1;
 +      pBt->pMap = pMap;
 +    }
 +  }
 +  return rc;
 +}
 +
 +/* !defined(SQLITE_OMIT_CONCURRENT)
 +**
 +** Free any BtreePtrmap structure allocated by an earlier call to
 +** btreePtrmapAllocate().
 +*/
 +static void btreePtrmapDelete(BtShared *pBt){
 +  BtreePtrmap *pMap = pBt->pMap;
 +  if( pMap ){
 +    sqlite3_free(pMap->aRollback);
 +    sqlite3_free(pMap->aPtr);
 +    sqlite3_free(pMap->aSvpt);
 +    sqlite3_free(pMap);
 +    pBt->pMap = 0;
 +  }
 +}
 +#else  /* SQLITE_OMIT_CONCURRENT */
 +# define btreePtrmapAllocate(x) SQLITE_OK
 +# define btreePtrmapDelete(x) 
 +# define btreePtrmapBegin(x,y)  SQLITE_OK
 +# define btreePtrmapEnd(x,y,z) 
 +#endif /* SQLITE_OMIT_CONCURRENT */
 +
 +static void releasePage(MemPage *pPage);  /* Forward reference */
+ static void releasePageNotNull(MemPage *pPage);  /* Forward reference */
  
  /*
  ***** This routine is used inside of assert() only ****
@@@ -5261,14 -4863,11 +5271,16 @@@ static int moveToChild(BtCursor *pCur, 
    }
    pCur->info.nSize = 0;
    pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl);
-   pCur->aiIdx[pCur->iPage++] = pCur->ix;
+   pCur->aiIdx[pCur->iPage] = pCur->ix;
+   pCur->apPage[pCur->iPage] = pCur->pPage;
    pCur->ix = 0;
-   rc = getAndInitPage(pBt, newPgno, &pCur->apPage[pCur->iPage],
+   pCur->iPage++;
 -  return getAndInitPage(pBt, newPgno, &pCur->pPage, pCur, pCur->curPagerFlags);
++  rc = getAndInitPage(pBt, newPgno, &pCur->pPage,
 +                        pCur, pCur->curPagerFlags);
 +  if( rc==SQLITE_OK ){
-     setMempageRoot(pCur->apPage[pCur->iPage], pCur->pgnoRoot);
++    setMempageRoot(pCur->pPage, pCur->pgnoRoot);
 +  }
 +  return rc;
  }
  
  #ifdef SQLITE_DEBUG
@@@ -5373,13 -4977,12 +5390,13 @@@ static int moveToRoot(BtCursor *pCur)
                          0, pCur->curPagerFlags);
      if( rc!=SQLITE_OK ){
        pCur->eState = CURSOR_INVALID;
-        return rc;
+       return rc;
      }
-     setMempageRoot(pCur->apPage[0], pCur->pgnoRoot);
++    setMempageRoot(pCur->pPage, pCur->pgnoRoot);
      pCur->iPage = 0;
-     pCur->curIntKey = pCur->apPage[0]->intKey;
+     pCur->curIntKey = pCur->pPage->intKey;
    }
-   pRoot = pCur->apPage[0];
+   pRoot = pCur->pPage;
    assert( pRoot->pgno==pCur->pgnoRoot );
  
    /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
diff --cc src/btree.h
Simple merge
diff --cc src/btreeInt.h
Simple merge
diff --cc src/build.c
Simple merge
diff --cc src/main.c
Simple merge
diff --cc src/pager.c
index 733d65d436b6de82109785af4a5be7113e384ec3,2e5977fe43e7b741ba2301276bd824edce0d21db..de6e2d82a57ef436680625449fe06ded1c2f6524
@@@ -6378,53 -6283,7 +6375,49 @@@ int sqlite3PagerExclusiveLock(Pager *pP
      if( 0==pagerUseWal(pPager) ){
        rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
      }
-   u32 iFrame = 0;
 +#ifndef SQLITE_OMIT_CONCURRENT
 +    else{
 +      if( pPager->pAllRead ){
 +        /* This is an CONCURRENT transaction. Attempt to lock the wal database
 +        ** here. If SQLITE_BUSY (but not SQLITE_BUSY_SNAPSHOT) is returned,
 +        ** invoke the busy-handler and try again for as long as it returns
 +        ** non-zero.  */
 +        do {
 +          rc = sqlite3WalLockForCommit(
 +              pPager->pWal, pPage1, pPager->pAllRead, piConflict
 +          );
 +        }while( rc==SQLITE_BUSY 
 +             && pPager->xBusyHandler(pPager->pBusyHandlerArg) 
 +        );
 +      }
 +    }
 +#endif /* SQLITE_OMIT_CONCURRENT */
 +  }
 +  return rc;
 +}
 +
 +#ifndef SQLITE_OMIT_CONCURRENT
 +/*
 +** This function is called as part of committing an CONCURRENT transaction.
 +** At this point the wal WRITER lock is held, and all pages in the cache 
 +** except for page 1 are compatible with the snapshot at the head of the
 +** wal file. 
 +**
 +** This function updates the in-memory data structures and reloads the
 +** contents of page 1 so that the client is operating on the snapshot 
 +** at the head of the wal file.
 +**
 +** SQLITE_OK is returned if successful, or an SQLite error code otherwise.
 +*/
 +int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage *pPage1){
 +  int rc;
-     rc = sqlite3WalFindFrame(pPager->pWal, 1, &iFrame);
-   }
-   if( rc==SQLITE_OK ){
-     rc = readDbPage(pPage1, iFrame);
 +
 +  assert( pPager->pWal && pPager->pAllRead );
 +  rc = sqlite3WalUpgradeSnapshot(pPager->pWal);
 +  if( rc==SQLITE_OK ){
++    rc = readDbPage(pPage1);
    }
 +
    return rc;
  }
  
diff --cc src/sqlite.h.in
Simple merge
diff --cc src/sqliteInt.h
Simple merge
diff --cc src/vdbe.c
Simple merge
diff --cc src/vdbeaux.c
Simple merge
diff --cc src/wal.c
Simple merge
diff --cc src/wal.h
Simple merge
diff --cc test/wal2.test
Simple merge