- C Merge\srecent\senhancements\sfrom\strunk.
- D 2019-03-26T12:07:23.219
-C Use\sa\smutex-free\sPRNG\sfor\sthe\srandom()\sand\srandomblob()\sSQL\sfunctions\sand\sfor\nthe\srandomness\sused\sduring\scheckpoint\soperations.
-D 2017-09-09T08:03:28.579
-F Makefile.in c644bbe8ebe4aae82ad6783eae6b6beea4c727b99ff97568b847ced5e2ac7afb
++C Use\sthe\smutex-free\sPRNG\sin\sthis\sbranch,\ssince\sanybody\susing\sthis\sbranch\sis\nprobably\sinterested\sin\shigh\sconcurrency.
++D 2019-03-26T14:04:43.408
+F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
+F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
+F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
+F Makefile.in 236d2739dc3e823c3c909bca2d6cef93009bafbefd7018a8f3281074ecb92954
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
-F Makefile.msc 6a7a74bf60ad395098c0bd175ab054cd65ef85d7f034198d52bcc4d9e5fb4c6b
-F README.md f5c87359573c4d255425e588a56554b50fdcc2afba4e017a2e02a43701456afd
-F VERSION f81232df28e2d3ff049feefad5fbd5489cc33697f6bd2ecf61af7f0dde3b83d0
+F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72
+F README.md ebcdb6d5656020ef5ca37a6fc1ad89b4c80560ea33a3d70c250f9b845cf9da62
+F VERSION 288d756b1b7be03ecdbf1795c23af2c8425f2e46ba6979a14ef53360308f080d
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
-F src/alter.c cf7a8af45cb0ace672f47a1b29ab24092a9e8cd8d945a9974e3b5d925f548594
-F src/analyze.c 0d0ccf7520a201d8747ea2f02c92c26e26f801bc161f714f27b9f7630dde0421
-F src/attach.c 07b706e336fd3cedbd855e1f8266d10e82fecae07daf86717b5760cd7784c584
-F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73
-F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b
-F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
-F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca
-F src/btree.c 1c2b2f1714c411d7a9bc52c90d9dd7eab261261d5691ac0f67e1ced92419799c
-F src/btree.h 32ef5d3f25dc70ef1ee9cecf84a023c21378f06a57cd701d2e866e141b150f09
-F src/btreeInt.h 55b702efce17e5d1941865464227d3802cfc9c7c832fac81d4c94dced47a71fc
-F src/build.c e71e96a67daf3d1dd23188423e66cd6af38017e2ec73fead5d2b57da2d3c7e16
-F src/callback.c 28a8ede982fde4129b828350f78f2c01fe7d12c74d1a0a05d7108ab36f308688
+F src/alter.c 25f54387121a0c5fd0f49b299f4070c81af8f26a84edaae6de679c4e4b71b1ff
+F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644
+F src/attach.c 732d45dbf802b79f66503614a23e862887231d4d4937eac7c28a92c6fdb78e1f
+F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df
+F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
+F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806
+F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
+F src/btree.c b8d297f81e69bdb52e405d4ba3dca62c02e1421120309fb1ceef0e05f5eece55
+F src/btree.h f5c65a8c7ce7d3c493ab5ee4d35ea95610422362d3d207993b05804d2bbcc17c
+F src/btreeInt.h 9d7f00ca9402f5e881e30eeba1e65814be8544284d59bd843419b6f73b761730
+F src/build.c 1d5dc39cb3fd437c8031c13f52f600b1541977ea68fe1c29bf200ceb22217d0f
+F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
-F src/ctime.c ff1be3eed7bdd75aaca61ca8dc848f7c9f850ef2fb9cb56f2734e922a098f9c0
-F src/date.c 48f743d88bbe88f848532d333cca84f26e52a4f217e86f86be7fc1b919c33d74
-F src/dbstat.c 7a4ba8518b6369ef3600c49cf9c918ad979acba610b2aebef1b656d649b96720
-F src/delete.c 21a5f1812fdb599e9f7afb9f650bdabab60a3afd51d7e94e539c982f647b0023
-F src/expr.c 0f611840217016cf2c5e72f2eb8e412e48511bf740ae1fd5b58dc5e409c6e738
+F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b
+F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
+F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
+F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319
+F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf
+F src/expr.c f2d0ecf68213770be4fad83128ce02e67667deebaa0a44061313f7e4f2a4ae28
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
-F src/fkey.c 5ff2c895fe087756d8085dc1a9bc229b5670e2a65c3929dd87c71e43649af333
-F src/func.c 8c46246dcb5779e77bf2ef192fa1355460aeec1d3d0b2537608d319bcd7d8778
-F src/global.c ac3094f1dc59fbeb919aef7cc0cc827a8459d1fb1adb7972ef75bd9e0c10b75b
+F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765
- F src/func.c 2ccf4ae12430b1ae7096be5f0675887e1bd0732828af0ac0f7496339b7c6edee
++F src/func.c 88df51f4be9d0af49aaac61fc25a690ebfc0ac6ced0103bc6c11a62d5c920fde
+F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec
F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a
F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
-F src/insert.c d2d1bf12d2b5382450620d7cede84c7ffe57e6a89fa9a908f1aba68df2731cd9
-F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
-F src/loadext.c 20865b183bb8a3723d59cf1efffc3c50217eb452c1021d077b908c94da26b0b2
-F src/main.c cd03aeca7a9d5f221010d0212b3abdd558e37a317947f8e78dd9162a5d904223
-F src/malloc.c a02c9e69bc76bee0f639416b947a946412890b606301454727feadcb313536d6
+F src/insert.c 4ce12b5ba3bcbfa17ec37ce960d499fc287b6289df2c00b31201f716a3c7df45
+F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
+F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6
- F src/main.c 11fd9cce33051f1ea384fe1f822a4a3217cf9853c3a0fd0c227b5a41034267c3
++F src/main.c 55e27d7776baba49ef823ba323828a011560ae424df1c01d737c1111f0fc3f48
+F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3
F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a
F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944
+F src/memdb.c 02a5fcec19b9d40dd449ca802dc1b2e8f93f255fbf2a886277a3c3800d8d35db
F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661
F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81
-F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c
+F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604
F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85
F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4
-F src/mutex_unix.c 27bb6cc49485ee46711a6580ab7b3f1402211d23
-F src/mutex_w32.c a898fa969823b100c0f5fdc57e54c9a1e419ab4d
+F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58
+F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235
F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7
-F src/os.c 93e0979b9b55df29c0c4923f73b48e9d3fe728f01dd8ed4f6a9d2f1d79779bc8
-F src/os.h 8e976e59eb4ca1c0fca6d35ee803e38951cb0343
+F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de
+F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432
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 86eca42c3d955bebea0082450f978e5633448235f03f86b27a02538bb26e7fff
+F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
-F src/pager.c 967168bba88d2dc790ed9618bd4ba7bfe475b67b521ef6da305a6425c592928f
-F src/pager.h 581698f2177e8bd4008fe4760898ce20b6133d1df22139b9101b5155f900df7a
-F src/parse.y 52ef3cecd0934e9da4a45b585883a03243ad615d338ad94f44501a05891dcdfa
-F src/pcache.c 4bada070456980c3c1f16d58ec2e64e389ad77b935e3d77e0c96e7bbd397289c
-F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
-F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
-F src/pragma.c faf5f9ec553b71035c63e08d31651bbd28bec826d546b32c8e9c295855ca3605
-F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
-F src/prepare.c 9a141a1b02dca53beaa9771699d390aafcac01f5d1f1c0ae6e23ded8dcdb709a
-F src/printf.c 40aee47ae9be4bd3dbdc8968bd07fddc027be8edec8daddf24d3391d36698a1c
+F src/pager.c 210fdaa3b907a86163b6ec116cd63e8de9e184cfa4ed6fabee3e9cce76260a0c
+F src/pager.h 389ba8f526d13026aa7081dc581aa742eb7207e3277e7106c522c5b65ad92590
+F src/parse.y e53f90120fc1c47bfdf2a0894e6ffe0d06f757dbd61eacaaa1731334a1cf08fa
+F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee
+F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
+F src/pcache1.c a72804486dfa8e4b6bc30d666c97ecf1155f91a4351fc6e48ea4097e4eb304fb
+F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02
+F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177
+F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3
+F src/printf.c 93a3d539019264683a444bc043c875e9a6cca43fe935ae7bf6cfff0af3bba118
- F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
+ F src/random.c f27af4099afaea7284ade5c206224dcfdb2334cfd119d018b470d46356b3f27d
-F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20
-F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
-F src/select.c 5bda89e7cda69ef9cdd25c98ee6403ed2a3753d5ab135e24fc7a20344fd68d0a
-F src/shell.c c1206a23d9239f8f51751d3be9b8c3b02fa4103546bea1add7f864d84a8276ab
-F src/shell.c.in bb9720a8c5c98d3984b16ab7540e7142bcae959666ecf248bfc523a1d44220ee
-F src/sqlite.h.in 21f62793a3611b43f6fb31f0a4c8b38489a4df025416e9b7db7cc01bf5ef5aaa
+F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2
+F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
- F src/select.c 9263f5c30dd44c7ac2eb29f40a7ec64322a96885b71c00de6bc30b756c2e1c49
++F src/select.c baeeee1b5e102a765ecc36812f1ab4fbf719b58265e8cc7f6dace15cc8564643
+F src/shell.c.in c1986496062f9dba4ed5b70db06b5e0f32e1954cdcfab0b30372c6c186796810
+F src/sqlite.h.in 491a9fca996e30b210244f786e062c3513ecf7d0450f93c06a5484f60a10df6a
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
-F src/sqlite3ext.h a1fd3aa82f967da436164e0728a7d6841651fd0c6e27b9044e0eb9f6c8462e47
-F src/sqliteInt.h 63e64c24f19910f52d2910f000b070a027fad42d134055970c98c18a76584fce
+F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683
- F src/sqliteInt.h 92b02dacddecf03445cadb7a9f00920fc46b09d9e56375eb9178e1267362edcc
++F src/sqliteInt.h 45163c961e66e31cdae606971663c5ed6ea6a42c8c91988a7d4db6f0cbc75add
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
-F src/status.c 9737ed017279a9e0c5da748701c3c7bf1e8ae0dae459aad20dd64fcff97a7e35
+F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
-F src/tclsqlite.c 487951d81f9704800fd9f0ffdaa2f935a83ccb6be3575c2c4ef83e4789b4c828
-F src/test1.c 8513b17ca4a7a9ba28748535d178b6e472ec7394ae0eea53907f2d3bcdbab2df
+F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424
+F src/test1.c cad83b2785073d6566f42ea22a7217988f63e9ae61d2034cc870291a50188a24
F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5
-F src/test3.c b8434949dfb8aff8dfa082c8b592109e77844c2135ed3c492113839b6956255b
+F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644
F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6
F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d
F src/test6.c e8d839fbc552ce044bec8234561a2d5b8819b48e29548ad0ba400471697946a8
F src/test_sqllog.c 11e6ce7575f489155c604ac4b439f2ac1d3d5aef
F src/test_superlock.c 4839644b9201da822f181c5bc406c0b2385f672e
F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939
+F src/test_tclsh.c 06317648b0d85a85fd823f7973b55535c59a3156c1ef59394fe511f932cfa78d
F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc
F src/test_thread.c 911d15fb14e19c0c542bdc8aabf981c2f10a4858
-F src/test_vfs.c f0186261a24de2671d080bcd8050732f0cb64f6e
+F src/test_vfs.c c6c6a58f66b26876c7b5769fb323a58b2c7120299b5084e7212c4116f902cbaa
F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698
-F src/test_windirent.c 17f91f5f2aa1bb7328abb49414c363b5d2a9d3ff
-F src/test_windirent.h 5d67483a55442e31e1bde0f4a230e6e932ad5906
+F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1
+F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a90484215
+F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
-F src/tokenize.c 1003d6d90c6783206c711f0a9397656fa5b055209f4d092caa43bb3bf5215db5
-F src/treeview.c 2ee4a5dada213d5ab08a742af5c876cee6f1aaae65f10a61923f3fb63846afef
-F src/trigger.c 48e0f7ed6749ce4d50a695e09e20ce9cf84ecabf2691852c965a51e0b620eccc
-F src/update.c 5404be9e840717323a69209190cdbc9d0d34adaedaaf1d1a1069babf2c4171c0
+F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e
+F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d
+F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73
+F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1
+F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
-F src/util.c 773843506ce694714bc96fe67c30c37015f90ef515d0e70f1f8d5c9c24088152
-F src/vacuum.c 90839322fd5f00df9617eb21b68beda9b6e2a2937576b0d65985e4aeb1c53739
-F src/vdbe.c 82fc4553a0986a06bdd0d2b03a424e159bba5c74802fabb2841aa6cd27ccd962
-F src/vdbe.h d50cadf12bcf9fb99117ef392ce1ea283aa429270481426b6e8b0280c101fd97
-F src/vdbeInt.h 1fe00770144c12c4913128f35262d11527ef3284561baaab59b947a41c08d0d9
-F src/vdbeapi.c 9c670ca0dcc1cd86373aa353b747b26fe531ca5cd4331690c611d1f03842e2a1
-F src/vdbeaux.c 2dff8186d34e0e525838f77b2fac70bd480f0273a77015bf21b6a08f2792da82
-F src/vdbeblob.c db3cf91060f6f4b2f1358a4200e844697990752177784c7c95da00b7ac9f1c7b
-F src/vdbemem.c 2f9d672af5260f0145787e1dc2c6985414987cc0dc575133a0dc17dda767d868
-F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f
-F src/vdbetrace.c 48e11ebe040c6b41d146abed2602e3d00d621d7ebe4eb29b0a0f1617fd3c2f6c
-F src/vtab.c f1d5c23132fb0247af3e86146404112283ddedb6c518de0d4edc91cfb36970ef
+F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432
+F src/vacuum.c 146227098f17c14067e7ba893e9645e439e7a9dc12f30e60c131bceed30ee842
+F src/vdbe.c 2abbb53b9fdd06db476d40f5c2e285a5172ecde602038544fcfbe7c7dec3fea2
+F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237
+F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f
+F src/vdbeapi.c 7a052df80d7e2e55382076174633e888f21fe200feb5d49b1b441b4c38ab851a
+F src/vdbeaux.c 8152a4f732f55fadab542d4801349fc029e422e0639e2864b0a7a9eb29883861
+F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
+F src/vdbemem.c 3e89e087df928eba80e520824078dc563c579a0848b1557ac36845ec14392923
+F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
+F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
+F src/vtab.c 2462b7d6fd72b0b916477f5ef210ee49ab58cec195483ebdac0c8c5e3ec42cab
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
- F src/wal.c 2d5771a64354e7a7ef926a38fec8c06193a50fda40cee027c5385c3330abb791
-F src/wal.c 2a205ec9c9be4e4b2933d32481c4654b4c6b644d8a6c755a5f8c7a10ade64616
-F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a
-F src/walker.c 3ccfa8637f95355bff61144e01a615b8ef26f79c312880848da73f03367da1e6
-F src/where.c 101f0a645c45c12141b38a61b593232555fc001bf7786dcb03eb8f313783b404
-F src/whereInt.h 93bb90b77d39901eda31b44d8e90da1351193ccfe96876f89b58a93a33b84c3d
-F src/wherecode.c d246d19f5453d3f154ed8fcea892ce6d70ae4a5ddaebae34bd49d73f4c913bc7
-F src/whereexpr.c fe1fe600d7334e91f3d9d487021362d543fba8ab2f1be5e0d68063d619379c05
++F src/wal.c 9ad123ad4695cf5883d03754b9b32a2267b1bdc95857059781c575fc796ce8b2
+F src/wal.h ac2100eeda406a4492b8c183154507532d23ab9d5a8e32e208adfe4f9ea554f9
+F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4
+F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799
+F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
+F src/wherecode.c 6fa4056c5ce019e4a8af33795906340176813cb3c1236f4b7b08df76a1b6287b
+F src/whereexpr.c 90859652920f153d2c03f075488744be2926625ebd36911bcbcb17d0d29c891c
+F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6
F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95
F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1
-F test/colname.test c47639d26cbeba6977457e5ef2c2c55c5b6c889478dd7eb0ed858ba894e7fa93
-F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db
+F test/colname.test fb28b3687e03625425bc216edf8b186ce974aa71008e2aa1f426a7dcb75a601d
+F test/concfault.test e5370cd686f601a01909377cac3bbf13dac56d39dd4ad6b04ccbec9eeeaccb18
+F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5
- F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8
++F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a
+F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081
+F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44
+F test/concurrent5.test 0c16cbf7446af162a14e6def30445e94016064eb994e5aa4ebb2bebc59554176
+F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67
+F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d
+F test/conflict.test c7cc007e2af151516ddf38f7412fe10d473a694f55e3df437e2c7b31c2590e8d
F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c
F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9
F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P fdbf97e611ed23f86dc0df9d53421fb04226af0d1c7171d55c11acd0dbe935f0 fade103cbac1b067f9544935b767f36dc266aceb3269cc84a3ae3b04ad9a4823
- R 02cf99f4a9759681a4a5b82ef3497834
-P faa22e29a5a05a16d46a428d838acedfa7d6fad6239495d59a6a1f4764e1b1b6
-R a52f584275f92dc78c3958a57a4f1fc7
-T *branch * mutex-free-randomness
-T *sym-mutex-free-randomness *
-T -sym-trunk *
++P 774d0d5288afb75f26d95be2177f0ff362eec6b4be7ba72c49c8e047a8cbd210 e63d1a7cd317811f74d206ae47bd11a8fc6b6311218fbc6d0cbf49e8281b362f
++R 922e87f1c7062cb368131966793aa2e6
U drh
- Z e0f5f34ff03b8e46504ce9a2c1f5821a
-Z fc9d4eaa55f9d67c6518af204f0991ab
++Z 099bd251e2e74502c28de2e6a4841a18
--- /dev/null
- do_execsql_test 8.1 {
- PRAGMA journal_mode = wal;
- CREATE TABLE kv(k INTEGER PRIMARY KEY, v UNIQUE);
- INSERT INTO kv VALUES(NULL, randomblob(750));
- INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
- INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
- INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
- INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
- INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
- DELETE FROM kv WHERE rowid%2;
- PRAGMA freelist_count;
- } {wal 34}
+# 2015 July 26
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# Miscellaneous tests for transactions started with BEGIN CONCURRENT.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/lock_common.tcl
+source $testdir/wal_common.tcl
+set ::testprefix concurrent2
+
+ifcapable !concurrent {
+ finish_test
+ return
+}
+
+do_multiclient_test tn {
+
+ do_test 1.$tn.1 {
+ sql1 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE t1(x);
+ CREATE TABLE t2(y);
+ }
+ } {wal}
+ do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok}
+
+ # Test that an CONCURRENT transaction that allocates/frees no pages does
+ # not conflict with a transaction that does allocate pages.
+ do_test 1.$tn.2 {
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t1 VALUES(4);
+ }
+ sql2 {
+ INSERT INTO t2 VALUES(randomblob(1500));
+ }
+ sql1 {
+ COMMIT;
+ }
+ } {}
+ do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok}
+
+ # But that an CONCURRENT transaction does conflict with a transaction
+ # that modifies the db schema.
+ do_test 1.$tn.3 {
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t1 VALUES(5);
+ }
+ sql2 {
+ CREATE TABLE t3(z);
+ }
+ list [catch { sql1 COMMIT } msg] $msg
+ } {1 {database is locked}}
+ do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok}
+
+ # Test that an CONCURRENT transaction that allocates at least one page
+ # does not conflict with a transaction that allocates no pages.
+ do_test 1.$tn.4 {
+ sql1 {
+ ROLLBACK;
+ BEGIN CONCURRENT;
+ INSERT INTO t1 VALUES(randomblob(1500));
+ }
+ sql2 {
+ INSERT INTO t2 VALUES(8);
+ }
+ sql1 {
+ COMMIT;
+ }
+ } {}
+
+ do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok}
+}
+
+do_multiclient_test tn {
+ do_test 2.$tn.1 {
+ sql1 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE t1(x UNIQUE);
+ CREATE TABLE t2(y UNIQUE);
+ }
+ } {wal}
+
+ do_test 2.$tn.2 {
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t1 VALUES(randomblob(1500));
+ }
+ sql2 {
+ INSERT INTO t2 VALUES(randomblob(1500));
+ }
+ sql1 COMMIT
+ } {}
+
+ do_test 2.$tn.3 { sql3 { PRAGMA integrity_check } } {ok}
+
+ do_test 2.$tn.4 {
+ sql1 {
+ BEGIN CONCURRENT;
+ DELETE FROM t1;
+ }
+ sql2 {
+ DELETE FROM t2;
+ }
+ sql1 COMMIT
+ } {}
+
+ do_test 2.$tn.5 { sql3 { PRAGMA integrity_check } } {ok}
+
+ do_test 2.$tn.6 {
+ sql1 {
+ INSERT INTO t1 VALUES(randomblob(1500));
+ INSERT INTO t1 VALUES(randomblob(1500));
+ INSERT INTO t2 VALUES(randomblob(1500));
+ DELETE FROM t1 WHERE rowid=1;
+ }
+
+ sql1 {
+ BEGIN CONCURRENT;
+ DELETE FROM t1 WHERE rowid=2;
+ }
+
+ sql2 {
+ DELETE FROM t2;
+ }
+
+ sql1 COMMIT
+ } {}
+
+ do_test 2.$tn.7 { sql3 { PRAGMA integrity_check } } {ok}
+}
+
+#-------------------------------------------------------------------------
+# When an CONCURRENT transaction is opened on a database, the nFree and
+# iTrunk header fields of the cached version of page 1 are both set
+# to 0. This allows an CONCURRENT transaction to use its own private
+# free-page-list, which is merged with the main database free-list when
+# the transaction is committed.
+#
+# The following tests check that nFree/iTrunk are correctly restored if
+# an CONCURRENT transaction is rolled back, and that savepoint rollbacks
+# that occur within CONCURRENT transactions do not incorrectly restore
+# these fields to their on-disk values.
+#
+reset_db
+do_execsql_test 3.0 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE t1(x, y);
+ INSERT INTO t1 VALUES(randomblob(1500), randomblob(1500));
+ DELETE FROM t1;
+} {wal}
+
+do_execsql_test 3.1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t1 VALUES(1, 2);
+ ROLLBACK;
+}
+
+do_execsql_test 3.2 { PRAGMA integrity_check } {ok}
+do_execsql_test 3.3 { PRAGMA freelist_count } {2}
+
+do_execsql_test 3.4.1 {
+ BEGIN CONCURRENT;
+ PRAGMA freelist_count;
+} {2}
+do_execsql_test 3.4.2 {
+ SAVEPOINT xyz;
+ INSERT INTO t1 VALUES(randomblob(1500), NULL);
+ PRAGMA freelist_count;
+} {0}
+do_execsql_test 3.4.3 {
+ ROLLBACK TO xyz;
+} {}
+do_execsql_test 3.4.4 { PRAGMA freelist_count } {0}
+do_execsql_test 3.4.5 { COMMIT; PRAGMA freelist_count } {2}
+do_execsql_test 3.4.6 { PRAGMA integrity_check } {ok}
+
+do_execsql_test 3.5.1 {
+ BEGIN CONCURRENT;
+ UPDATE t1 SET x=randomblob(10) WHERE y=555;
+ PRAGMA freelist_count;
+} {0}
+do_execsql_test 3.5.2 {
+ ROLLBACK;
+ PRAGMA freelist_count;
+} {2}
+do_execsql_test 3.5.3 { PRAGMA integrity_check } {ok}
+
+#-------------------------------------------------------------------------
+# Test that nothing goes wrong if an CONCURRENT transaction allocates a
+# page at the end of the file, frees it within the same transaction, and
+# then has to move the same page to avoid a conflict on COMMIT.
+#
+do_multiclient_test tn {
+ do_test 4.$tn.1 {
+ sql1 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE t1(x);
+ CREATE TABLE t2(x);
+ }
+ } {wal}
+
+ do_test 4.$tn.2 {
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t1 VALUES(randomblob(1500));
+ INSERT INTO t1 VALUES(randomblob(1500));
+ DELETE FROM t1 WHERE rowid = 1;
+ }
+
+ sql2 {
+ INSERT INTO t2 VALUES(randomblob(1500));
+ INSERT INTO t2 VALUES(randomblob(1500));
+ INSERT INTO t2 VALUES(randomblob(1500));
+ INSERT INTO t2 VALUES(randomblob(1500));
+ DELETE FROM t2 WHERE rowid IN (1, 2);
+ }
+
+ sql1 COMMIT
+ } {}
+}
+
+#-------------------------------------------------------------------------
+#
+do_multiclient_test tn {
+ do_test 5.$tn.1 {
+ sql1 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE t1(x);
+ CREATE TABLE t2(x);
+ INSERT INTO t1 VALUES(randomblob(1500));
+ PRAGMA page_count;
+ }
+ } {wal 4}
+
+ do_test 5.$tn.2 {
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t2 VALUES(randomblob(1500));
+ PRAGMA page_count;
+ }
+ } {5}
+
+ do_test 5.$tn.3 {
+ sql2 {
+ DELETE FROM t1;
+ PRAGMA freelist_count;
+ PRAGMA page_count;
+ }
+ } {1 4}
+
+ do_test 5.$tn.4 { sql1 COMMIT } {}
+ do_test 5.$tn.5 { sql3 { PRAGMA integrity_check } } {ok}
+}
+
+#-------------------------------------------------------------------------
+#
+do_multiclient_test tn {
+ do_test 6.$tn.1 {
+ sql1 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE t1(x);
+ INSERT INTO t1 VALUES(randomblob(1500));
+ PRAGMA wal_checkpoint;
+ }
+ } {wal 0 5 5}
+
+ do_test 6.$tn.2 {
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t1 VALUES(randomblob(1500));
+ INSERT INTO t1 VALUES(randomblob(1500));
+ }
+ } {}
+
+ do_test 6.$tn.3 {
+ sql2 {
+ BEGIN;
+ INSERT INTO t1 VALUES(randomblob(1500));
+ INSERT INTO t1 VALUES(randomblob(1500));
+ COMMIT;
+ }
+ } {}
+
+ do_test 6.$tn.4 {
+ list [catch { sql1 COMMIT } msg] $msg
+ } {1 {database is locked}}
+ do_test 6.$tn.5 { sql3 { PRAGMA integrity_check } } {ok}
+ do_test 6.$tn.5 { sql3 { SELECT count(*) from t1 } } {3}
+}
+
+#-------------------------------------------------------------------------
+# Test that if a corrupt wal-index-header is encountered when attempting
+# to commit a CONCURRENT transaction, the transaction is not committed
+# (or rolled back) and that SQLITE_BUSY_SNAPSHOT is returned to the user.
+#
+catch { db close }
+forcedelete test.db
+testvfs tvfs
+sqlite3 db test.db -vfs tvfs
+do_execsql_test 7.1 {
+ PRAGMA journal_mode = wal;
+ BEGIN;
+ CREATE TABLE t1(a, b, PRIMARY KEY(a));
+ INSERT INTO t1 VALUES(1, 2);
+ INSERT INTO t1 VALUES(3, 4);
+ COMMIT;
+ BEGIN CONCURRENT;
+ INSERT INTO t1 VALUES(5, 6);
+ INSERT INTO t1 VALUES(7, 8);
+ SELECT * FROM t1;
+} {wal 1 2 3 4 5 6 7 8}
+
+# Corrupt the wal-index header
+incr_tvfs_hdr test.db 11 1
+
+do_catchsql_test 7.2.1 { COMMIT } {1 {database is locked}}
+do_test 7.2.2 { sqlite3_extended_errcode db } SQLITE_BUSY_SNAPSHOT
+
+do_execsql_test 7.3.1 {
+ SELECT * FROM t1;
+ ROLLBACK;
+} {1 2 3 4 5 6 7 8}
+do_execsql_test 7.3.2 {
+ SELECT * FROM t1;
+} {1 2 3 4}
+
+#-------------------------------------------------------------------------
+# Test that "PRAGMA integrity_check" works within a concurrent
+# transaction. Within a concurrent transaction, "PRAGMA integrity_check"
+# is unable to detect unused database pages, but can detect other types
+# of corruption.
+#
+reset_db
++do_test 8.1 {
++ execsql {
++ PRAGMA journal_mode = wal;
++ CREATE TABLE kv(k INTEGER PRIMARY KEY, v UNIQUE);
++ INSERT INTO kv VALUES(NULL, randomblob(750));
++ INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
++ INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
++ INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
++ INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
++ INSERT INTO kv SELECT NULL, randomblob(750) FROM kv;
++ DELETE FROM kv WHERE rowid%2;
++ }
++ set v [db one {PRAGMA freelist_count}]
++ expr $v==33 || $v==34
++} {1}
+do_execsql_test 8.2 { PRAGMA integrity_check } ok
+do_execsql_test 8.3 {
+ BEGIN CONCURRENT;
+ PRAGMA integrity_check;
+} {ok}
+do_execsql_test 8.4 {
+ INSERT INTO kv VALUES(1100, 1100);
+ PRAGMA integrity_check;
+} {ok}
+do_execsql_test 8.5 {
+ COMMIT;
+ PRAGMA integrity_check;
+} {ok}
+
+#-------------------------------------------------------------------------
+# Test that concurrent transactions do not allow foreign-key constraints
+# to be bypassed.
+#
+do_multiclient_test tn {
+ do_test 9.$tn.1 {
+ sql1 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE pp(i INTEGER PRIMARY KEY, j);
+ CREATE TABLE cc(a, b REFERENCES pp);
+
+ WITH seq(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM seq WHERE i<100)
+ INSERT INTO pp SELECT i, randomblob(1000) FROM seq;
+
+ PRAGMA foreign_keys = 1;
+ }
+ } {wal}
+
+
+ do_test 9.$tn.2.1 {
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO cc VALUES(42, 42);
+ }
+ } {}
+ do_test 9.$tn.2.2 {
+ sql2 { DELETE FROM pp WHERE i=42 }
+ list [catch { sql1 COMMIT } msg] $msg
+ } {1 {database is locked}}
+ do_test 9.$tn.2.3 {
+ sql1 ROLLBACK
+ } {}
+
+ do_test 9.$tn.3.1 {
+ sql1 {
+ PRAGMA foreign_keys = 0;
+ BEGIN CONCURRENT;
+ INSERT INTO cc VALUES(43, 43);
+ }
+ } {}
+ do_test 9.$tn.3.2 {
+ sql2 { DELETE FROM pp WHERE i=43 }
+ list [catch { sql1 COMMIT } msg] $msg
+ } {0 {}}
+
+ do_test 9.$tn.4.1 {
+ sql1 {
+ PRAGMA foreign_keys = on;
+ BEGIN CONCURRENT;
+ INSERT INTO cc VALUES(44, 44);
+ }
+ } {}
+ do_test 9.$tn.4.2 {
+ sql2 { DELETE FROM pp WHERE i=1 }
+ list [catch { sql1 COMMIT } msg] $msg
+ } {0 {}}
+}
+
+#-------------------------------------------------------------------------
+# Test that even if a SELECT statement appears before all writes within
+# a CONCURRENT transaction, the pages it reads are still considered when
+# considering whether or not the transaction may be committed.
+#
+do_multiclient_test tn {
+ do_test 10.$tn.1.1 {
+ sql1 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE t1(a);
+ CREATE TABLE t2(b);
+ CREATE TABLE t3(c);
+ INSERT INTO t1 VALUES(1), (2), (3);
+ INSERT INTO t2 VALUES(1), (2), (3);
+ INSERT INTO t3 VALUES(1), (2), (3);
+ }
+ } {wal}
+
+ do_test 10.$tn.1.2 {
+ sql1 {
+ BEGIN CONCURRENT;
+ SELECT * FROM t1;
+ INSERT INTO t2 VALUES(4);
+ }
+ } {1 2 3}
+
+ do_test 10.$tn.1.3 {
+ sql2 { INSERT INTO t1 VALUES(4) }
+ list [catch {sql1 COMMIT} msg] $msg
+ } {1 {database is locked}}
+ sql1 ROLLBACK
+
+ # In this case, because the "SELECT * FROM t1" is first stepped before
+ # the "BEGIN CONCURRENT", the pages it reads are not recorded by the
+ # pager object. And so the transaction can be committed. Technically
+ # this behaviour (the effect of an ongoing SELECT on a BEGIN CONCURRENT
+ # transacation) is undefined.
+ #
+ do_test 10.$tn.2.1 {
+ code1 {
+ set ::stmt [sqlite3_prepare db "SELECT * FROM t1" -1 dummy]
+ sqlite3_step $::stmt
+ }
+ } {SQLITE_ROW}
+ do_test 10.$tn.2.2 {
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t2 VALUES(4);
+ }
+ code1 {
+ set res [list]
+ lappend res [sqlite3_column_int $::stmt 0]
+ while {[sqlite3_step $::stmt]=="SQLITE_ROW"} {
+ lappend res [sqlite3_column_int $::stmt 0]
+ }
+ sqlite3_finalize $::stmt
+ set res
+ }
+ } {1 2 3 4}
+ do_test 10.$tn.2.3 {
+ sql2 { INSERT INTO t1 VALUES(5) }
+ sql1 COMMIT
+ } {}
+
+ # More tests surrounding long-lived prepared statements and concurrent
+ # transactions.
+ do_test 10.$tn.3.1 {
+ sql1 {
+ BEGIN CONCURRENT;
+ SELECT * FROM t1;
+ COMMIT;
+ }
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t2 VALUES(5);
+ }
+ sql2 {
+ INSERT INTO t1 VALUES(5);
+ }
+ sql1 COMMIT
+ sql3 {
+ SELECT * FROM t2;
+ }
+ } {1 2 3 4 5}
+ do_test 10.$tn.3.2 {
+ sql1 {
+ BEGIN CONCURRENT;
+ SELECT * FROM t1;
+ ROLLBACK;
+ }
+ sql1 {
+ BEGIN CONCURRENT;
+ INSERT INTO t2 VALUES(6);
+ }
+ sql2 {
+ INSERT INTO t1 VALUES(6);
+ }
+ sql1 COMMIT
+ sql3 { SELECT * FROM t2 }
+ } {1 2 3 4 5 6}
+ do_test 10.$tn.3.3 {
+ sql1 { BEGIN CONCURRENT }
+ code1 {
+ set ::stmt [sqlite3_prepare db "SELECT * FROM t1" -1 dummy]
+ sqlite3_step $::stmt
+ }
+ sql1 {
+ INSERT INTO t2 VALUES(7);
+ SELECT * FROM t3;
+ ROLLBACK;
+ BEGIN CONCURRENT;
+ }
+ sql2 { INSERT INTO t3 VALUES(5) }
+ code1 { sqlite3_finalize $::stmt }
+ sql1 {
+ INSERT INTO t2 VALUES(8);
+ COMMIT;
+ }
+ } {}
+}
+
+do_multiclient_test tn {
+ do_test 11.$tn.1 {
+ sql1 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE t1(a);
+ }
+ } {wal}
+
+ do_test 11.$tn.2 {
+ code1 { sqlite3_wal_info db main }
+ } {0 2}
+
+ do_test 11.$tn.3 {
+ sql1 { INSERT INTO t1 VALUES(1) }
+ code1 { sqlite3_wal_info db main }
+ } {2 3}
+
+ do_test 11.$tn.4 {
+ sql2 { INSERT INTO t1 VALUES(2) }
+ code2 { sqlite3_wal_info db2 main }
+ } {3 4}
+
+ do_test 11.$tn.5 {
+ sql1 { PRAGMA wal_checkpoint }
+ sql2 { INSERT INTO t1 VALUES(3) }
+ code2 { sqlite3_wal_info db2 main }
+ } {0 1}
+}
+
+reset_db
+do_execsql_test 12.0 {
+ PRAGMA journal_mode = wal;
+ CREATE TABLE tx(a INTEGER PRIMARY KEY, b);
+} {wal}
+do_test 12.1 {
+ for {set i 0} {$i < 50} {incr i} {
+ execsql {
+ BEGIN CONCURRENT;
+ INSERT INTO tx(b) VALUES( randomblob( 1200 ) );
+ COMMIT;
+ }
+ }
+ execsql { PRAGMA page_size }
+} {1024}
+do_execsql_test 12.2 {
+ DELETE FROM tx;
+}
+do_test 12.3 {
+ for {set i 0} {$i < 50} {incr i} {
+ execsql {
+ BEGIN CONCURRENT;
+ INSERT INTO tx(b) VALUES( randomblob( 1200 ) );
+ COMMIT;
+ }
+ }
+ execsql { PRAGMA page_size }
+} {1024}
+do_execsql_test 12.4 {
+ DELETE FROM tx;
+}
+do_test 12.5 {
+ execsql { BEGIN CONCURRENT }
+ for {set i 0} {$i < 5000} {incr i} {
+ execsql {
+ INSERT INTO tx(b) VALUES( randomblob( 1200 ) );
+ }
+ }
+ execsql { COMMIT }
+ execsql { PRAGMA page_size }
+} {1024}
+
+
+finish_test