From: drh Date: Wed, 2 Dec 2015 20:22:38 +0000 (+0000) Subject: Merge all recent trunk enhancements, especially the unix VFS changes. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=59158c25cbb404a10a62df56051415cff84a3555;p=thirdparty%2Fsqlite.git Merge all recent trunk enhancements, especially the unix VFS changes. FossilOrigin-Name: e1fb33c7d2bfd8ea115e667d7671a7529cd116aa --- 59158c25cbb404a10a62df56051415cff84a3555 diff --cc manifest index 7b6a76458e,123da22f21..ca458b008f --- a/manifest +++ b/manifest @@@ -1,8 -1,8 +1,8 @@@ - C Merge\sthe\slatest\senhancements\sfrom\strunk. - D 2015-11-19T19:48:24.878 - F Makefile.in eebca73951f1f5827925d997e634daef95fdd364 -C Remove\sunreachable\sbranches\sfrom\sthe\sdecltype\scomputation\slogic\sin\sthe\squery\nplanner. -D 2015-12-02T19:46:12.775 -F Makefile.in 23d9a63484a383fc64951b25ef44067930f98dc6 ++C Merge\sall\srecent\strunk\senhancements,\sespecially\sthe\sunix\sVFS\schanges. ++D 2015-12-02T20:22:38.912 ++F Makefile.in 28325f17527ba422645ebf98901f8876c312a825 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 - F Makefile.msc e928e68168df69b353300ac87c10105206653a03 + F Makefile.msc e8fdca1cb89a1b58b5f4d3a130ea9a3d28cb314d F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION 8b9d3ac6f1962f94e06ba05462422a544f9c4e36 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@@ -266,7 -263,7 +266,7 @@@ F ext/userauth/userauth.c 5fa3bdb492f48 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 - F main.mk 99fbce4b5b6ad626f61b13baea34c73a443be17f -F main.mk 9001039f432baeba1074e2d1885f3dfd572b8636 ++F main.mk 6693ea5f978d0175d056baa83ace9f8aac56814e F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@@ -283,15 -280,15 +283,15 @@@ F src/analyze.c 977bd50c751bb939ef52917 F src/attach.c e944d0052b577703b9b83aac1638452ff42a8395 F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 2869a76c03eb393ee795416e2387005553df72bc - F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d + F src/bitvec.c 1a78d450a17c5016710eec900bedfc5729bf9bdf F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c d3bdd8462a86492e2ebc9aca4a0168429017de25 +F src/btree.c 59c8f28530850c9f94be62aa4c020d39a4de10d2 F src/btree.h 2d76dee44704c47eed323356a758662724b674a0 F src/btreeInt.h 3ab435ed27adea54d040584b0bcc488ee7db1e38 - F src/build.c 5a3b71786e2b96d2bb92d40f190eb1fe736f25ca + F src/build.c e83da4d004a4e050c01acbb821ff7a7b1019c29b F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f - F src/ctime.c 509ef9c64d1321f42448f111da86400b1799218a + F src/ctime.c 58eda76364fb6f374e044aa4493219b13abf9400 F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c ffd63fc8ba7541476ced189b95e95d7f2bc63f78 F src/delete.c 00af9f08a15ddc5cba5962d3d3e5bf2d67b2e7da @@@ -305,9 -302,9 +305,9 @@@ F src/hash.h c8f3c31722cf3277d037139097 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 F src/insert.c e1d20ae8979e25519c2670233718676bedcfedc9 F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d -F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e +F src/legacy.c 9c17d86e06522c261307f0eb6bcb1254c8b04a59 F src/loadext.c 18586e45a215325f15096821e9c082035d4fb810 - F src/main.c 5d8883e245ff3c7a24529e964d807a942a8fd16a -F src/main.c 3f2828fce1e45c3ad096c69eee1e96962c7281c5 ++F src/main.c 66b67b2b3b0f972d4c5aee89d5d31e2f863606e9 F src/malloc.c 337bbe9c7d436ef9b7d06b5dd10bbfc8f3025972 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 6919bcf12f221868ea066eec27e579fed95ce98b @@@ -319,36 -316,35 +319,36 @@@ F src/msvc.h d9ba56c6851227ab44b3f228a3 F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85 F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 - F src/mutex_unix.c a94b46f3f7beba307dde1b298b0f99f9c3677a93 + F src/mutex_unix.c fc54f25b2a750d53b32512a4a728cec28039ae2a F src/mutex_w32.c 5e6fe1c298fb5a8a15aaed4161d5759311431c17 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 -F src/os.c 8fd25588eeba74068d41102d26810e216999b6c8 +F src/os.c 5822c2b843a77219bba1e28887cdc816b27ca29d F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf F src/os_common.h abdb9a191a367793268fe553d25bab894e986a0e F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa - F src/os_unix.c f3e7ee04047592105e6408fde79a218cdf85bbe9 - F src/os_win.c 210580a96369786f43f3ccb47096f7b9b86fe980 -F src/os_unix.c 60997373a8d90bd17e1c0e49d11ef361b713439b -F src/os_win.c 386fba30419e8458b13209781c2af5590eab2811 ++F src/os_unix.c 325d29171a7031739931be1a7baf18ebf3ca391f ++F src/os_win.c d5f32f015c52888b76c8919a8b3fa5c532dff497 F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca - F src/pager.c 93b495fb0503425bb909a01ff4f5794dbfab819c - F src/pager.h 22bbab15f41ac42ce0b51e39a7d02eb5eb2833c2 -F src/pager.c f92aacd5216d8815136c9e0190041783c602641a -F src/pager.h 9153c71a89dc82a5a77e485f3929792116c70aae ++F src/pager.c f286cbf210d862543635057132da176f4d69ac75 ++F src/pager.h 3bb11e11eb1a9f4819bb0d91ede24b039916d8fd F src/parse.y 23737e649c26ce327603799e57f5c2ff50e5e6ba F src/pcache.c 73895411fa6b7bd6f0091212feabbe833b358d23 F src/pcache.h 1ff11adce609ba7de139b6abfabaf9a2bac947b5 - F src/pcache1.c 902e1bc7bdaa81b40f8543407c5e2ac8ef4dc035 + F src/pcache1.c 46a110be31a8d9f9b41431733836822ca0dd27ab -F src/pragma.c f3e7147299ca05ef4304a36f1fd6e002729c72c6 +F src/pragma.c c1ab37e1576d22715d3bae4f51658326240a8161 F src/pragma.h 3d94aebbebd2089899fecc01909bf2608b39507d -F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 +F src/prepare.c 176b060bcf36041193c2807f2b045dce1effa4bb - F src/printf.c f8fc8f04e75b1e983ef2793c27ec7a43b287e94a + F src/printf.c ca05561795ad6c2fa47acdd007702586282f7feb F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 - F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 + F src/resolve.c f4c897ca76ca6d5e0b3f0499c627392ffe657c8e F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e - F src/select.c 2376d320907a5c28c55290f18fd94aa3400bf97c - F src/shell.c f0f59ea60ad297f671b7ae0fb957a736ad17c92c - F src/sqlite.h.in df28d4fdd2c6c902ed68bb4d0223e370f97c7d74 + F src/select.c 1611828a7116e5f6cc1e69cd07d59b0d2c662ea9 + F src/shell.c 2796237990d42e6a5a7beafee65ef70cc8767d21 -F src/sqlite.h.in 5bd83191711d3dc85030326daa9e8e5226a495e7 ++F src/sqlite.h.in 050e7ee3bb7e7f04bceb94b5c883eda435efdcf7 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad +F src/sqlite3_private.h a81a9c5f97c095cc3e86914a05f8fabe0011f4a1 - F src/sqlite3ext.h 4b66e3e3435da4b4c8c83696d0349f0c503b3924 - F src/sqliteInt.h ed4a27c98da2caaa6db8b0a8f57c05085586de9b + F src/sqlite3ext.h 41ef50b0418a7c5ad1337bb80db5a7928dee764f -F src/sqliteInt.h 64256d193a16a147d9f6317cc4e095fdd3e0a2e9 ++F src/sqliteInt.h 753af29810be999593fe14bb2276b79dddccd8a6 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@@ -367,10 -363,10 +367,10 @@@ F src/test_autoext.c dea8a01a7153b9adc9 F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803 F src/test_blob.c e5a7a81d61a780da79101aeb1e60d300af169e07 F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f - F src/test_config.c ca2fdaf49a314ee38cc7363d90ed9cb0905f4155 -F src/test_config.c 48850687dd5abc8260e23835632511054ccae172 ++F src/test_config.c 8ab92facea822bd4fc6d0198487d7638072e1ec9 F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc - F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f + F src/test_fs.c aab47ac456316502faa265daadf9ac832fea12b9 F src/test_func.c 0d9c25956152adefee8881c6fadc8354793764d0 F src/test_hexio.c abfdecb6fa58c354623978efceb088ca18e379cd F src/test_init.c 66b33120ffe9cd853b5a905ec850d51151337b32 @@@ -391,9 -387,9 +391,9 @@@ F src/test_rtree.c 43fff4c5a01576d6d213 F src/test_schema.c 2bdba21b82f601da69793e1f1d11bf481a79b091 F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe F src/test_sqllog.c 0d138a8180a312bf996b37fa66da5c5799d4d57b -F src/test_superlock.c 06797157176eb7085027d9dd278c0d7a105e3ec9 +F src/test_superlock.c 12e2bc484c6c2ba837327d37f2e6a6fd9d1464f8 F src/test_syscall.c 2e21ca7f7dc54a028f1967b63f1e76155c356f9b - F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa + F src/test_tclvar.c d86412527da65468ee6fa1b8607c65d0af736bc4 F src/test_thread.c af391ec03d23486dffbcc250b7e58e073f172af9 F src/test_vfs.c 3b65d42e18b262805716bd96178c81da8f2d9283 F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 @@@ -402,29 -400,29 +404,29 @@@ F src/threads.c bbfb74450643cb5372a43ad F src/tokenize.c 5606871a377f390af7040ec3c12e0d183512d785 F src/treeview.c 78842e90c1f71269e7a73a1d4221b6fe360bab66 F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f - F src/update.c 40e51cd0883cb5bfd6abb7d8a7cd8aa47fab2945 + F src/update.c 17332f9fe818cbc0444c36a811800af8498af4c3 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c - F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd + F src/util.c e802e8e311a0d6c48cd1b3e89db164f6f0248d70 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 - F src/vdbe.c c9869b29ad815472a1548b6772d0b26cb6976180 -F src/vdbe.c 4d75375fa8bf911aa76ab8383d6f7eea0dec0fda ++F src/vdbe.c 5cd1221f8a9ee01574124986ac2d0ec97504ea50 F src/vdbe.h efb7a8c1459e31f3ea4377824c6a7e4cb5068637 - F src/vdbeInt.h 33403622c6a8feaaac5f0f3f17f5d1bf6df42286 + F src/vdbeInt.h 75c2e82ee3357e9210c06474f8d9bdf12c81105d -F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca -F src/vdbeaux.c 9a234c9aaab4ad725daf94667cfed441a437c52d +F src/vdbeapi.c b13f483b1375467c367de486edf2be05234e27bb - F src/vdbeaux.c 2fab8625e7738547ebc68e43e4770e557a2a8bb7 - F src/vdbeblob.c 565fabd302f5fca3bdf3d56cac330483616a39b6 ++F src/vdbeaux.c e189aaf40871062c8451bbc28ce7a275b77979d0 + F src/vdbeblob.c fdc4a81605ae7a35ae94a55bd768b66d6be16f15 F src/vdbemem.c fdd1578e47bea61390d472de53c565781d81e045 - F src/vdbesort.c 8b23930a1289526f6d2a3a9f2e965bcc963e4a68 + F src/vdbesort.c a7ec02da4494c59dfd071126dd3726be5a11459d F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c 2a8b44aa372c33f6154208e7a7f6c44254549806 F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb - F src/wal.c 929c1d7e2da94dda41e5c2fa71a919fff91ad04b -F src/wal.c 1569802364cd192bbd5c4a8ea3fd6de593edecbd -F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 ++F src/wal.c e93f9b7fdf5d2f6d11f0864200a8fe66ed30c8ec +F src/wal.h 6b3a67ecd7172dcc9f18fc9cd4d76dc4c2166e68 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba - F src/where.c 6aceb72cc58dc06922a9e1604d559c8ca4c3e728 - F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 - F src/wherecode.c 4c96182e7b25e4be54008dee2da5b9c2f8480b9b - F src/whereexpr.c e63244ca06c503e5f3c5b7f3c9aea0db826089ed + F src/where.c b18edbb9e5afabb77f4f27550c471c5c824e0fe7 + F src/whereInt.h e20801d89e34de1912bb6a3babb30c390da27add + F src/wherecode.c dfbfe198e418b01f208b489e088edd230c91a4e7 + F src/whereexpr.c eebba8340c90de73b3d3bbe8c43b84559b8e6e2c -F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 +F test/8_3_names.test 05034aadccd2253ffe6cbefb06662b8aa4600f77 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test b35b4cd69fc913f90d39a575e171e1116c3a4bb7 @@@ -1043,22 -1040,22 +1045,22 @@@ F test/speedtest1.c f8bf04214e7b5f745fe F test/spellfix.test 0597065ff57042df1f138e6a2611ae19c2698135 F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/sqldiff1.test 8f6bc7c6a5b3585d350d779c6078869ba402f8f5 - F test/sqllimits1.test 89b3d5aad05b99f707ee3786bdd4416dccf83304 + F test/sqllimits1.test a74ee2a3740b9f9c2437c246d8fb77354862a142 F test/sqllog.test a8faa2df39610a037dd372ed872d124260d32953 -F test/stat.test 8de91498c99f5298b303f70f1d1f3b9557af91bf +F test/stat.test d7607786af4054f277f6d48b2465f27b61f380f7 F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 -F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9 +F test/stmt.test 78a6764439cfa5abdcbf98d4d084739e81eeec4f F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f F test/subquery2.test 438f8a7da1457277b22e4176510f7659b286995f F test/subselect.test d24fd8757daf97dafd2e889c73ea4c4272dcf4e4 F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8 -F test/superlock.test 1cde669f68d2dd37d6c9bd35eee1d95491ae3fc2 +F test/superlock.test 2b27b4ae7c6b9d534b0412e0d99f989aa1f3b9cf - F test/symlink.test 2513f7c030df0f435c6415687ba8b739f3d312df + F test/symlink.test cbf6cb8c6c4b63a39e9f0f6b0d5c99e249dbc102 F test/sync.test a34cd43e98b7fb84eabbf38f7ed8f7349b3f3d85 - F test/syscall.test fba9ebdc6905d05bba6a835e691f20ed9ea2cc88 + F test/syscall.test 2aa9e111b79fb385681ff8940124def6f8faab87 F test/sysfault.test fa776e60bf46bdd3ae69f0b73e46ee3977a58ae6 - F test/tabfunc01.test 03c4ad422c6ab596cff6dcaf86dd061a9f039525 + F test/tabfunc01.test cc33684f9480fcf1fd5ce287ac28d22971cad1cc F test/table.test b708f3e5fa2542fa51dfab21fc07b36ea445cb2f F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 @@@ -1409,7 -1408,7 +1413,7 @@@ F tool/vdbe_profile.tcl 246d0da094856d7 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f - P f9060b2a9860b09ea0e268f6c135a2c78bc8d12d 126b998cf163dcdd5a222634f1e929f04db3c700 - R df6d884037dca343cf419efa4c114cdb -P 3e1d71fcaf57c0223ab9a7366c8607f8f66bb21c -R 0397cf9717330ffe9055735c8207c81a ++P 2c9e5436bd9146f0d76eb58e75cb76109d074ff7 4f2bcff94c672312805be1400050a7026f93a9d7 ++R 1c500c6cf448d5bf63a82e6dfd2aaad7 U drh - Z 5ea58909e6378f1c3d3e2b46f59923ff -Z 6381d064415ccbeec9de47fb6017aaa8 ++Z 126ab2bbf11a0fdb5ff4a3332b3c23bf diff --cc manifest.uuid index 9f5e0df45a,c4252b6021..4cd9ac6f7f --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - 2c9e5436bd9146f0d76eb58e75cb76109d074ff7 -4f2bcff94c672312805be1400050a7026f93a9d7 ++e1fb33c7d2bfd8ea115e667d7671a7529cd116aa diff --cc src/main.c index a0a3370f4f,2bcecdb78b..197d701eb8 --- a/src/main.c +++ b/src/main.c @@@ -3539,16 -3420,11 +3539,19 @@@ int sqlite3_file_control(sqlite3 *db, c if( op==SQLITE_FCNTL_FILE_POINTER ){ *(sqlite3_file**)pArg = fd; rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_VFS_POINTER ){ + *(sqlite3_vfs**)pArg = sqlite3PagerVfs(pPager); + rc = SQLITE_OK; }else if( fd->pMethods ){ rc = sqlite3OsFileControl(fd, op, pArg); +#ifndef SQLITE_OMIT_WAL + if( (rc==SQLITE_OK)&&(op==SQLITE_FCNTL_LAST_ERRNO)&&(*(int *)pArg==0) ){ + sqlite3_file *pWalFd = sqlite3PagerWalFile(pPager); + if( pWalFd&&(pWalFd->pMethods) ){ + rc = sqlite3OsFileControl(pWalFd, op, pArg); + } + } +#endif }else{ rc = SQLITE_NOTFOUND; } diff --cc src/os_unix.c index 9ef0310362,5f4cbca2aa..b1a24b5677 --- a/src/os_unix.c +++ b/src/os_unix.c @@@ -2123,16 -1755,10 +2072,14 @@@ static int posixUnlock(sqlite3_file *id lock.l_whence = SEEK_SET; lock.l_start = SHARED_FIRST; lock.l_len = divSize; - if( unixFileLock(pFile, &lock)==(-1) ){ + if( unixFileLock(pFile, &lock, 10)==(-1) ){ tErrno = errno; +#if OSLOCKING_CHECK_BUSY_IOERR + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); +#else rc = SQLITE_IOERR_UNLOCK; +#endif - if( IS_LOCK_ERROR(rc) ){ - storeLastErrno(pFile, tErrno); - } + storeLastErrno(pFile, tErrno); goto end_unlock; } lock.l_type = F_RDLCK; @@@ -2155,16 -1777,10 +2102,17 @@@ lock.l_whence = SEEK_SET; lock.l_start = SHARED_FIRST+divSize; lock.l_len = SHARED_SIZE-divSize; - if( unixFileLock(pFile, &lock)==(-1) ){ + if( unixFileLock(pFile, &lock, 10)==(-1) ){ tErrno = errno; +#if OSLOCKING_CHECK_BUSY_IOERR + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); +#else rc = SQLITE_IOERR_UNLOCK; +#endif + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + storeLastErrno(pFile, tErrno); goto end_unlock; } }else @@@ -2575,18 -2140,12 +2513,16 @@@ static int dotlockUnlock(sqlite3_file * /* To fully unlock the database, delete the lock file */ assert( eFileLock==NO_LOCK ); rc = osRmdir(zLockFile); - if( rc<0 && errno==ENOTDIR ) rc = osUnlink(zLockFile); if( rc<0 ){ int tErrno = errno; - rc = 0; - if( ENOENT != tErrno ){ + if( tErrno==ENOENT ){ + rc = SQLITE_OK; + }else{ +#if OSLOCKING_CHECK_BUSY_IOERR + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); +#else rc = SQLITE_IOERR_UNLOCK; +#endif - } - if( IS_LOCK_ERROR(rc) ){ storeLastErrno(pFile, tErrno); } return rc; @@@ -2671,15 -2227,9 +2604,17 @@@ static int flockCheckReservedLock(sqlit if ( lrc ) { int tErrno = errno; /* unlock failed with an error */ +#if OSLOCKING_CHECK_BUSY_IOERR + lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); +#else lrc = SQLITE_IOERR_UNLOCK; +#endif + if( IS_LOCK_ERROR(lrc) ){ + storeLastErrno(pFile, tErrno); + rc = lrc; + } + storeLastErrno(pFile, tErrno); + rc = lrc; } } else { int tErrno = errno; @@@ -3855,22 -3391,18 +3782,27 @@@ static int full_fsync(int fd, int fullS #endif /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a - ** no-op + ** no-op. But go ahead and call fstat() to validate the file + ** descriptor as we need a method to provoke a failure during + ** coverate testing. */ #ifdef SQLITE_NO_SYNC - rc = SQLITE_OK; + { + struct stat buf; + rc = osFstat(fd, &buf); + } #elif HAVE_FULLFSYNC if( fullSync ){ +#ifdef SQLITE_USE_REQUEST_FULLFSYNC + rc = osFsync(fd); + if (!rc) { + OSSpinLockLock(¬ify_lock); + rc = notify_post(REQUEST_FULLSYNC_NOTIFICATION); + OSSpinLockUnlock(¬ify_lock); + } +#else rc = osFcntl(fd, F_FULLFSYNC, 0); +#endif }else{ rc = 1; } @@@ -3995,17 -3528,11 +3928,18 @@@ static int unixSync(sqlite3_file *id, i OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, HAVE_FULLFSYNC, isFullsync)); rc = osOpenDirectory(pFile->zPath, &dirfd); - if( rc==SQLITE_OK && dirfd>=0 ){ + if( rc==SQLITE_OK ){ full_fsync(dirfd, 0, 0); +#if OSCLOSE_CHECK_CLOSE_IOERR + if( close(pFile->dirfd) ){ + storeLastErrno(pFile, errno); + rc = SQLITE_IOERR_DIR_CLOSE; + } +#else robust_close(pFile, dirfd, __LINE__); +#endif - }else if( rc==SQLITE_CANTOPEN ){ + }else{ + assert( rc==SQLITE_CANTOPEN ); rc = SQLITE_OK; } pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; @@@ -5026,8 -4210,7 +4945,8 @@@ static int unixOpenSharedMemory(unixFil ** a new *-shm file is created, an attempt will be made to create it ** with the same permissions. */ - if( osFstat(pDbFd->h, &sStat) && pInode->bProcessLock==0 ){ + if( osFstat(pDbFd->h, &sStat) ){ + storeLastErrno(pDbFd, errno); rc = SQLITE_IOERR_FSTAT; goto shm_open_err; } @@@ -7000,16 -5719,12 +6905,16 @@@ static int unixOpen goto open_finished; } - /* If this process is running as root and if creating a new rollback - ** journal or WAL file, set the ownership of the journal or WAL to be - ** the same as the original database. - */ - if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ - robustFchown(fd, uid, gid); + /* if we're opening the wal or journal and running as root, set the + ** journal uid/gid */ + if( !isReadonly && (flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL)) ){ + uid_t euid = geteuid(); + if( euid==0 && (euid!=uid || getegid()!=gid) ){ - if( osFchown(fd, uid, gid) ){ ++ if( robustFchown(fd, uid, gid) ){ + rc = SQLITE_CANTOPEN_BKPT; + goto open_finished; + } + } } } assert( fd>=0 ); @@@ -7156,14 -5860,9 +7061,15 @@@ static int unixDelete { rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); } +#if OSCLOSE_CHECK_CLOSE_IOERR + if( close(fd)&&!rc ){ + rc = SQLITE_IOERR_DIR_CLOSE; + } +#else robust_close(0, fd, __LINE__); +#endif - }else if( rc==SQLITE_CANTOPEN ){ + }else{ + assert( rc==SQLITE_CANTOPEN ); rc = SQLITE_OK; } } diff --cc src/pager.h index 11c2b537f6,cf9cda625d..fbf5b014d2 --- a/src/pager.h +++ b/src/pager.h @@@ -182,9 -182,8 +182,9 @@@ u32 sqlite3PagerDataVersion(Pager*) #endif int sqlite3PagerMemUsed(Pager*); const char *sqlite3PagerFilename(Pager*, int); - const sqlite3_vfs *sqlite3PagerVfs(Pager*); + sqlite3_vfs *sqlite3PagerVfs(Pager*); sqlite3_file *sqlite3PagerFile(Pager*); +sqlite3_file *sqlite3PagerWalFile(Pager *pPager); const char *sqlite3PagerJournalname(Pager*); int sqlite3PagerNosync(Pager*); void *sqlite3PagerTempSpace(Pager*);