From afc8b7f0c14ba5acd6d08245e32d1a39fe96a185 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 May 2012 18:06:38 +0000 Subject: [PATCH 1/3] Enable the use of shared cache for an in-memory database, so that separate database connections can share the same in-memory database. FossilOrigin-Name: 4590e433f2a595bb80fb061024b0a3d2ca25b7b2 --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/btree.c | 17 +++++++++++------ src/pager.c | 5 ++++- test/attach.test | 2 +- test/shared.test | 24 +++++++++++++++++++++++- 6 files changed, 52 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index a2de57fcf1..f6549180ff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.7.12.1 -D 2012-05-22T02:45:53.459 +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 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 df800f10896bc2ddaa1125c532d6e7a7b9efc532 +F src/btree.c 23e2d21f1fda37e5addc11935c78b97c7e467d0c F src/btree.h 48a013f8964f12d944d90e4700df47b72dd6d923 F src/btreeInt.h 38a639c0542c29fe8331a221c4aed0cb8686249e F src/build.c 2bb2163bb1e69f59e9f36a9413079ead42fa1d2c @@ -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 bb5635dde0b152797836d1c72275284724bb563c +F src/pager.c 5b14be810f26eeab807d50c5d26b8c8e34a0e6e0 F src/pager.h ef1eaf8593e78f73885c1dfac27ad83bee23bdc5 F src/parse.y f29df90bd3adc64b33114ab1de9fb7768fcf2099 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -269,7 +269,7 @@ F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a F test/async5.test 0dd8701bd588bf6e70c2557a22ae3f22b2567b4c -F test/attach.test 0d112b7713611fdf0340260192749737135fda5f +F test/attach.test 29cf17b5793ad345f97fbfedcaabe6c06a0b5e8e F test/attach2.test e54436ed956d3d88bdee61221da59bf3935a0966 F test/attach3.test d89ccfe4fe6e2b5e368d480fcdfe4b496c54cf4e F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c @@ -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 34945a516532b11182c3eb26e31247eee3c9ae48 +F test/shared.test 4526441129635d89e185dd66a74123dc696264a0 F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879 F test/shared3.test ebf77f023f4bdaa8f74f65822b559e86ce5c6257 F test/shared4.test 72d90821e8d2fc918a08f16d32880868d8ee8e9d @@ -998,10 +998,10 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh a8a0a3babda96dfb1ff51adda3cbbf3dfb7266c2 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 5519cc5ef471e32a59995a34be811b46478dca1e -R f9f0e59804fa7e60869ace7ace22bd3d -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.7.12.1 * +P 6d326d44fd1d626aae0e8456e5fa2049f1ce0789 +R 6a33795d9ed8fa1d5cb60e0ecabf9128 +T *branch * shared-cache-memdb +T *sym-shared-cache-memdb * +T -sym-trunk * U drh -Z a30e57621f706278c1c64a3624297cbb +Z e102daae56ebdb7d93ce4a259efb516f diff --git a/manifest.uuid b/manifest.uuid index ff54f427e8..3875f95cec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6d326d44fd1d626aae0e8456e5fa2049f1ce0789 \ No newline at end of file +4590e433f2a595bb80fb061024b0a3d2ca25b7b2 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 2876526925..a59e6d10cf 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( isMemdb==0 && isTempDb==0 ){ + if( isTempDb==0 ){ if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){ int nFullPathname = pVfs->mxPathname+1; char *zFullPathname = sqlite3Malloc(nFullPathname); @@ -1767,11 +1767,16 @@ int sqlite3BtreeOpen( sqlite3_free(p); return SQLITE_NOMEM; } - rc = sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname); - if( rc ){ - sqlite3_free(zFullPathname); - sqlite3_free(p); - return rc; + if( isMemdb ){ + memcpy(zFullPathname, zFilename, sqlite3Strlen30(zFilename)+1); + }else{ + rc = sqlite3OsFullPathname(pVfs, zFilename, + nFullPathname, zFullPathname); + if( rc ){ + sqlite3_free(zFullPathname); + sqlite3_free(p); + return rc; + } } #if SQLITE_THREADSAFE mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN); diff --git a/src/pager.c b/src/pager.c index b93e0aa866..43c00c7ec4 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4360,6 +4360,8 @@ int sqlite3PagerOpen( #ifndef SQLITE_OMIT_MEMORYDB if( flags & PAGER_MEMORY ){ memDb = 1; + zPathname = sqlite3DbStrDup(0, zFilename); + nPathname = sqlite3Strlen30(zPathname); zFilename = 0; } #endif @@ -6743,7 +6745,8 @@ int sqlite3PagerWalCallback(Pager *pPager){ */ int sqlite3PagerWalSupported(Pager *pPager){ const sqlite3_io_methods *pMethods = pPager->fd->pMethods; - return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap); + return pPager->memDb==0 && + (pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap)); } /* diff --git a/test/attach.test b/test/attach.test index be5f9881c3..211c812804 100644 --- a/test/attach.test +++ b/test/attach.test @@ -857,6 +857,6 @@ do_test attach-10.2 { lrange [execsql { PRAGMA database_list; }] 9 end -} {4 noname {} 5 inmem {}} +} {4 noname {} 5 inmem :memory:} finish_test diff --git a/test/shared.test b/test/shared.test index 37564e6967..156f894a11 100644 --- a/test/shared.test +++ b/test/shared.test @@ -1056,7 +1056,29 @@ do_test shared-$av-15.2 { db close db2 close -} +# Shared cache on a :memory: database. +# +do_test shared-$av-16.1 { + sqlite3 db1 :memory: + sqlite3 db2 :memory: + db1 eval { + CREATE TABLE t1(x); INSERT INTO t1 VALUES(1),(2),(3); + } + db2 eval { + SELECT x FROM t1 ORDER BY x; + } +} {1 2 3} +do_test shared-$av-16.2 { + db2 eval { + INSERT INTO t1 VALUES(99); + DELETE FROM t1 WHERE x=2; + } + db1 eval { + SELECT x FROM t1 ORDER BY x; + } +} {1 3 99} + +} ;# end of autovacuum on/off loop sqlite3_enable_shared_cache $::enable_shared_cache finish_test From 4ab9d254e066247855b8907d001b9994aa072f1f Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 May 2012 20:08:49 +0000 Subject: [PATCH 2/3] 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 --- manifest | 21 +++++++++------------ manifest.uuid | 2 +- src/btree.c | 2 +- src/main.c | 1 + src/pager.c | 9 ++++++--- test/shared.test | 24 +++++++++++++++++++++--- 6 files changed, 39 insertions(+), 20 deletions(-) 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 From d4e0bb0e65a9cb33ba6139152ddbe652a4ea0393 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 27 May 2012 01:19:04 +0000 Subject: [PATCH 3/3] Have user interfaces report out the filename of in-memory databases as an empty string, as it always has. This simplifies the changes. FossilOrigin-Name: 595dfdbffefb2598cba89980f885289d1c5f5833 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/btree.c | 7 ++++--- src/pager.c | 16 +++++++++++----- src/pager.h | 2 +- src/test_btree.c | 2 +- src/vdbe.c | 2 +- test/attach.test | 2 +- 8 files changed, 31 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 1c29c83315..64fa40b9fc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -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 +C Have\suser\sinterfaces\sreport\sout\sthe\sfilename\sof\sin-memory\sdatabases\sas\san\nempty\sstring,\sas\sit\salways\shas.\s\sThis\ssimplifies\sthe\schanges. +D 2012-05-27T01:19:04.951 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 e5e992199f1368343071a22dbebd467f4009f6a5 +F src/btree.c 964c7862e1e27c543d2fff2e537ceadc4026c682 F src/btree.h 48a013f8964f12d944d90e4700df47b72dd6d923 F src/btreeInt.h 38a639c0542c29fe8331a221c4aed0cb8686249e F src/build.c 2bb2163bb1e69f59e9f36a9413079ead42fa1d2c @@ -161,8 +161,8 @@ 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 5a86e85e393705d09fd60e9e525cfb9ff59a8022 -F src/pager.h ef1eaf8593e78f73885c1dfac27ad83bee23bdc5 +F src/pager.c 9d4d6406512002d9a243ec27b9c01e93fda43e36 +F src/pager.h 8b8c9bc065a3c66769df8724dfdf492ee1aab3c5 F src/parse.y f29df90bd3adc64b33114ab1de9fb7768fcf2099 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h 1b5dcc3dc8103d03e625b177023ee67764fa6b7c @@ -194,7 +194,7 @@ F src/test9.c bea1e8cf52aa93695487badedd6e1886c321ea60 F src/test_async.c 0612a752896fad42d55c3999a5122af10dcf22ad F src/test_autoext.c 30e7bd98ab6d70a62bb9ba572e4c7df347fe645e F src/test_backup.c c129c91127e9b46e335715ae2e75756e25ba27de -F src/test_btree.c 47cd771250f09cdc6e12dda5bc71bc0b3abc96e2 +F src/test_btree.c 5b89601dcb42a33ba8b820a6b763cc9cb48bac16 F src/test_config.c 0de329e736eb4aa5845069bed630e5c72f012264 F src/test_demovfs.c 20a4975127993f4959890016ae9ce5535a880094 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc @@ -234,7 +234,7 @@ F src/update.c d3076782c887c10e882996550345da9c4c9f9dea F src/utf.c 890c67dcfcc7a74623c95baac7535aadfe265e84 F src/util.c 4f6cfad661b2e3454b0cdd5b1b9d39a54942d0e3 F src/vacuum.c bfd53f9bd20a8fdb70b0fa8e77182b866875c0d8 -F src/vdbe.c e1d26b98288889c22f00cf4851ec351ee67ad8b9 +F src/vdbe.c b6cb2ac43263843a5612892c0ad2309609b32c26 F src/vdbe.h 18f581cac1f4339ec3299f3e0cc6e11aec654cdb F src/vdbeInt.h 6ff4180a05683566a8835d12f7ec504b22932c82 F src/vdbeapi.c 3662b6a468a2a4605a15dfab313baa6dff81ad91 @@ -269,7 +269,7 @@ F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a F test/async5.test 0dd8701bd588bf6e70c2557a22ae3f22b2567b4c -F test/attach.test 29cf17b5793ad345f97fbfedcaabe6c06a0b5e8e +F test/attach.test 0d112b7713611fdf0340260192749737135fda5f F test/attach2.test e54436ed956d3d88bdee61221da59bf3935a0966 F test/attach3.test d89ccfe4fe6e2b5e368d480fcdfe4b496c54cf4e F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c @@ -998,7 +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 4590e433f2a595bb80fb061024b0a3d2ca25b7b2 -R 150ee74d31f8ee4186fa530c4e755088 +P e3ad61e0308a8442c2bdb7cdb3465576cd39ed4a +R c398af805389f6295630a739d754fa6b U drh -Z d012f21feec13fdb57a1a9d954ad6a98 +Z e51262406d85326f19add0be1c076b3b diff --git a/manifest.uuid b/manifest.uuid index d36bcf291c..e441849bff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3ad61e0308a8442c2bdb7cdb3465576cd39ed4a \ No newline at end of file +595dfdbffefb2598cba89980f885289d1c5f5833 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 136cc196a8..58a9dce1e3 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1786,7 +1786,7 @@ int sqlite3BtreeOpen( #endif for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){ assert( pBt->nRef>0 ); - if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager)) + if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager, 0)) && sqlite3PagerVfs(pBt->pPager)==pVfs ){ int iDb; for(iDb=db->nDb-1; iDb>=0; iDb--){ @@ -8051,14 +8051,15 @@ char *sqlite3BtreeIntegrityCheck( #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ /* -** Return the full pathname of the underlying database file. +** Return the full pathname of the underlying database file. Return +** an empty string if the database is in-memory or a TEMP database. ** ** The pager filename is invariant as long as the pager is ** open so it is safe to access without the BtShared mutex. */ const char *sqlite3BtreeGetFilename(Btree *p){ assert( p->pBt->pPager!=0 ); - return sqlite3PagerFilename(p->pBt->pPager); + return sqlite3PagerFilename(p->pBt->pPager, 1); } /* diff --git a/src/pager.c b/src/pager.c index 0154a5d7f6..425fb78ce4 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4360,7 +4360,7 @@ int sqlite3PagerOpen( #ifndef SQLITE_OMIT_MEMORYDB if( flags & PAGER_MEMORY ){ memDb = 1; - if( zFilename ){ + if( zFilename && zFilename[0] ){ zPathname = sqlite3DbStrDup(0, zFilename); if( zPathname==0 ) return SQLITE_NOMEM; nPathname = sqlite3Strlen30(zPathname); @@ -6301,9 +6301,16 @@ int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ /* ** Return the full pathname of the database file. +** +** Except, if the pager is in-memory only, then return an empty string if +** nullIfMemDb is true. This routine is called with nullIfMemDb==1 when +** used to report the filename to the user, for compatibility with legacy +** behavior. But when the Btree needs to know the filename for matching to +** shared cache, it uses nullIfMemDb==0 so that in-memory databases can +** participate in shared-cache. */ -const char *sqlite3PagerFilename(Pager *pPager){ - return pPager->zFilename; +const char *sqlite3PagerFilename(Pager *pPager, int nullIfMemDb){ + return (nullIfMemDb && pPager->memDb) ? "" : pPager->zFilename; } /* @@ -6748,8 +6755,7 @@ int sqlite3PagerWalCallback(Pager *pPager){ */ int sqlite3PagerWalSupported(Pager *pPager){ const sqlite3_io_methods *pMethods = pPager->fd->pMethods; - return pPager->memDb==0 && - (pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap)); + return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap); } /* diff --git a/src/pager.h b/src/pager.h index eca8a2f077..2b60e058da 100644 --- a/src/pager.h +++ b/src/pager.h @@ -151,7 +151,7 @@ int sqlite3PagerCloseWal(Pager *pPager); u8 sqlite3PagerIsreadonly(Pager*); int sqlite3PagerRefcount(Pager*); int sqlite3PagerMemUsed(Pager*); -const char *sqlite3PagerFilename(Pager*); +const char *sqlite3PagerFilename(Pager*, int); const sqlite3_vfs *sqlite3PagerVfs(Pager*); sqlite3_file *sqlite3PagerFile(Pager*); const char *sqlite3PagerJournalname(Pager*); diff --git a/src/test_btree.c b/src/test_btree.c index 0048397e9e..db72889b2a 100644 --- a/src/test_btree.c +++ b/src/test_btree.c @@ -33,7 +33,7 @@ int sqlite3BtreeSharedCacheReport( BtShared *pBt; Tcl_Obj *pRet = Tcl_NewObj(); for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){ - const char *zFile = sqlite3PagerFilename(pBt->pPager); + const char *zFile = sqlite3PagerFilename(pBt->pPager, 1); Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj(zFile, -1)); Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(pBt->nRef)); } diff --git a/src/vdbe.c b/src/vdbe.c index fa5180c9a4..ec4ea2a55d 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5511,7 +5511,7 @@ case OP_JournalMode: { /* out2-prerelease */ if( !sqlite3PagerOkToChangeJournalMode(pPager) ) eNew = eOld; #ifndef SQLITE_OMIT_WAL - zFilename = sqlite3PagerFilename(pPager); + zFilename = sqlite3PagerFilename(pPager, 1); /* Do not allow a transition to journal_mode=WAL for a database ** in temporary storage or if the VFS does not support shared memory diff --git a/test/attach.test b/test/attach.test index 211c812804..be5f9881c3 100644 --- a/test/attach.test +++ b/test/attach.test @@ -857,6 +857,6 @@ do_test attach-10.2 { lrange [execsql { PRAGMA database_list; }] 9 end -} {4 noname {} 5 inmem :memory:} +} {4 noname {} 5 inmem {}} finish_test