]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge latest trunk changes into this branch.
authordan <dan@noemail.net>
Fri, 22 Sep 2017 10:49:03 +0000 (10:49 +0000)
committerdan <dan@noemail.net>
Fri, 22 Sep 2017 10:49:03 +0000 (10:49 +0000)
FossilOrigin-Name: 307b802e8627c93a51e4c54851a4fab33db5061bb80e3d327ce53b127d6d511b

13 files changed:
1  2 
main.mk
manifest
manifest.uuid
src/btree.c
src/build.c
src/main.c
src/pager.c
src/pager.h
src/sqlite.h.in
src/sqliteInt.h
src/test1.c
src/vdbe.c
src/vdbeaux.c

diff --cc main.mk
Simple merge
diff --cc manifest
index 7aadbc91b54183d64cefc4b0d5559ab4ae60fcb8,c6c2dbee56f1b761049d49aef835c626d8ee58c2..b3429762a793a85d60f9aec74391767510ca4659
+++ b/manifest
@@@ -1,8 -1,8 +1,8 @@@
- C Merge\srecent\senhancements\sfrom\strunk.
- D 2017-08-28T17:19:35.967
- F Makefile.in c644bbe8ebe4aae82ad6783eae6b6beea4c727b99ff97568b847ced5e2ac7afb
 -C Update\sthe\sconfigure\sscript\sso\sthat\sit\slooks\sfor\stclsh8.7\sahead\sof\stclsh8.6.
 -D 2017-09-22T00:24:44.674
++C Merge\slatest\strunk\schanges\sinto\sthis\sbranch.
++D 2017-09-22T10:49:03.297
+ F Makefile.in 4bc36d913c2e3e2d326d588d72f618ac9788b2fd4b7efda61102611a6495c3ff
  F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
- F Makefile.msc 25b154da7f0b3d4924f27378c1f8d006285b80811f1ccf3ed953dbebf6282136
+ F Makefile.msc 6033b51b6aea702ea059f6ab2d47b1d3cef648695f787247dd4fb395fe60673f
  F README.md f5c87359573c4d255425e588a56554b50fdcc2afba4e017a2e02a43701456afd
  F VERSION f81232df28e2d3ff049feefad5fbd5489cc33697f6bd2ecf61af7f0dde3b83d0
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
@@@ -384,7 -382,7 +386,7 @@@ F ext/userauth/userauth.c 3410be31283ab
  F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
  F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
  F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
- F main.mk 1773e6741a68c4307487eb29a9e812e5254552f63b17105940412ab9a47474b2
 -F main.mk d0145f02deb67d65c4822225847cba112c237cdb62f4905eeb4b648e82bfc222
++F main.mk 9fb1523f57e1748fd1b63fb95b7d74abd42c9a57642e7e005a19d59964c0e4b6
  F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
  F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
  F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
@@@ -401,12 -399,12 +403,12 @@@ F src/analyze.c 0d0ccf7520a201d8747ea2f
  F src/attach.c 07b706e336fd3cedbd855e1f8266d10e82fecae07daf86717b5760cd7784c584
  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 fd5d4ce00607bb0f5c2d66e312497ebc5b19ac076c25418229d8ae3a7645e472
 -F src/btree.c 1c2b2f1714c411d7a9bc52c90d9dd7eab261261d5691ac0f67e1ced92419799c
 -F src/btree.h 32ef5d3f25dc70ef1ee9cecf84a023c21378f06a57cd701d2e866e141b150f09
 -F src/btreeInt.h 55b702efce17e5d1941865464227d3802cfc9c7c832fac81d4c94dced47a71fc
 -F src/build.c e71e96a67daf3d1dd23188423e66cd6af38017e2ec73fead5d2b57da2d3c7e16
++F src/btree.c e709a9ab3328c7f8c2e6f1e8661fe2da49ae86c57395b42476c91ae482450868
 +F src/btree.h feafd0647331366f4ef17f7e68597e9029f001e7ab16a125e2f176c598a7ef4a
 +F src/btreeInt.h 0e0abe97427b4139092ec8782d396a4ad18566964e992c60043e370d4c86fd99
- F src/build.c a720180d5d1b701ce0b71a569a8f2dce0a9d587bebfc63991a21b8c537c5e3fc
++F src/build.c f4d7f09ef5e350ff202cb9f73171f7785dd692d68c28915fed3f602674cb60f5
  F src/callback.c 28a8ede982fde4129b828350f78f2c01fe7d12c74d1a0a05d7108ab36f308688
  F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
  F src/ctime.c ff1be3eed7bdd75aaca61ca8dc848f7c9f850ef2fb9cb56f2734e922a098f9c0
@@@ -425,8 -423,8 +427,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 0442ec813c4b2ec787e4a82cf2c2f7ffc43c72016203b4ff4ac2468114a3653c
- F src/malloc.c e069cec00407e029d71fbc9440ebbb5833a629416324b592ade8fed93b045c83
 -F src/main.c 1c2307a9f7e3183232a2d049881026fe43bf25659857cc11a9a44898accd3200
++F src/main.c 6a7c184cb376fa76a6aecdfcc981ba076e6489f8c33d43883c192e36644a0f4c
+ F src/malloc.c a02c9e69bc76bee0f639416b947a946412890b606301454727feadcb313536d6
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
  F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3
@@@ -444,34 -442,34 +446,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 489aa972ccc34f7b4770b891694b32101c59ddd4be4ef0ddd9a4da58c145c1a6
- F src/os_win.c 964165b66cde03abc72fe948198b01be608436894732eadb94c8720d2467f223
+ F src/os_unix.c 3984fc069df59e26f000e30609611cecdb4e93293e6ee52313a473a7e874af1b
+ F src/os_win.c 5c802f05e706c87c6e4cc6e9527f3364c7a7178458f93dffa5e19ac2e8eef9c1
  F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
- F src/pager.c 94a8f8f56a5c643128a766c41c79af185ccb49eb7348acf52b040267aacbaa19
- F src/pager.h 403b7d242616f8742ec149ede4a06b3e66896c554ce09c2abeddb926fdd1b707
 -F src/pager.c 2aa56a99bb13128d9102e84c7a9f835e546cbb58f0861d481bc3db32973b1628
 -F src/pager.h 581698f2177e8bd4008fe4760898ce20b6133d1df22139b9101b5155f900df7a
 -F src/parse.y 52ef3cecd0934e9da4a45b585883a03243ad615d338ad94f44501a05891dcdfa
++F src/pager.c 84e90e0acee15766840f89b8be6f14322de16396d9229c494fec6c1cc03a69cf
++F src/pager.h 72e1a29470f2c2ad482ce944f61c7818098a842740d94c2bd167f348da4fdbac
 +F src/parse.y bcd8c5d9442518887df1fc9c35d454126927f705ae262cd3981c16bf297e910e
- F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870
- F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11
- F src/pcache1.c ad5bc71727c2e825dcbf342413e1b4b09ed8520cd83903671e8bd03bc30b4c98
- F src/pragma.c a4e5028dfc8af4c5c347cd0e91bd2f0c0f81fcd9b2c6e0acf8da7da51df7f1fe
+ F src/pcache.c 4bada070456980c3c1f16d58ec2e64e389ad77b935e3d77e0c96e7bbd397289c
+ F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
+ F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
+ F src/pragma.c d04725ac25387d9638919e197fb009f378e13af7bf899516979e54b3164e3602
  F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
  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 c9b3d8444bbf6f167d84f41ca6f3672e2521cb163a8c706b19058dc82fffe9b8
- F src/shell.c 117305aab365a0448505d8cfcc27d58b0182ea314f0201bd26c340a5717419a4
- F src/shell.c.in af3fb9eabdc0a95beace2f760597d213be0988c974eca116208eb220cd24469c
- F src/sqlite.h.in 8d2f6ea62113defeac791fdbdaef5ab0d4576dbde4fa076fc2773b7927fb6e38
+ F src/select.c 9fa0db382f43217e207a145b8c6cec26e85cd1a42a8428ee8b3df5870dfea0f4
+ F src/shell.c c1206a23d9239f8f51751d3be9b8c3b02fa4103546bea1add7f864d84a8276ab
+ F src/shell.c.in bb9720a8c5c98d3984b16ab7540e7142bcae959666ecf248bfc523a1d44220ee
 -F src/sqlite.h.in ab4f8a29d1580dfaeb6891fa1b83cff8229ba0daa56994707ceaca71495d9ab7
++F src/sqlite.h.in e0c351ad6d4449aebcb10735ed23ef3104732179415d15cd8cd2f12257420ce3
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h a1fd3aa82f967da436164e0728a7d6841651fd0c6e27b9044e0eb9f6c8462e47
- F src/sqliteInt.h 7a7f342f654805f3ad150fb6e3b4d1a08198830797e7230138847d45fe2093e8
 -F src/sqliteInt.h 12aa1f626b3209ffa6a50d9d1e6b4235abd33273a0fcbfeedb66f573a68932b9
++F src/sqliteInt.h 6027f4fb80408f945e6b7b02f0112721ae3dbb0419d5122795cb512f920dca32
  F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
- F src/status.c 90450a491f3f59f6978ca9832023c31238f592064e405eeda971f3c0829564eb
+ F src/status.c 9737ed017279a9e0c5da748701c3c7bf1e8ae0dae459aad20dd64fcff97a7e35
  F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
  F src/tclsqlite.c 487951d81f9704800fd9f0ffdaa2f935a83ccb6be3575c2c4ef83e4789b4c828
- F src/test1.c 41d8a3bfe6dfd6dee8405ff1fcba6301cb9ca497d5299778ded2c5d8d85f58de
 -F src/test1.c a947b2554fa77d0ef2dd21d1ef08e37e5d91b17af83de923a4e3c7f10957a2eb
++F src/test1.c 00a0a80a8af8ac53326ea83632b35a0c5d746e369cbaaf8f0e6392394913d309
  F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5
  F src/test3.c b8434949dfb8aff8dfa082c8b592109e77844c2135ed3c492113839b6956255b
  F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6
@@@ -483,10 -481,10 +485,10 @@@ F src/test9.c 12e5ba554d2d1cbe0158f6ab3
  F src/test_async.c 195ab49da082053fdb0f949c114b806a49ca770a
  F src/test_autoext.c 915d245e736652a219a907909bb6710f0d587871
  F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0
- F src/test_bestindex.c d23f80d334c59662af69191854c76b8d3d0c8c96
+ F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857
  F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce
  F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274
 -F src/test_config.c abf6fc1fe9d041b699578c42e3db81f8831c4f5b804f1927958102ee8f2b773e
 +F src/test_config.c 2b795b99d13060aae571b7a4c2732eee1c9f0d3431974b8c05d6a40342599411
  F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f
  F src/test_demovfs.c a0c3bdd45ed044115c2c9f7779e56eafff18741e
  F src/test_devsym.c 1960abbb234b97e9b920f07e99503fc04b443f62bbc3c6ff2c2cea2133e3b8a2
@@@ -526,26 -524,26 +528,26 @@@ F src/treeview.c 2ee4a5dada213d5ab08a74
  F src/trigger.c 48e0f7ed6749ce4d50a695e09e20ce9cf84ecabf2691852c965a51e0b620eccc
  F src/update.c 5404be9e840717323a69209190cdbc9d0d34adaedaaf1d1a1069babf2c4171c0
  F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
- F src/util.c 773843506ce694714bc96fe67c30c37015f90ef515d0e70f1f8d5c9c24088152
+ F src/util.c 5168013cfd937a695d23cce8c67cb07a3dda242d4cb812530ba1148b88e0f159
 -F src/vacuum.c 90839322fd5f00df9617eb21b68beda9b6e2a2937576b0d65985e4aeb1c53739
 -F src/vdbe.c 176c0897af0aedecd3abc9afaf7fa80eaa7cf5eaf62583de256a9961df474373
 +F src/vacuum.c 07eec96f821c7dcbdca2fadffc6e38ea2c24bf409fcb15fe9fb3ac444d632dfe
- F src/vdbe.c 5d1f7944ffbfe25eb6d697d68ed80ef8f819b35da098908d3056be9968b7a745
++F src/vdbe.c 96467c73f53c3cb2b3ad7a73c69d59fb43966d772a7fc70114dde14cf3876dd0
  F src/vdbe.h d50cadf12bcf9fb99117ef392ce1ea283aa429270481426b6e8b0280c101fd97
  F src/vdbeInt.h 1fe00770144c12c4913128f35262d11527ef3284561baaab59b947a41c08d0d9
  F src/vdbeapi.c 9c670ca0dcc1cd86373aa353b747b26fe531ca5cd4331690c611d1f03842e2a1
- F src/vdbeaux.c 410ba18e53851bd09c83b25188195cdb38c6360116dbc885329cfc5dabf48faa
- F src/vdbeblob.c db3cf91060f6f4b2f1358a4200e844697990752177784c7c95da00b7ac9f1c7b
- F src/vdbemem.c 2f9d672af5260f0145787e1dc2c6985414987cc0dc575133a0dc17dda767d868
 -F src/vdbeaux.c 831a77aaa7aa43005f1c9bf3e9eb6506f4865e1cf99943ccdcd3be5d2dd8a3c7
++F src/vdbeaux.c 09f1fadf5a61753b97d98354f6a940ee770a0c239f570c172062ac771108d620
+ F src/vdbeblob.c 635a79b60340a6a14a622ea8dcb081f0a66b1ac3836870c587f232eec08c0286
+ F src/vdbemem.c 043f9fdbb19d4857d5ac9c1ff60b972da9397e51c1a3d5ff43e8b6b4ae552aaf
  F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f
  F src/vdbetrace.c 48e11ebe040c6b41d146abed2602e3d00d621d7ebe4eb29b0a0f1617fd3c2f6c
  F src/vtab.c f1d5c23132fb0247af3e86146404112283ddedb6c518de0d4edc91cfb36970ef
  F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 -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 d246d19f5453d3f154ed8fcea892ce6d70ae4a5ddaebae34bd49d73f4c913bc7
- F src/whereexpr.c fe1fe600d7334e91f3d9d487021362d543fba8ab2f1be5e0d68063d619379c05
+ F src/where.c 21eea981920a13fd3c0ac3d6c128d0a34b22cbec064e4f0603375fe1ffe26ca6
+ F src/whereInt.h 82c04c5075308abbac59180c8bad5ecb45b07453981f60a53f3c7dee21e1e971
+ F src/wherecode.c e8c2ece5843ea56e6c90277d421f2d628f3f7b7c976642369cc519f008e1d2b1
+ F src/whereexpr.c 4953ca4e769c047d0a00a1ba9085849626b1f3a6e89f6befcf5c38fa0722acdd
  F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
  F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
  F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
@@@ -1662,7 -1655,7 +1666,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 c3fe1f4b7e8dcadcb516622719d000b808effe3ad497244ba44f57d52dc2cc08 64a8ae68381b7fbb29b659901ca7ce8d50510e4753758d5761f7e41539288cef
- R eb725478e3f2e12486ea89d9d4b34aaa
 -P 5d03c738e93d36815248991d9ed3d62297ba1bb966e602e7874410076c144f43
 -R af25328b1412b5532988e49269e8bcab
--U drh
- Z c5d300513f55dd3f5d74222bd7b7dcdc
 -Z d8a9f78bca4ad7573c0a5dc3ae2ffff1
++P d53108e76307fb24ef1d8f75fe82c180f5588ad8e65eeceace92f4cecadfa452 0a12915b373cd0491a58d8f7a645711c620c70efced623e6b40aa01f23284157
++R 5b090dbbf85dc5792098185268ac7c8f
++U dan
++Z 51723e9e7fe6c543a37219e2d01ad740
diff --cc manifest.uuid
index 49fc7ad80ff3cbf23648a34e46a88fbf8cb29532,d2fde797c58010fcd396bbab4fe08b932883e3b8..f7b69a87af2b0e845f52e2f9ec1fc72bdece1576
@@@ -1,1 -1,1 +1,1 @@@
- d53108e76307fb24ef1d8f75fe82c180f5588ad8e65eeceace92f4cecadfa452
 -0a12915b373cd0491a58d8f7a645711c620c70efced623e6b40aa01f23284157
++307b802e8627c93a51e4c54851a4fab33db5061bb80e3d327ce53b127d6d511b
diff --cc src/btree.c
index d95b3d9167f7310e49e8d9db032b963fdf8813ae,a1b125dda89593f39568caf421ac871ae2e0fbdd..c90c25f314934eff26c5ecc881c214452a52afec
@@@ -439,203 -439,8 +439,204 @@@ static void downgradeAllSharedCacheTabl
  
  #endif /* SQLITE_OMIT_SHARED_CACHE */
  
 -static void releasePage(MemPage *pPage);         /* Forward reference */
 +#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 releasePageOne(MemPage *pPage);      /* Forward reference */
  static void releasePageNotNull(MemPage *pPage);  /* Forward reference */
  
  /*
diff --cc src/build.c
Simple merge
diff --cc src/main.c
Simple merge
diff --cc src/pager.c
Simple merge
diff --cc src/pager.h
Simple merge
diff --cc src/sqlite.h.in
Simple merge
diff --cc src/sqliteInt.h
Simple merge
diff --cc src/test1.c
index 536e2fb5e49d8ab39cb8f29358bcfc29cff19ba3,d70ce77a7a1175eb0abfe128db012831b6199fcd..75645e2de756427944b18367865935dbf3990046
@@@ -7415,41 -7415,35 +7415,70 @@@ static int SQLITE_TCLAPI test_dbconfig_
    }
  }
  
 +/*
 +** Usage: sqlite3_wal_info DB DBNAME
 +*/
 +static int SQLITE_TCLAPI test_wal_info(
 +  void * clientData,
 +  Tcl_Interp *interp,
 +  int objc,
 +  Tcl_Obj *CONST objv[]
 +){
 +  int rc;
 +  sqlite3 *db;
 +  char *zName;
 +  unsigned int nPrior;
 +  unsigned int nFrame;
 +
 +  if( objc!=3 ){
 +    Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME");
 +    return TCL_ERROR;
 +  }
 +  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
 +  zName = Tcl_GetString(objv[2]);
 +
 +  rc = sqlite3_wal_info(db, zName, &nPrior, &nFrame);
 +  if( rc!=SQLITE_OK ){
 +    Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
 +    return TCL_ERROR;
 +  }else{
 +    Tcl_Obj *pNew = Tcl_NewObj();
 +    Tcl_ListObjAppendElement(interp, pNew, Tcl_NewWideIntObj((i64)nPrior));
 +    Tcl_ListObjAppendElement(interp, pNew, Tcl_NewWideIntObj((i64)nFrame));
 +    Tcl_SetObjResult(interp, pNew);
 +  }
 +  return TCL_OK;
 +}
 +
+ /*
+ ** Usage: sqlite3_mmap_warm DB DBNAME
+ */
+ static int SQLITE_TCLAPI test_mmap_warm(
+   void * clientData,
+   Tcl_Interp *interp,
+   int objc,
+   Tcl_Obj *CONST objv[]
+ ){
+   extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**);
+   extern int sqlite3_mmap_warm(sqlite3 *db, const char *);
+   if( objc!=2 && objc!=3 ){
+     Tcl_WrongNumArgs(interp, 1, objv, "DB ?DBNAME?");
+     return TCL_ERROR;
+   }else{
+     int rc;
+     sqlite3 *db;
+     const char *zDb = 0;
+     if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
+     if( objc==3 ){
+       zDb = Tcl_GetString(objv[2]);
+     }
+     rc = sqlite3_mmap_warm(db, zDb);
+     Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
+     return TCL_OK;
+   }
+ }
  /*
  ** Register commands with the TCL interpreter.
  */
@@@ -7719,9 -7713,9 +7748,10 @@@ int Sqlitetest1_Init(Tcl_Interp *interp
       { "sqlite3_snapshot_open_blob", test_snapshot_open_blob, 0 },
       { "sqlite3_snapshot_cmp_blob", test_snapshot_cmp_blob, 0 },
  #endif
 -     { "sqlite3_delete_database", test_delete_database,    0 },
 -     { "atomic_batch_write",      test_atomic_batch_write, 0 },
 +     { "sqlite3_delete_database", test_delete_database, 0 },
 +     { "sqlite3_wal_info", test_wal_info, 0 },
 +     { "atomic_batch_write",      test_atomic_batch_write,     0   },
+      { "sqlite3_mmap_warm",       test_mmap_warm,          0 },
    };
    static int bitmask_size = sizeof(Bitmask)*8;
    static int longdouble_size = sizeof(LONGDOUBLE_TYPE);
diff --cc src/vdbe.c
Simple merge
diff --cc src/vdbeaux.c
Simple merge