From: drh Date: Sat, 26 May 2012 20:08:49 +0000 (+0000) Subject: Only allow :memory: databases to share cache if there are created using a X-Git-Tag: version-3.7.13~26^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4ab9d254e066247855b8907d001b9994aa072f1f;p=thirdparty%2Fsqlite.git Only allow :memory: databases to share cache if there are created using a URI filename. This minimizes the risk of breakages in legacy applications that have shared-cache enabled but also use :memory: databases which they expect to keep separate. FossilOrigin-Name: e3ad61e0308a8442c2bdb7cdb3465576cd39ed4a --- diff --git a/manifest b/manifest index f6549180ff..1c29c83315 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sthe\suse\sof\sshared\scache\sfor\san\sin-memory\sdatabase,\sso\sthat\sseparate\ndatabase\sconnections\scan\sshare\sthe\ssame\sin-memory\sdatabase. -D 2012-05-26T18:06:38.341 +C Only\sallow\s:memory:\sdatabases\sto\sshare\scache\sif\sthere\sare\screated\susing\sa\nURI\sfilename.\s\sThis\sminimizes\sthe\srisk\sof\sbreakages\sin\slegacy\sapplications\nthat\shave\sshared-cache\senabled\sbut\salso\suse\s:memory:\sdatabases\swhich\sthey\nexpect\sto\skeep\sseparate. +D 2012-05-26T20:08:49.030 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2f37e468503dbe79d35c9f6dffcf3fae1ae9ec20 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -118,7 +118,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 6be23a344d3301ae38e92fddb3a33b91c309fce4 F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 23e2d21f1fda37e5addc11935c78b97c7e467d0c +F src/btree.c e5e992199f1368343071a22dbebd467f4009f6a5 F src/btree.h 48a013f8964f12d944d90e4700df47b72dd6d923 F src/btreeInt.h 38a639c0542c29fe8331a221c4aed0cb8686249e F src/build.c 2bb2163bb1e69f59e9f36a9413079ead42fa1d2c @@ -140,7 +140,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 0ee69fca0be54cd93939df98d2aca4ca46f44416 F src/loadext.c f20382fbaeec832438a1ba7797bee3d3c8a6d51d -F src/main.c 91458c713e9b7f8dbc98d79e78f1150f0ca9c2a1 +F src/main.c a2cfba189be2c653eb274c39fc12f169bbb9baa3 F src/malloc.c fe085aa851b666b7c375c1ff957643dc20a04bf6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c b3677415e69603d6a0e7c5410a1b3731d55beda1 @@ -161,7 +161,7 @@ F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440 F src/os_unix.c 424d46e0edab969293c2223f09923b2178171f47 F src/os_win.c 412d6434133c7c81dc48b7702f3ea5e61c309e5c -F src/pager.c 5b14be810f26eeab807d50c5d26b8c8e34a0e6e0 +F src/pager.c 5a86e85e393705d09fd60e9e525cfb9ff59a8022 F src/pager.h ef1eaf8593e78f73885c1dfac27ad83bee23bdc5 F src/parse.y f29df90bd3adc64b33114ab1de9fb7768fcf2099 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -683,7 +683,7 @@ F test/selectA.test 06d1032fa9009314c95394f2ca2e60d9f7ae8532 F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25 F test/selectC.test 871fb55d884d3de5943c4057ebd22c2459e71977 F test/server1.test 46803bd3fe8b99b30dbc5ff38ffc756f5c13a118 -F test/shared.test 4526441129635d89e185dd66a74123dc696264a0 +F test/shared.test 930104c2a6c173a8e21a850163c9e0475846a127 F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879 F test/shared3.test ebf77f023f4bdaa8f74f65822b559e86ce5c6257 F test/shared4.test 72d90821e8d2fc918a08f16d32880868d8ee8e9d @@ -998,10 +998,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh a8a0a3babda96dfb1ff51adda3cbbf3dfb7266c2 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 6d326d44fd1d626aae0e8456e5fa2049f1ce0789 -R 6a33795d9ed8fa1d5cb60e0ecabf9128 -T *branch * shared-cache-memdb -T *sym-shared-cache-memdb * -T -sym-trunk * +P 4590e433f2a595bb80fb061024b0a3d2ca25b7b2 +R 150ee74d31f8ee4186fa530c4e755088 U drh -Z e102daae56ebdb7d93ce4a259efb516f +Z d012f21feec13fdb57a1a9d954ad6a98 diff --git a/manifest.uuid b/manifest.uuid index 3875f95cec..d36bcf291c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4590e433f2a595bb80fb061024b0a3d2ca25b7b2 \ No newline at end of file +e3ad61e0308a8442c2bdb7cdb3465576cd39ed4a \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index a59e6d10cf..136cc196a8 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1757,7 +1757,7 @@ int sqlite3BtreeOpen( ** If this Btree is a candidate for shared cache, try to find an ** existing BtShared object that we can share with */ - if( isTempDb==0 ){ + if( isTempDb==0 && (isMemdb==0 || (vfsFlags&SQLITE_OPEN_URI)!=0) ){ if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){ int nFullPathname = pVfs->mxPathname+1; char *zFullPathname = sqlite3Malloc(nFullPathname); diff --git a/src/main.c b/src/main.c index d148b4b42c..c8fda4787a 100644 --- a/src/main.c +++ b/src/main.c @@ -2055,6 +2055,7 @@ int sqlite3ParseUri( memcpy(zFile, zUri, nUri); zFile[nUri] = '\0'; zFile[nUri+1] = '\0'; + flags &= ~SQLITE_OPEN_URI; } *ppVfs = sqlite3_vfs_find(zVfs); diff --git a/src/pager.c b/src/pager.c index 43c00c7ec4..0154a5d7f6 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4360,9 +4360,12 @@ int sqlite3PagerOpen( #ifndef SQLITE_OMIT_MEMORYDB if( flags & PAGER_MEMORY ){ memDb = 1; - zPathname = sqlite3DbStrDup(0, zFilename); - nPathname = sqlite3Strlen30(zPathname); - zFilename = 0; + if( zFilename ){ + zPathname = sqlite3DbStrDup(0, zFilename); + if( zPathname==0 ) return SQLITE_NOMEM; + nPathname = sqlite3Strlen30(zPathname); + zFilename = 0; + } } #endif diff --git a/test/shared.test b/test/shared.test index 156f894a11..0c5c408b34 100644 --- a/test/shared.test +++ b/test/shared.test @@ -1056,11 +1056,11 @@ do_test shared-$av-15.2 { db close db2 close -# Shared cache on a :memory: database. +# Shared cache on a :memory: database. This only works for URI filenames. # do_test shared-$av-16.1 { - sqlite3 db1 :memory: - sqlite3 db2 :memory: + sqlite3 db1 file::memory: -uri 1 + sqlite3 db2 file::memory: -uri 1 db1 eval { CREATE TABLE t1(x); INSERT INTO t1 VALUES(1),(2),(3); } @@ -1078,6 +1078,24 @@ do_test shared-$av-16.2 { } } {1 3 99} +# Verify that there is no cache sharing ordinary (non-URI) filenames are +# used. +# +do_test shared-$av-16.3 { + db1 close + db2 close + sqlite3 db1 :memory: + sqlite3 db2 :memory: + db1 eval { + CREATE TABLE t1(x); INSERT INTO t1 VALUES(4),(5),(6); + } + catchsql { + SELECT * FROM t1; + } db2 +} {1 {no such table: t1}} +db1 close +db2 close + } ;# end of autovacuum on/off loop sqlite3_enable_shared_cache $::enable_shared_cache