From: drh Date: Wed, 2 Feb 2011 16:34:08 +0000 (+0000) Subject: Merge in the blocking-checkpoint enhancement, including the new X-Git-Tag: version-3.7.6~174 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87fa53ee8d802b6cb37d904428f158b234f9bcf4;p=thirdparty%2Fsqlite.git Merge in the blocking-checkpoint enhancement, including the new sqlite3_wal_checkpoint_v2() interface and the PRAGMA wal_checkpoint(full) statement. FossilOrigin-Name: bac7342c368a7c4f5f2878e08d9581dcbf57dd58 --- 87fa53ee8d802b6cb37d904428f158b234f9bcf4 diff --cc manifest index 1e2ce7408c,8fc2b20728..77c138220f --- a/manifest +++ b/manifest @@@ -1,7 -1,10 +1,10 @@@ - C Merge\sfts4aux\sbranch. - D 2011-02-02T04:40:07.295 + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA1 + -C Merge\sthe\scheckpoint_fullfsync\spragma\sand\sthe\ssuperlock\sdemonstration\sinto\nthe\scheckpoint-v2\sexperimental\sbranch. -D 2010-11-19T18:51:31 ++C Merge\sin\sthe\sblocking-checkpoint\senhancement,\sincluding\sthe\snew\nsqlite3_wal_checkpoint_v2()\sinterface\sand\sthe\nPRAGMA\swal_checkpoint(full)\sstatement. ++D 2011-02-02T16:34:08.739 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in e7a59672eaeb04408d1fa8501618d7501a3c5e39 +F Makefile.in de6498556d536ae60bb8bb10e8c1ba011448658c F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.vxworks c85ec1d8597fe2f7bc225af12ac1666e21379151 F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6 @@@ -100,7 -102,7 +103,7 @@@ F ext/rtree/tkt3363.test 142ab96eded44a F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 - F main.mk 589cd0fdc9d9bf7a8220511ff5db5bd57efe3558 -F main.mk 731380a234515bd21ba4f930e12041ed3acfcc3a ++F main.mk 54190fab7cdba523e311c274c95ea480f32abfb5 F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f F mkextw.sh 4123480947681d9b434a5e7b1ee08135abe409ac @@@ -114,15 -116,15 +117,15 @@@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47 F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc F sqlite3.pc.in ae6f59a76e862f5c561eb32a380228a02afc3cad F src/alter.c 6a0c176e64a34929a4436048066a84ef4f1445b3 -F src/analyze.c 1ea594a912a14138e20a05db09d9065e46f29a2a +F src/analyze.c a038162344265ac21dfb24b3fcc06c666ebb9c07 F src/attach.c 252c4f7e36cc219349451ed63e278c60e80b26f3 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 -F src/backup.c d5b0137bc20327af08c14772227cc35134839c30 +F src/backup.c 6728d6d48d55b449af76a3e51c0808849cb32a2e F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef F src/btmutex.c 96a12f50f7a17475155971a241d85ec5171573ff - F src/btree.c 9004c98fc576306eee4fc0562ffeb362ef53912c - F src/btree.h 10f9296bf4edf034f5adce921b7b4383a56a1c90 -F src/btree.c 3578a5e812ab9b434b1b705aad547939a055be11 ++F src/btree.c cefe096650179dc4c5d876e7a27593ff1e6a86ed + F src/btree.h e2f2cd9933bf30724f53ffa12c4c5a3a864bbd6e -F src/btreeInt.h c424f2f131cc61ddf130f9bd736b3df12c8a51f0 +F src/btreeInt.h 20f73dc93b1eeb83afd7259fbc6bd7dcf2df7fe4 F src/build.c 00a327120d81ace6267e714ae8010c997d55de5d F src/callback.c a1d1b1c9c85415dff013af033e2fed9c8382d33b F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac @@@ -142,8 -144,8 +145,8 @@@ F src/journal.c 552839e54d1bf76fb8f7abe F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e - F src/main.c 6653e46db7ecb5a7449d8a12900147192f748b97 -F src/main.c 84fdf5b2d823641f6bb394a81e467b6d7ff9b7ec -F src/malloc.c 3d7284cd9346ab6e3945535761e68c23c6cf40ef ++F src/main.c 1b04ef67eb03d026c8cc2d438c61635163153c24 +F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206 F src/mem2.c e307323e86b5da1853d7111b68fd6b84ad6f09cf @@@ -160,31 -162,31 +163,31 @@@ F src/notify.c 976dd0f6171d4588e89e874f F src/os.c 22ac61d06e72a0dac900400147333b07b13d8e1d F src/os.h 9dbed8c2b9c1f2f2ebabc09e49829d4777c26bf9 F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f -F src/os_os2.c 72d0b2e562952a2464308c4ce5f7913ac10bef3e -F src/os_unix.c de5be4cdbf3d07018059934eaf7e5d8d594a895c -F src/os_win.c 2f90f7bdec714fad51cd31b4ecad3cc1b4bb5aad -F src/pager.c b3e86e5d27c04e05a73a55ce2c79bb6028196431 +F src/os_os2.c 2e452c9f2ca507623ad351c33a8a8b27849b1863 +F src/os_unix.c 1be46a35bad4bec5171e4de88aaff817260eb378 +F src/os_win.c 9abdcdd925416d854eabb0996c96debd92abfef5 - F src/pager.c c22b8531596c984dcc6b90645714b7ed951023fe - F src/pager.h 0ea59db2a33bc6c2c02cae34de33367e1effdf76 ++F src/pager.c d62dfc1d77168c4415e7f3e23c6dbee4f3fdff60 + F src/pager.h 3f8c783de1d4706b40b1ac15b64f5f896bcc78d1 F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 -F src/pcache1.c e9578a3beac26f229ee558a4e16c863f2498185f -F src/pragma.c 900f480cc266428218d1a745a3e670fbd33cf12d -F src/prepare.c c2b318037d626fed27905c9446730b560637217a -F src/printf.c 8ae5082dd38a1b5456030c3755ec3a392cd51506 +F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e - F src/pragma.c 8a6cd3c787f882fa44f6490d2411fc26839ce8f3 ++F src/pragma.c 3d48a7f0a90bae8740adcc0d86e583b79da57f5b +F src/prepare.c 395b3fab1b93f45b6aa194b23ebc201221c47b99 +F src/printf.c df2ff3bb5409e8958136933342c46464fbd017e7 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 -F src/select.c 550d67688f5e8bc8022faf6d014838afba1415af -F src/shell.c 8517fc1f9c59ae4007e6cc8b9af91ab231ea2056 -F src/sqlite.h.in daa5e94df834537708afb917e9b4cc4489c63c00 +F src/select.c 8a7ba246b0b4bb45df7fbc52681728a0e3deaaa7 +F src/shell.c 83c6f0cc5a79a081c7b9ddfe4f557b47e0bad976 - F src/sqlite.h.in 7599c4975cd0d0fff8d8d8cd3e423ca893b48f47 ++F src/sqlite.h.in c0456330093737c74409e7f7d89d0f1e0dbf43b7 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 - F src/sqliteInt.h 45926deaf59b1ce3f55d21d5f91a8cecb6a7eb4c -F src/sqliteInt.h eea368b138c8c90ea1aef8f06f49ec29aacb2a8b ++F src/sqliteInt.h 4290fff17fabc6e07fc4338233df0e39e6350ca1 F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 -F src/status.c 496913d4e8441195f6f2a75b1c95993a45b9b30b +F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e -F src/tclsqlite.c 77c5c4b8ac7b2d94ee480e1ad626fbd921d948e4 -F src/test1.c c2aa29d0fd6db7506fb7f0de7bff1386078296df +F src/tclsqlite.c 549859dc2c143f3deb6a92636a2d27973652c164 +F src/test1.c 771407a49ae199241f0efb7055634e4a1899c026 F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31 F src/test3.c 056093cfef69ff4227a6bdb9108564dc7f45e4bc F src/test4.c 0528360b5025688002a5feb6be906ddce52eaaee @@@ -227,24 -229,24 +230,24 @@@ F src/tokenize.c 604607d6813e9551cf5189 F src/trigger.c b8bedb9c0084ceb51a40f54fcca2ce048c8de852 F src/update.c 227e6cd512108b84f69421fc6c7aa1b83d60d6e0 F src/utf.c 1baeeac91707a4df97ccc6141ec0f808278af685 -F src/util.c cd78524566fe45671863eee78685969a4bfd4e4c +F src/util.c ab1c92426494f499f42b9e307537b03e923d75c1 F src/vacuum.c 924bd1bcee2dfb05376f79845bd3b4cec7b54b2f - F src/vdbe.c 5d310eaf1a4d8383602126fa82e01291ab7d3cf3 -F src/vdbe.c 06f868b6daff465cd805d09b43661d0e0bee62a7 ++F src/vdbe.c 7f54982de40509458ee7ede8e356dccc19f5b161 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 -F src/vdbeInt.h 7f4cf1b2b69bef3a432b1f23dfebef57275436b4 -F src/vdbeapi.c fb0036185b3c56e15916a5ee96309cd4acf6818f -F src/vdbeaux.c 762c2b146cf5fe7a7f743af1bbfed4a966aa937a -F src/vdbeblob.c e0ce3c54cc0c183af2ec67b63a289acf92251df4 -F src/vdbemem.c 23723a12cd3ba7ab3099193094cbb2eb78956aa9 -F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2 +F src/vdbeInt.h 6e6f28e9bccc6c703dca1372fd661c57b5c15fb0 +F src/vdbeapi.c 8e9324fd35eb70d0b5904bd1af40f2598744dc4d +F src/vdbeaux.c 33448d23b857654dd69ed2103611f5c733606f68 +F src/vdbeblob.c 18955f0ee6b133cd08e1592010cb9a6b11e9984c +F src/vdbemem.c 411649a35686f54268ccabeda175322c4697f5a6 +F src/vdbetrace.c 3ba13bc32bdf16d2bdea523245fd16736bed67b5 F src/vtab.c b297e8fa656ab5e66244ab15680d68db0adbec30 - F src/wal.c dbca424f71678f663a286ab2a98f947af1d412a7 - F src/wal.h c1aac6593a0b02b15dc625987e619edeab39292e -F src/wal.c 23facfd0f148ac72729fe28bbf973fe0458757b6 ++F src/wal.c e6a609ab090eeb27013cf908a979e448859d01c7 + F src/wal.h 7a5fbb00114b7f2cd40c7e1003d4c41ce9d26840 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f -F src/where.c fa22d45b2577c77146f2e894d58011d472d64103 +F src/where.c af069e6b53234118014dabfece96a9515b69d76b F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 -F test/all.test 6745008c144bd2956d58864d21f7b304689c1cce +F test/all.test 51756962d522e474338e9b2ebb26e7364d4aa125 F test/alter.test 15f9224868b290d6bf7a63f31437f31aee070636 F test/alter2.test 75f731508f1bf27ba09a6075c66cd02216ba464b F test/alter3.test 8677e48d95536f7a6ed86a1a774744dadcc22b07 @@@ -579,8 -575,8 +582,8 @@@ F test/notify3.test d60923e186e0900f481 F test/notnull.test cc7c78340328e6112a13c3e311a9ab3127114347 F test/null.test a8b09b8ed87852742343b33441a9240022108993 F test/openv2.test af02ed0a9cbc0d2a61b8f35171d4d117e588e4ec - F test/pager1.test 7006a8b5dd3df1fe0d51d7da014333d7dc099778 -F test/pager1.test 1e07368795dc6205a046a7a29f4455a9d5195d19 -F test/pager2.test 0fbb6b6dc40ce1fecfe758c555a748ad2e9beaa3 ++F test/pager1.test d8672fd0af5f4f9b99b06283d00f01547809bebe +F test/pager2.test 745b911dde3d1f24ae0870bd433dfa83d7c658c1 F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f F test/pagerfault.test 9de4d3e0c59970b4c6cb8dac511fa242f335d8a7 F test/pagerfault2.test 1f79ea40d1133b2683a2f811b00f2399f7ec2401 @@@ -805,8 -797,9 +808,9 @@@ F test/trigger8.test 30cb0530bd7c472805 F test/trigger9.test 5b0789f1c5c4600961f8e68511b825b87be53e31 F test/triggerA.test eaf11a29db2a11967d2d4b49d37f92bce598194e F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe -F test/triggerC.test 2a23edcc00684d084902ba5ec93e721775c3a70a +F test/triggerC.test 8a691ff6dd47df2e57395bbec4b62101fac0f363 F test/triggerD.test c6add3817351451e419f6ff9e9a259b02b6e2de7 + F test/tt3_checkpoint.c 415eccce672d681b297485fc20f44cdf0eac93af F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff F test/types2.test 3555aacf8ed8dc883356e59efc314707e6247a84 F test/types3.test a0f66bf12f80fad89493535474f7a6d16fa58150 @@@ -837,12 -830,12 +841,13 @@@ F test/vtabE.test 7c4693638d7797ce2eda1 F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d - F test/wal.test 70227190e713b3e7eb2a7d5ec3510b66db01f327 - F test/wal2.test 3de797854de175323e7351b5f2514a30d1ee1410 - F test/wal3.test ac51126c36814bce334f66a0a4dbbfa56d429733 + F test/wal.test f060cae4b2164c4375109a8f803873187234661d -F test/wal2.test 894d55dda774340fe7bebe239bed9b6130ff23d7 -F test/wal3.test 55529a3fbf0a04670558dbf0b06f04a2f3508db4 ++F test/wal2.test c9b23c97329a825415abb004d7502844d72fd8fc ++F test/wal3.test ec87d9dd9e9cebabed4024064e8ff531d336ead2 F test/wal4.test 3404b048fa5e10605facaf70384e6d2943412e30 + F test/wal5.test 1f99651d856c8b9e1376781c981d1b903e93a478 +F test/wal6.test 07aa31ca8892d0527f2c5c5a9a2a87aa421dfaa8 - F test/wal_common.tcl 895d76138043b86bdccf36494054bdabcf65837b + F test/wal_common.tcl a98f17fba96206122eff624db0ab13ec377be4fe F test/walbak.test 4df1c7369da0301caeb9a48fa45997fd592380e4 F test/walbig.test e882bc1d014afffbfa2b6ba36e0f07d30a633ad0 F test/walcksum.test a37b36375c595e61bdb7e1ec49b5f0979b6fc7ce @@@ -901,7 -894,14 +906,14 @@@ F tool/speedtest2.tcl ee2149167303ba8e9 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f - P ed759d5a9edb3bba5f48f243df47be29e3fe8cd7 0147d9739f318a02721d3ae0e7be339a19231f60 - R 531c9b98b4934054a140000876bf40a8 - U dan - Z d29ed65f9181e7ba0766a4c73453d1ce -P 648dd157ef3b7b790764698fd4dd7107c25212c9 570e79a8eb3bb2d2a15c46c55fbf52c9dd3e3ae8 -R 29ee6d2e4bc9e75a0c4b1469b6aa491c ++P c6d9f7d8c48e1ff405e1c1d98a166974fc829f58 ebf74015f09fe241c1c6902dc8954f2b59ab41ec ++R 0634baae0b43c2b82e8b9905e8c6ee5b + U drh -Z 62a52f8bb2681a24e7959006560a6980 ++Z d29f42a4b972ec3903a5f796629ef74c + -----BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.6 (GNU/Linux) ++Version: GnuPG v1.4.10 (Darwin) + -iD8DBQFM5sdNoxKgR168RlERAn8IAJ4xAREF+dTwudzwR6tkh9wg+ffZegCeIyuW -SnmYKb+i1Y56lE+LONz+l/g= -=HICj ++iEYEARECAAYFAk1Jh4EACgkQoxKgR168RlEDdgCfTySKHScQj7r5Q2WPZ7harLi+ ++uBIAn0+3gnlHjhVd4fzemcV4FGDrMm/Y ++=REwF + -----END PGP SIGNATURE----- diff --cc manifest.uuid index 3695689d87,0da19b37b6..e607a2875c --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - c6d9f7d8c48e1ff405e1c1d98a166974fc829f58 -ebf74015f09fe241c1c6902dc8954f2b59ab41ec ++bac7342c368a7c4f5f2878e08d9581dcbf57dd58 diff --cc src/pager.c index c6db5c2e3f,e0230c6e97..218429838b --- a/src/pager.c +++ b/src/pager.c @@@ -2947,10 -2919,7 +2947,10 @@@ static int pagerRollbackWal(Pager *pPag ** This function is a wrapper around sqlite3WalFrames(). As well as logging ** the contents of the list of pages headed by pList (connected by pDirty), ** this function notifies any active backup processes that the pages have - ** changed. + ** changed. +** +** The list of pages passed into this routine is always sorted by page number. +** Hence, if page 1 appears anywhere on the list, it will be the first page. */ static int pagerWalFrames( Pager *pPager, /* Pager object */ diff --cc src/sqlite.h.in index 3ee1aa9323,dadc589abf..6bdc6afc95 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@@ -2666,31 -2645,14 +2666,31 @@@ const char *sqlite3_sql(sqlite3_stmt *p /* ** CAPI3REF: Determine If An SQL Statement Writes The Database ** - ** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if + ** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if -** the [prepared statement] X is [SELECT] statement and false (zero) if -** X is an [INSERT], [UPDATE], [DELETE], CREATE, DROP, [ANALYZE], -** [ALTER], or [REINDEX] statement. -** If X is a NULL pointer or any other kind of statement, including but -** not limited to [ATTACH], [DETACH], [COMMIT], [ROLLBACK], [RELEASE], -** [SAVEPOINT], [PRAGMA], or [VACUUM] the result of sqlite3_stmt_readonly(X) is -** undefined. +** and only if the [prepared statement] X makes no direct changes to +** the content of the database file. +** +** Note that [application-defined SQL functions] or +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that +** calls [sqlite3_exec()], then the following SQL statement would +** change the database file through side-effects: +** +**
 +**    SELECT eval('DELETE FROM t1') FROM t2;
 +** 
+** +** But because the [SELECT] statement does not change the database file +** directly, sqlite3_stmt_readonly() would still return true.)^ +** +** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], +** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, +** since the statements themselves do not actually modify the database but +** rather they control the timing of when other statements modify the +** database. ^The [ATTACH] and [DETACH] statements also cause +** sqlite3_stmt_readonly() to return true since, while those statements +** change the configuration of a database connection, they do not make +** changes to the content of the database files on disk. */ int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); diff --cc src/wal.c index ff327bf6bb,2cb0e415ee..d557b12f04 --- a/src/wal.c +++ b/src/wal.c @@@ -1604,12 -1600,11 +1635,13 @@@ static int walCheckpoint u32 mxPage; /* Max database page to write */ int i; /* Loop counter */ volatile WalCkptInfo *pInfo; /* The checkpoint status information */ + int (*xBusy)(void*) = 0; /* Function to call when waiting for locks */ - szPage = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); + szPage = walPagesize(pWal); testcase( szPage<=32768 ); testcase( szPage>=65536 ); + pInfo = walCkptInfo(pWal); + if( pInfo->nBackfill>=pWal->hdr.mxFrame ) return SQLITE_OK; /* Allocate the iterator */ rc = walIteratorInit(pWal, &pIter); @@@ -1630,12 -1624,11 +1661,12 @@@ ** cannot be backfilled from the WAL. */ mxSafeFrame = pWal->hdr.mxFrame; + mxPage = pWal->hdr.nPage; for(i=1; iaReadMark[i]; - if( mxSafeFrame>=y ){ + if( mxSafeFrame>y ){ assert( y<=pWal->hdr.mxFrame ); - rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1); + rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1); if( rc==SQLITE_OK ){ pInfo->aReadMark[i] = READMARK_NOT_USED; walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); diff --cc test/wal2.test index e31fe79493,299afa4f79..7927d7a9a8 --- a/test/wal2.test +++ b/test/wal2.test @@@ -1154,127 -1152,6 +1154,127 @@@ if {$::tcl_platform(platform) == "unix" } catch { db close } } - } + } +#------------------------------------------------------------------------- +# Test that "PRAGMA checkpoint_fullsync" appears to be working. +# +foreach {tn sql reslist} { + 1 { } {8 0 3 0 5 0} + 2 { PRAGMA checkpoint_fullfsync = 1 } {8 4 3 2 5 2} + 3 { PRAGMA checkpoint_fullfsync = 0 } {8 0 3 0 5 0} +} { + faultsim_delete_and_reopen + + execsql $sql + do_execsql_test wal2-14.$tn.1 { PRAGMA journal_mode = WAL } {wal} + + set sqlite_sync_count 0 + set sqlite_fullsync_count 0 + + do_execsql_test wal2-14.$tn.2 { + PRAGMA wal_autocheckpoint = 10; + CREATE TABLE t1(a, b); -- 2 wal syncs + INSERT INTO t1 VALUES(1, 2); -- 1 wal sync + PRAGMA wal_checkpoint; -- 1 wal sync, 1 db sync + BEGIN; + INSERT INTO t1 VALUES(3, 4); + INSERT INTO t1 VALUES(5, 6); + COMMIT; -- 1 wal sync + PRAGMA wal_checkpoint; -- 1 wal sync, 1 db sync + } {10} + + do_test wal2-14.$tn.3 { + list $sqlite_sync_count $sqlite_fullsync_count + } [lrange $reslist 0 1] + + set sqlite_sync_count 0 + set sqlite_fullsync_count 0 + + do_test wal2-14.$tn.4 { + execsql { INSERT INTO t1 VALUES(7, zeroblob(12*4096)) } + list $sqlite_sync_count $sqlite_fullsync_count + } [lrange $reslist 2 3] + + set sqlite_sync_count 0 + set sqlite_fullsync_count 0 + + do_test wal2-14.$tn.5 { + execsql { PRAGMA wal_autocheckpoint = 1000 } + execsql { INSERT INTO t1 VALUES(9, 10) } + execsql { INSERT INTO t1 VALUES(11, 12) } + execsql { INSERT INTO t1 VALUES(13, 14) } + db close + list $sqlite_sync_count $sqlite_fullsync_count + } [lrange $reslist 4 5] +} + +catch { db close } + +# PRAGMA checkpoint_fullsync +# PRAGMA fullfsync +# PRAGMA synchronous +# +foreach {tn settings commit_sync ckpt_sync} { + 1 {0 0 off} {0 0} {0 0} + 2 {0 0 normal} {0 0} {2 0} + 3 {0 0 full} {1 0} {2 0} + + 4 {0 1 off} {0 0} {0 0} + 5 {0 1 normal} {0 0} {0 2} + 6 {0 1 full} {0 1} {0 2} + + 7 {1 0 off} {0 0} {0 0} + 8 {1 0 normal} {0 0} {0 2} + 9 {1 0 full} {1 0} {0 2} + + 10 {1 1 off} {0 0} {0 0} + 11 {1 1 normal} {0 0} {0 2} + 12 {1 1 full} {0 1} {0 2} +} { + forcedelete test.db + + testvfs tvfs -default 1 + tvfs filter xSync + tvfs script xSyncCb + proc xSyncCb {method file fileid flags} { + incr ::sync($flags) + } + + sqlite3 db test.db + do_execsql_test 15.$tn.1 " + CREATE TABLE t1(x); + PRAGMA journal_mode = WAL; + PRAGMA checkpoint_fullfsync = [lindex $settings 0]; + PRAGMA fullfsync = [lindex $settings 1]; + PRAGMA synchronous = [lindex $settings 2]; + " {wal} + + do_test 15.$tn.2 { + set sync(normal) 0 + set sync(full) 0 + execsql { INSERT INTO t1 VALUES('abc') } + list $::sync(normal) $::sync(full) + } $commit_sync + + do_test 15.$tn.3 { + set sync(normal) 0 + set sync(full) 0 + execsql { INSERT INTO t1 VALUES('def') } + list $::sync(normal) $::sync(full) + } $commit_sync + + do_test 15.$tn.4 { + set sync(normal) 0 + set sync(full) 0 + execsql { PRAGMA wal_checkpoint } + list $::sync(normal) $::sync(full) + } $ckpt_sync + + db close + tvfs delete +} + + + finish_test