From add995cc25875a2b9ab0fbe49a7ba307d9be54df Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 13 Dec 2011 16:40:33 +0000 Subject: [PATCH 1/5] Add extra tests for the multiplexor VFS. No changes to code. FossilOrigin-Name: c7de6f683d0fec62bc138b4a53b5cccc80c736c3 --- manifest | 15 ++++----- manifest.uuid | 2 +- test/multiplex2.test | 72 ++++++++++++++++++++++++++++++++++++++++++++ test/multiplex3.test | 46 ++++++++++++++++++++++++---- 4 files changed, 121 insertions(+), 14 deletions(-) create mode 100644 test/multiplex2.test diff --git a/manifest b/manifest index 53293465dd..2927bef9ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\smultiplex.test\sscript\sto\sconform\sto\sthat\sfound\sin\sthe\s"experimental"\nbranch\soff\sof\strunk. -D 2011-12-13T15:25:06.872 +C Add\sextra\stests\sfor\sthe\smultiplexor\sVFS.\sNo\schanges\sto\scode. +D 2011-12-13T16:40:33.044 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -606,7 +606,8 @@ F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 F test/misc7.test eafaa41b9133d7a2ded4641bbe5f340731d35a52 F test/misuse.test ba4fb5d1a6101d1c171ea38b3c613d0661c83054 F test/multiplex.test 8bc3c71f73fe833bc8a659d454d320044a33b5da -F test/multiplex3.test 2860177d0ec8d494c538f2199b8812df1c09c7c5 +F test/multiplex2.test 7e507a63f3981731556224b23646d29013b98c03 +F test/multiplex3.test 6772008fcaa754ae1b5ddc27c55aa813b12569b2 F test/mutex1.test 78b2b9bb320e51d156c4efdb71b99b051e7a4b41 F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test e9648b9d007c7045242af35e11a984d4b169443a @@ -977,7 +978,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P eb95d2f72c625bcfd0f8e9db1db2cb8799854b57 -R f11319d97c8d3b9123b61c079ca9c86c -U drh -Z b47be607cba7caec297cb5893d5ae313 +P 2eb79efbff9cdab843b172e9fa9fb400c542fab1 +R 77c5fb359ca24a528b4e0f7440c132da +U dan +Z 0e58dc3998254ef9753cd678e848dfd4 diff --git a/manifest.uuid b/manifest.uuid index a66362662f..fe6cb114ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2eb79efbff9cdab843b172e9fa9fb400c542fab1 \ No newline at end of file +c7de6f683d0fec62bc138b4a53b5cccc80c736c3 \ No newline at end of file diff --git a/test/multiplex2.test b/test/multiplex2.test new file mode 100644 index 0000000000..b3a1656b02 --- /dev/null +++ b/test/multiplex2.test @@ -0,0 +1,72 @@ +# 2010 October 29 +# +# 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. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/malloc_common.tcl +source $testdir/lock_common.tcl +db close + +do_multiclient_test tn { + foreach f [glob -nocomplain test.*] { forcedelete $f } + + code1 { catch { sqlite3_multiplex_initialize "" 0 } } + code2 { catch { sqlite3_multiplex_initialize "" 0 } } + + code1 { db close } + code2 { db2 close } + + code1 { sqlite3 db test.db -vfs multiplex } + code2 { sqlite3 db2 test.db -vfs multiplex } + + code1 { sqlite3_multiplex_control db main chunk_size [expr 1024*1024] } + code2 { sqlite3_multiplex_control db2 main chunk_size [expr 1024*1024] } + + sql1 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(randomblob(10), randomblob(4000)); -- 1 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 2 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 4 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 8 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 16 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 32 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 64 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 128 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 256 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 512 + SELECT count(*) FROM t1; + } + + do_test multiplex-1.$tn.1 { sql1 { SELECT count(*) FROM t1 } } 512 + do_test multiplex-1.$tn.2 { sql2 { SELECT count(*) FROM t1 } } 512 + sql2 { DELETE FROM t1 ; VACUUM } + do_test multiplex-1.$tn.3 { sql1 { SELECT count(*) FROM t1 } } 0 + + sql1 { + INSERT INTO t1 VALUES(randomblob(10), randomblob(4000)); -- 1 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 2 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 4 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 8 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 16 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 32 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 64 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 128 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 256 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 512 + SELECT count(*) FROM t1; + } + + do_test multiplex-1.$tn.4 { sql2 { SELECT count(*) FROM t1 } } 512 +} + +catch { sqlite3_multiplex_shutdown } +finish_test diff --git a/test/multiplex3.test b/test/multiplex3.test index b1fd4d1f84..9764ab4e60 100644 --- a/test/multiplex3.test +++ b/test/multiplex3.test @@ -55,8 +55,7 @@ proc multiplex_restore_db {} { foreach f [glob -nocomplain test.*] {forcedelete $f} foreach f [glob -nocomplain sv_test.*] {forcecopy $f [string range $f 3 end]} } - -do_test 1.0 { +proc setup_and_save_db {} { multiplex_delete_db sqlite3 db file:test.db?8_3_names=1 sqlite3_multiplex_control db main chunk_size [expr 256*1024] @@ -76,14 +75,17 @@ do_test 1.0 { set ::cksum1 [execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a}] db close multiplex_save_db -} {} +} +do_test 1.0 { setup_and_save_db } {} do_faultsim_test 1 -prep { multiplex_restore_db sqlite3 db file:test.db?8_3_names=1 sqlite3_multiplex_control db main chunk_size [expr 256*1024] } -body { - execsql "UPDATE t1 SET a=randomblob(12), b=randomblob(1500) WHERE (rowid%32)=0" + execsql { + UPDATE t1 SET a=randomblob(12), b=randomblob(1500) WHERE (rowid%32)=0 + } } -test { faultsim_test_result {0 {}} if {$testrc!=0} { @@ -92,8 +94,40 @@ do_faultsim_test 1 -prep { } } -catch { db close } +#------------------------------------------------------------------------- +# The following tests verify that hot-journal rollback works. As follows: +# +# 1. Create a large database. +# 2. Set the pager cache to be very small. +# 3. Open a transaction. +# 4. Run the following 100 times: +# a. Update a row. +# b. Copy all files on disk to a new db location, including the journal. +# c. Verify that the new db can be opened and that the content matches +# the database created in step 1 (proving the journal was rolled +# back). +do_test 2.0 { + setup_and_save_db + multiplex_restore_db + sqlite3 db file:test.db?8_3_names=1 + execsql { PRAGMA cache_size = 10 } + execsql { BEGIN } +} {} + +for {set iTest 1} {$iTest<=100} {incr iTest} { + do_test 2.$iTest { + execsql { + UPDATE t1 SET a=randomblob(12), b=randomblob(1400) WHERE rowid=5*$iTest + } + foreach f [glob -nocomplain test.*] {forcecopy $f "xx_$f"} + sqlite3 db2 file:xx_test.db?8_3_names=1 + execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a} db2 + } $::cksum1 + + db2 close +} + +catch { db close } sqlite3_multiplex_shutdown finish_test - From c7f946297a47319ac70b237a624a97495fc6b2ba Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 13 Dec 2011 18:22:38 +0000 Subject: [PATCH 2/5] Change the SQLITE_EXTRA_INIT routine to take a single argument which is a pointer to a string. Call SQLITE_EXTRA_INIT with a NULL argument. Fixes to multiplexor to treat the VFS properly in corner cases. Fix the initialization of multiplex3.test. FossilOrigin-Name: 8e65b9132530e46c62bd1352bfc2e9c29f57af5f --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/main.c | 4 ++-- src/test_multiplex.c | 4 ++-- test/multiplex3.test | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 2927bef9ea..3dc07e0bd5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sextra\stests\sfor\sthe\smultiplexor\sVFS.\sNo\schanges\sto\scode. -D 2011-12-13T16:40:33.044 +C Change\sthe\sSQLITE_EXTRA_INIT\sroutine\sto\stake\sa\ssingle\sargument\swhich\sis\sa\npointer\sto\sa\sstring.\s\sCall\sSQLITE_EXTRA_INIT\swith\sa\sNULL\sargument.\nFixes\sto\smultiplexor\sto\streat\sthe\sVFS\sproperly\sin\scorner\scases.\s\sFix\sthe\ninitialization\sof\smultiplex3.test. +D 2011-12-13T18:22:38.364 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -147,7 +147,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 8fc06b5ab42330f26d13fbd8f969eead1d214556 +F src/main.c e7e6985365795ef6c500d05d766222222efbb0ac F src/malloc.c 591aedb20ae40813f1045f2ef253438a334775d9 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 7456e2ca0524609ebc06a9befeda5289d4575ad4 @@ -214,7 +214,7 @@ F src/test_intarray.h 489edb9068bb926583445cb02589344961054207 F src/test_journal.c 03313c693cca72959dcaaf79f8d76f21c01e19ff F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e F src/test_malloc.c 8d416f29ad8573f32601f6056c9d2b17472e9ad5 -F src/test_multiplex.c 10aaf8b7ebeb74f82d5c96e06c398b776917e457 +F src/test_multiplex.c c8cfaa7fa15494454a39c7e79241760d5fbe2c0c F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec @@ -607,7 +607,7 @@ F test/misc7.test eafaa41b9133d7a2ded4641bbe5f340731d35a52 F test/misuse.test ba4fb5d1a6101d1c171ea38b3c613d0661c83054 F test/multiplex.test 8bc3c71f73fe833bc8a659d454d320044a33b5da F test/multiplex2.test 7e507a63f3981731556224b23646d29013b98c03 -F test/multiplex3.test 6772008fcaa754ae1b5ddc27c55aa813b12569b2 +F test/multiplex3.test e17b73e904dbd789de37192b6b94424e6f847bc3 F test/mutex1.test 78b2b9bb320e51d156c4efdb71b99b051e7a4b41 F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test e9648b9d007c7045242af35e11a984d4b169443a @@ -978,7 +978,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 2eb79efbff9cdab843b172e9fa9fb400c542fab1 -R 77c5fb359ca24a528b4e0f7440c132da -U dan -Z 0e58dc3998254ef9753cd678e848dfd4 +P c7de6f683d0fec62bc138b4a53b5cccc80c736c3 +R c2c58817769bc21d103f97b44c17e047 +U drh +Z e8a8ea3bf562796b70179d1fa7b7b6fa diff --git a/manifest.uuid b/manifest.uuid index fe6cb114ee..8aab40e318 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7de6f683d0fec62bc138b4a53b5cccc80c736c3 \ No newline at end of file +8e65b9132530e46c62bd1352bfc2e9c29f57af5f \ No newline at end of file diff --git a/src/main.c b/src/main.c index 229af8607c..7abde24e71 100644 --- a/src/main.c +++ b/src/main.c @@ -239,8 +239,8 @@ int sqlite3_initialize(void){ */ #ifdef SQLITE_EXTRA_INIT if( rc==SQLITE_OK && sqlite3GlobalConfig.isInit ){ - int SQLITE_EXTRA_INIT(void); - rc = SQLITE_EXTRA_INIT(); + int SQLITE_EXTRA_INIT(const char*); + rc = SQLITE_EXTRA_INIT(0); } #endif diff --git a/src/test_multiplex.c b/src/test_multiplex.c index ce55bad083..0208d2d98d 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -455,7 +455,7 @@ static int multiplexOpen( sqlite3_int64 sz; rc2 = pSubOpen->pMethods->xFileSize(pSubOpen, &sz); - if( rc2==SQLITE_OK ){ + if( rc2==SQLITE_OK && zName ){ /* If the first overflow file exists and if the size of the main file ** is different from the chunk size, that means the chunk size is set ** set incorrectly. So fix it. @@ -857,7 +857,7 @@ static int multiplexSectorSize(sqlite3_file *pConn){ multiplexConn *p = (multiplexConn*)pConn; int rc; sqlite3_file *pSubOpen = multiplexSubOpen(p->pGroup, 0, &rc, NULL); - if( pSubOpen ){ + if( pSubOpen && pSubOpen->pMethods->xSectorSize ){ return pSubOpen->pMethods->xSectorSize(pSubOpen); } return DEFAULT_SECTOR_SIZE; diff --git a/test/multiplex3.test b/test/multiplex3.test index 9764ab4e60..bdb264fdec 100644 --- a/test/multiplex3.test +++ b/test/multiplex3.test @@ -14,7 +14,7 @@ # the multiplexor extension with 8.3 filenames. # -set testdir $env(SQLITE_TEST_DIR) +set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/malloc_common.tcl set ::testprefix multiplex3 From 27e69643cf81eb991dc5051c67857325c73220e2 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 13 Dec 2011 19:03:34 +0000 Subject: [PATCH 3/5] Add a hard limit to the number of chunks a multiplexed database may consist of if ENABLE_8_3_NAMES is defined. FossilOrigin-Name: 43a1264088c57bf598787b7a9f5d7a2536603d67 --- manifest | 16 ++++++------- manifest.uuid | 2 +- src/test_multiplex.c | 24 +++++++++++++------ test/multiplex2.test | 55 ++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 77 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 3dc07e0bd5..82b9fafa49 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sSQLITE_EXTRA_INIT\sroutine\sto\stake\sa\ssingle\sargument\swhich\sis\sa\npointer\sto\sa\sstring.\s\sCall\sSQLITE_EXTRA_INIT\swith\sa\sNULL\sargument.\nFixes\sto\smultiplexor\sto\streat\sthe\sVFS\sproperly\sin\scorner\scases.\s\sFix\sthe\ninitialization\sof\smultiplex3.test. -D 2011-12-13T18:22:38.364 +C Add\sa\shard\slimit\sto\sthe\snumber\sof\schunks\sa\smultiplexed\sdatabase\smay\sconsist\sof\sif\sENABLE_8_3_NAMES\sis\sdefined. +D 2011-12-13T19:03:34.498 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -214,7 +214,7 @@ F src/test_intarray.h 489edb9068bb926583445cb02589344961054207 F src/test_journal.c 03313c693cca72959dcaaf79f8d76f21c01e19ff F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e F src/test_malloc.c 8d416f29ad8573f32601f6056c9d2b17472e9ad5 -F src/test_multiplex.c c8cfaa7fa15494454a39c7e79241760d5fbe2c0c +F src/test_multiplex.c 10f881e4508976d970569fe0e7779bfec17907e5 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec @@ -606,7 +606,7 @@ F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 F test/misc7.test eafaa41b9133d7a2ded4641bbe5f340731d35a52 F test/misuse.test ba4fb5d1a6101d1c171ea38b3c613d0661c83054 F test/multiplex.test 8bc3c71f73fe833bc8a659d454d320044a33b5da -F test/multiplex2.test 7e507a63f3981731556224b23646d29013b98c03 +F test/multiplex2.test 896ff138d27688b68c894b8166606454ce915793 F test/multiplex3.test e17b73e904dbd789de37192b6b94424e6f847bc3 F test/mutex1.test 78b2b9bb320e51d156c4efdb71b99b051e7a4b41 F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 @@ -978,7 +978,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P c7de6f683d0fec62bc138b4a53b5cccc80c736c3 -R c2c58817769bc21d103f97b44c17e047 -U drh -Z e8a8ea3bf562796b70179d1fa7b7b6fa +P 8e65b9132530e46c62bd1352bfc2e9c29f57af5f +R 72e3acbb02cd24af246addd5a37e5bd0 +U dan +Z bb7ad67fc331d74f2be1df794e13fcc3 diff --git a/manifest.uuid b/manifest.uuid index 8aab40e318..97f853f6e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8e65b9132530e46c62bd1352bfc2e9c29f57af5f \ No newline at end of file +43a1264088c57bf598787b7a9f5d7a2536603d67 \ No newline at end of file diff --git a/src/test_multiplex.c b/src/test_multiplex.c index 0208d2d98d..85b63b48f4 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -81,6 +81,8 @@ #define sqlite3_mutex_notheld(X) ((void)(X),1) #endif /* SQLITE_THREADSAFE==0 */ +#define SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET 400 + /************************ Shim Definitions ******************************/ @@ -97,7 +99,7 @@ #endif /* This used to be the default limit on number of chunks, but -** it is no longer enforced. There is currently no limit to the +** it is no longer enforced. There is currently no limit to the ** number of chunks. ** ** May be changed by calling the xFileControl() interface. @@ -244,7 +246,7 @@ static int multiplexSubFilename(multiplexGroup *pGroup, int iChunk){ ** 003 and so forth. To avoid name collisions, add 100 to the ** extensions of journal files so that they are 101, 102, 103, .... */ - iChunk += 100; + iChunk += SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET; } #endif sqlite3_snprintf(4,&z[n],"%03d",iChunk); @@ -264,6 +266,18 @@ static sqlite3_file *multiplexSubOpen( ){ sqlite3_file *pSubOpen = 0; sqlite3_vfs *pOrigVfs = gMultiplex.pOrigVfs; /* Real VFS */ + +#ifdef SQLITE_ENABLE_8_3_NAMES + /* If JOURNAL_8_3_OFFSET is set to (say) 500, then any overflow files are + ** part of a database journal are named db.501, db.502, and so on. A + ** database may therefore not grow to larger than 500 chunks. Attempting + ** to open chunk 501 indicates the database is full. */ + if( iChunk>=SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET ){ + *rc = SQLITE_FULL; + return 0; + } +#endif + *rc = multiplexSubFilename(pGroup, iChunk); if( (*rc)==SQLITE_OK && (pSubOpen = pGroup->aReal[iChunk].p)==0 ){ pSubOpen = sqlite3_malloc( pOrigVfs->szOsFile ); @@ -633,7 +647,7 @@ static int multiplexWrite( rc = pSubOpen->pMethods->xWrite(pSubOpen, pBuf, iAmt, iOfst); } }else{ - while( iAmt > 0 ){ + while( rc==SQLITE_OK && iAmt>0 ){ int i = (int)(iOfst / pGroup->szChunk); sqlite3_file *pSubOpen = multiplexSubOpen(pGroup, i, &rc, NULL); if( pSubOpen ){ @@ -643,13 +657,9 @@ static int multiplexWrite( iAmt -= extra; rc = pSubOpen->pMethods->xWrite(pSubOpen, pBuf, iAmt, iOfst % pGroup->szChunk); - if( rc!=SQLITE_OK ) break; pBuf = (char *)pBuf + iAmt; iOfst += iAmt; iAmt = extra; - }else{ - rc = SQLITE_IOERR_WRITE; - break; } } } diff --git a/test/multiplex2.test b/test/multiplex2.test index b3a1656b02..bf5791fe88 100644 --- a/test/multiplex2.test +++ b/test/multiplex2.test @@ -14,6 +14,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/malloc_common.tcl source $testdir/lock_common.tcl +set testprefix multiplex2 db close do_multiclient_test tn { @@ -46,10 +47,10 @@ do_multiclient_test tn { SELECT count(*) FROM t1; } - do_test multiplex-1.$tn.1 { sql1 { SELECT count(*) FROM t1 } } 512 - do_test multiplex-1.$tn.2 { sql2 { SELECT count(*) FROM t1 } } 512 + do_test 1.$tn.1 { sql1 { SELECT count(*) FROM t1 } } 512 + do_test 1.$tn.2 { sql2 { SELECT count(*) FROM t1 } } 512 sql2 { DELETE FROM t1 ; VACUUM } - do_test multiplex-1.$tn.3 { sql1 { SELECT count(*) FROM t1 } } 0 + do_test 1.$tn.3 { sql1 { SELECT count(*) FROM t1 } } 0 sql1 { INSERT INTO t1 VALUES(randomblob(10), randomblob(4000)); -- 1 @@ -65,8 +66,54 @@ do_multiclient_test tn { SELECT count(*) FROM t1; } - do_test multiplex-1.$tn.4 { sql2 { SELECT count(*) FROM t1 } } 512 + do_test 1.$tn.4 { sql2 { SELECT count(*) FROM t1 } } 512 } +catch {db close} +foreach f [glob -nocomplain test.*] { forcedelete $f } + +ifcapable 8_3_names { + sqlite3 db test.db -vfs multiplex + sqlite3_multiplex_control db main chunk_size [expr 256*1024] + + # Insert 512 * 256K (128MB) of data. If each row is around 4K, this means + # we need 32768 rows. + do_catchsql_test 2.1 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(randomblob(10), randomblob(4000)); -- 1 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 2 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 4 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 8 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 16 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 32 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 64 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 128 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 256 + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 512 + + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 1K + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 2K + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 4K + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 8K + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 16K + INSERT INTO t1 SELECT randomblob(10), randomblob(4000) FROM t1; -- 32K + + } {1 {database or disk is full}} + + do_execsql_test 2.2 { + UPDATE t1 SET a=randomblob(9), b=randomblob(3900); + PRAGMA integrity_check; + } ok + + db close + sqlite3 db test.db -vfs multiplex + sqlite3_multiplex_control db main chunk_size [expr 256*1024] + + do_execsql_test 2.3 { + PRAGMA integrity_check; + } ok +} + +catch { db close } catch { sqlite3_multiplex_shutdown } finish_test From 43a6d4bd4434ef62572c98264aaaf4d01b71c4ac Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 14 Dec 2011 01:38:12 +0000 Subject: [PATCH 4/5] Improvements to comments. No code changes. FossilOrigin-Name: 08bbbd8e38697908ab8ae0f6b512d01c32f7e4da --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/test_multiplex.c | 13 +++++++------ 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 82b9fafa49..03d497d4df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\shard\slimit\sto\sthe\snumber\sof\schunks\sa\smultiplexed\sdatabase\smay\sconsist\sof\sif\sENABLE_8_3_NAMES\sis\sdefined. -D 2011-12-13T19:03:34.498 +C Improvements\sto\scomments.\s\sNo\scode\schanges. +D 2011-12-14T01:38:12.485 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -214,7 +214,7 @@ F src/test_intarray.h 489edb9068bb926583445cb02589344961054207 F src/test_journal.c 03313c693cca72959dcaaf79f8d76f21c01e19ff F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e F src/test_malloc.c 8d416f29ad8573f32601f6056c9d2b17472e9ad5 -F src/test_multiplex.c 10f881e4508976d970569fe0e7779bfec17907e5 +F src/test_multiplex.c a61af1bd64a78429c87c79d870bf681b66e7e025 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec @@ -978,7 +978,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 8e65b9132530e46c62bd1352bfc2e9c29f57af5f -R 72e3acbb02cd24af246addd5a37e5bd0 -U dan -Z bb7ad67fc331d74f2be1df794e13fcc3 +P 43a1264088c57bf598787b7a9f5d7a2536603d67 +R bccaf9dcf75a81906ae2a631899b3b9f +U drh +Z 311819ae6733da4a29af5f18337fa8de diff --git a/manifest.uuid b/manifest.uuid index 97f853f6e5..38fadc9ea8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -43a1264088c57bf598787b7a9f5d7a2536603d67 \ No newline at end of file +08bbbd8e38697908ab8ae0f6b512d01c32f7e4da \ No newline at end of file diff --git a/src/test_multiplex.c b/src/test_multiplex.c index 85b63b48f4..c4aeca81b5 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -81,6 +81,7 @@ #define sqlite3_mutex_notheld(X) ((void)(X),1) #endif /* SQLITE_THREADSAFE==0 */ +/* First chunk for rollback journal files */ #define SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET 400 @@ -243,8 +244,8 @@ static int multiplexSubFilename(multiplexGroup *pGroup, int iChunk){ if( i>=n-4 ) n = i+1; if( pGroup->flags & (SQLITE_OPEN_MAIN_JOURNAL|SQLITE_OPEN_TEMP_JOURNAL) ){ /* The extensions on overflow files for main databases are 001, 002, - ** 003 and so forth. To avoid name collisions, add 100 to the - ** extensions of journal files so that they are 101, 102, 103, .... + ** 003 and so forth. To avoid name collisions, add 400 to the + ** extensions of journal files so that they are 401, 402, 403, .... */ iChunk += SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET; } @@ -268,10 +269,10 @@ static sqlite3_file *multiplexSubOpen( sqlite3_vfs *pOrigVfs = gMultiplex.pOrigVfs; /* Real VFS */ #ifdef SQLITE_ENABLE_8_3_NAMES - /* If JOURNAL_8_3_OFFSET is set to (say) 500, then any overflow files are - ** part of a database journal are named db.501, db.502, and so on. A - ** database may therefore not grow to larger than 500 chunks. Attempting - ** to open chunk 501 indicates the database is full. */ + /* If JOURNAL_8_3_OFFSET is set to (say) 400, then any overflow files are + ** part of a database journal are named db.401, db.402, and so on. A + ** database may therefore not grow to larger than 400 chunks. Attempting + ** to open chunk 401 indicates the database is full. */ if( iChunk>=SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET ){ *rc = SQLITE_FULL; return 0; From de60fc2d87a9483cfc1e60ca04381dc07079920b Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 14 Dec 2011 17:53:36 +0000 Subject: [PATCH 5/5] Add a file-control that will discover the name of the bottom-level VFS and all the shims in between. FossilOrigin-Name: cdbfb553af02d10767a905489d9dfc57fc6be54e --- manifest | 33 ++++++++++++++++++--------------- manifest.uuid | 2 +- src/os_unix.c | 6 ++++++ src/os_win.c | 4 ++++ src/shell.c | 13 +++++++++++++ src/sqlite.h.in | 12 ++++++++++++ src/test1.c | 34 ++++++++++++++++++++++++++++++++++ src/test_multiplex.c | 3 +++ src/test_osinst.c | 6 +++++- src/test_quota.c | 6 +++++- src/test_vfstrace.c | 8 ++++++++ test/quota.test | 5 +++++ 12 files changed, 114 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 03d497d4df..a798047867 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\scomments.\s\sNo\scode\schanges. -D 2011-12-14T01:38:12.485 +C Add\sa\sfile-control\sthat\swill\sdiscover\sthe\sname\sof\sthe\sbottom-level\sVFS\sand\nall\sthe\sshims\sin\sbetween. +D 2011-12-14T17:53:36.239 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,8 +166,8 @@ F src/os.c 28bbdab2170dfce84d86c45456a18eab1d0f99a9 F src/os.h 9dbed8c2b9c1f2f2ebabc09e49829d4777c26bf9 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440 -F src/os_unix.c 02b3794c008bab490689399cca9a8b81c1df6eaa -F src/os_win.c a22b88d2c088c09a678a471abafa8d60dbf56803 +F src/os_unix.c baad28b27adc563579170b6d765af0b0cc1d98c8 +F src/os_win.c 823f55855ceb062d72231409b828d0486f09125f F src/pager.c d981f3bfcc0e4460537d983899620700ccf8f539 F src/pager.h 5cd760857707529b403837d813d86b68938d6183 F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 @@ -181,15 +181,15 @@ F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 365ab1c870e38596d6869e76fb544fe6e4ffc809 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c 80f3ac44a8514b1d107b80f5df4a424ae059d2b6 -F src/shell.c 183c4b6a84e82c768fefcc554a1256e89fc8feba -F src/sqlite.h.in 19706a000717456c4963bb0f96262581436ffb5a +F src/shell.c 670644f7bd82073ce0c97c6bff94be04c326beb8 +F src/sqlite.h.in 84cd7be33f5bf39329e018f93eb34b4a345c9c23 F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477 F src/sqliteInt.h f412e020e1009163c74be56eaac1bf7f6c0a4515 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 4568e72dfd36b6a5911f93457364deb072e0b03a F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/tclsqlite.c de581e2e71f5e7f98366156afad83b4742ac6fe0 -F src/test1.c a445a5d09f63ca66a704720dbec240c65806bcd1 +F src/test1.c d019682c4480d612e4eca73412011a120e1468db F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31 F src/test3.c 124ff9735fb6bb7d41de180d6bac90e7b1509432 F src/test4.c d1e5a5e904d4b444cf572391fdcb017638e36ff7 @@ -214,13 +214,13 @@ F src/test_intarray.h 489edb9068bb926583445cb02589344961054207 F src/test_journal.c 03313c693cca72959dcaaf79f8d76f21c01e19ff F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e F src/test_malloc.c 8d416f29ad8573f32601f6056c9d2b17472e9ad5 -F src/test_multiplex.c a61af1bd64a78429c87c79d870bf681b66e7e025 +F src/test_multiplex.c 80677a47c75ca6a035d1ac66fb59186ffd4cdd19 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec -F src/test_osinst.c 62b0b8ef21ce754cc94e17bb42377ed8795dba32 +F src/test_osinst.c 6abf0a37ce831120c4ef1b913afdd813e7ac1a73 F src/test_pcache.c a5cd24730cb43c5b18629043314548c9169abb00 -F src/test_quota.c a391c866217e92986c6f523f05b08aa6956c8419 +F src/test_quota.c ec7d1056936f69be953c343bcb480305ce8928f3 F src/test_rtree.c 6d06306e29946dc36f528a3a2cdc3add794656f1 F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0 F src/test_server.c 2f99eb2837dfa06a4aacf24af24c6affdf66a84f @@ -230,7 +230,7 @@ F src/test_syscall.c a992d8c80ea91fbf21fb2dd570db40e77dd7e6ae F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa F src/test_thread.c 35022393dd54d147b998b6b7f7e945b01114d666 F src/test_vfs.c 27b7d9de40630f603b9e2cf9ef2a7c81d31c4515 -F src/test_vfstrace.c 0b884e06094a746da729119a2cabdc7aa790063d +F src/test_vfstrace.c 065c7270a614254b2c68fbc7ba8d1fb1d5cbc823 F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c c819d9f72168a035d545a5bdafe9b085b20df705 @@ -635,7 +635,7 @@ F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552 F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301 F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 -F test/quota.test 1c59a396e8f7b5d8466fa74b59f2aeb778d74f7a +F test/quota.test e09a01ec974e04a2c4f1c7615005722725b5e131 F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6 F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 F test/randexpr1.test 1084050991e9ba22c1c10edd8d84673b501cc25a @@ -978,7 +978,10 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 43a1264088c57bf598787b7a9f5d7a2536603d67 -R bccaf9dcf75a81906ae2a631899b3b9f +P 08bbbd8e38697908ab8ae0f6b512d01c32f7e4da +R d213e3c5e90076919d50d6149e76976e +T *branch * vfsname-filectrl +T *sym-vfsname-filectrl * +T -sym-nx-devkit * U drh -Z 311819ae6733da4a29af5f18337fa8de +Z 739c7a11bf4ddcfa0aa24a6fb0f05205 diff --git a/manifest.uuid b/manifest.uuid index 38fadc9ea8..d2ab48f170 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -08bbbd8e38697908ab8ae0f6b512d01c32f7e4da \ No newline at end of file +cdbfb553af02d10767a905489d9dfc57fc6be54e \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index ecd5bf2448..3cb28b058d 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -206,6 +206,7 @@ struct UnixUnusedFd { typedef struct unixFile unixFile; struct unixFile { sqlite3_io_methods const *pMethod; /* Always the first entry */ + sqlite3_vfs *pVfs; /* The VFS that created this unixFile */ unixInodeInfo *pInode; /* Info about locks on this inode */ int h; /* The file descriptor */ unsigned char eFileLock; /* The type of lock held on this fd */ @@ -3533,6 +3534,10 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ } return SQLITE_OK; } + case SQLITE_FCNTL_VFSNAME: { + *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); + return SQLITE_OK; + } #ifndef NDEBUG /* The pager calls this method to signal that it has done ** a rollback and that the database is therefore unchanged and @@ -4560,6 +4565,7 @@ static int fillInUnixFile( OSTRACE(("OPEN %-3d %s\n", h, zFilename)); pNew->h = h; + pNew->pVfs = pVfs; pNew->zPath = zFilename; if( memcmp(pVfs->zName,"unix-excl",10)==0 ){ pNew->ctrlFlags = UNIXFILE_EXCL; diff --git a/src/os_win.c b/src/os_win.c index 62868ba504..53cf523538 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -2145,6 +2145,10 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ } return SQLITE_OK; } + case SQLITE_FCNTL_VFSNAME: { + *(char**)pArg = sqlite3_mprintf("win32"); + return SQLITE_OK; + } case SQLITE_FCNTL_SYNC_OMITTED: { return SQLITE_OK; } diff --git a/src/shell.c b/src/shell.c index 07b1b60b41..503d8a6a8d 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1396,6 +1396,7 @@ static char zHelp[] = " If TABLE specified, only list tables matching\n" " LIKE pattern TABLE.\n" ".timeout MS Try opening locked tables for MS milliseconds\n" + ".vfsname ?AUX? Print the name of the VFS stack\n" ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n" ; @@ -2339,6 +2340,18 @@ static int do_meta_command(char *zLine, struct callback_data *p){ sqlite3_libversion(), sqlite3_sourceid()); }else + if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ + const char *zDbName = nArg==2 ? azArg[1] : "main"; + char *zVfsName = 0; + if( p->db ){ + sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); + if( zVfsName ){ + printf("%s\n", zVfsName); + sqlite3_free(zVfsName); + } + } + }else + if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){ int j; assert( nArg<=ArraySize(azArg) ); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 75241da42d..5533728038 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -771,6 +771,17 @@ struct sqlite3_io_methods { ** a write transaction to indicate that, unless it is rolled back for some ** reason, the entire database file will be overwritten by the current ** transaction. This is used by VACUUM operations. +** +** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of +** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** final bottom-level VFS are written into memory obtained from +** [sqlite3_malloc()] and the result is stored in the char* variable +** that the fourth parameter of [sqlite3_file_control()] points to. +** The caller is responsible for freeing the memory when done. As with +** all file-control actions, there is no guarantee that this will actually +** do anything. Callers should initialize the char* variable to a NULL +** pointer in case this file-control is not implemented. This file-control +** is intended for diagnostic use only. */ #define SQLITE_FCNTL_LOCKSTATE 1 #define SQLITE_GET_LOCKPROXYFILE 2 @@ -783,6 +794,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_WIN32_AV_RETRY 9 #define SQLITE_FCNTL_PERSIST_WAL 10 #define SQLITE_FCNTL_OVERWRITE 11 +#define SQLITE_FCNTL_VFSNAME 12 /* ** CAPI3REF: Mutex Handle diff --git a/src/test1.c b/src/test1.c index 3cf9b1375e..3c68743680 100644 --- a/src/test1.c +++ b/src/test1.c @@ -5209,6 +5209,39 @@ static int file_control_persist_wal( } +/* +** tclcmd: file_control_vfsname DB ?AUXDB? +** +** Return a string that describes the stack of VFSes. +*/ +static int file_control_vfsname( + ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ + int objc, /* Number of arguments */ + Tcl_Obj *CONST objv[] /* Command arguments */ +){ + sqlite3 *db; + const char *zDbName = "main"; + char *zVfsName = 0; + + if( objc!=2 && objc!=3 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetStringFromObj(objv[0], 0), " DB ?AUXDB?", 0); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){ + return TCL_ERROR; + } + if( objc==3 ){ + zDbName = Tcl_GetString(objv[2]); + } + sqlite3_file_control(db, zDbName, SQLITE_FCNTL_VFSNAME,(void*)&zVfsName); + Tcl_AppendResult(interp, zVfsName, (char*)0); + sqlite3_free(zVfsName); + return TCL_OK; +} + + /* ** tclcmd: sqlite3_vfs_list ** @@ -6032,6 +6065,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "file_control_sizehint_test", file_control_sizehint_test, 0 }, { "file_control_win32_av_retry", file_control_win32_av_retry, 0 }, { "file_control_persist_wal", file_control_persist_wal, 0 }, + { "file_control_vfsname", file_control_vfsname, 0 }, { "sqlite3_vfs_list", vfs_list, 0 }, { "sqlite3_create_function_v2", test_create_function_v2, 0 }, diff --git a/src/test_multiplex.c b/src/test_multiplex.c index c4aeca81b5..f6540d82dc 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -856,6 +856,9 @@ static int multiplexFileControl(sqlite3_file *pConn, int op, void *pArg){ pSubOpen = multiplexSubOpen(pGroup, 0, &rc, NULL); if( pSubOpen ){ rc = pSubOpen->pMethods->xFileControl(pSubOpen, op, pArg); + if( op==SQLITE_FCNTL_VFSNAME && rc==SQLITE_OK ){ + *(char**)pArg = sqlite3_mprintf("multiplex/%z", *(char**)pArg); + } } break; } diff --git a/src/test_osinst.c b/src/test_osinst.c index 50d6250e6c..b7f350577c 100644 --- a/src/test_osinst.c +++ b/src/test_osinst.c @@ -389,7 +389,11 @@ static int vfslogCheckReservedLock(sqlite3_file *pFile, int *pResOut){ */ static int vfslogFileControl(sqlite3_file *pFile, int op, void *pArg){ VfslogFile *p = (VfslogFile *)pFile; - return p->pReal->pMethods->xFileControl(p->pReal, op, pArg); + int rc = p->pReal->pMethods->xFileControl(p->pReal, op, pArg); + if( op==SQLITE_FCNTL_VFSNAME && rc==SQLITE_OK ){ + *(char**)pArg = sqlite3_mprintf("vfslog/%z", *(char**)pArg); + } + return rc; } /* diff --git a/src/test_quota.c b/src/test_quota.c index 74d1a6d3ba..9aad4967b6 100644 --- a/src/test_quota.c +++ b/src/test_quota.c @@ -589,7 +589,11 @@ static int quotaCheckReservedLock(sqlite3_file *pConn, int *pResOut){ */ static int quotaFileControl(sqlite3_file *pConn, int op, void *pArg){ sqlite3_file *pSubOpen = quotaSubOpen(pConn); - return pSubOpen->pMethods->xFileControl(pSubOpen, op, pArg); + int rc = pSubOpen->pMethods->xFileControl(pSubOpen, op, pArg); + if( op==SQLITE_FCNTL_VFSNAME && rc==SQLITE_OK ){ + *(char**)pArg = sqlite3_mprintf("quota/%z", *(char**)pArg); + } + return rc; } /* Pass xSectorSize requests through to the original VFS unchanged. diff --git a/src/test_vfstrace.c b/src/test_vfstrace.c index 5e94f5cf06..62577207b9 100644 --- a/src/test_vfstrace.c +++ b/src/test_vfstrace.c @@ -471,6 +471,10 @@ static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){ } case SQLITE_FCNTL_FILE_POINTER: zOp = "FILE_POINTER"; break; case SQLITE_FCNTL_SYNC_OMITTED: zOp = "SYNC_OMITTED"; break; + case SQLITE_FCNTL_WIN32_AV_RETRY: zOp = "WIN32_AV_RETRY"; break; + case SQLITE_FCNTL_PERSIST_WAL: zOp = "PERSIST_WAL"; break; + case SQLITE_FCNTL_OVERWRITE: zOp = "OVERWRITE"; break; + case SQLITE_FCNTL_VFSNAME: zOp = "VFSNAME"; break; case 0xca093fa0: zOp = "DB_UNCHANGED"; break; default: { sqlite3_snprintf(sizeof zBuf, zBuf, "%d", op); @@ -482,6 +486,10 @@ static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){ pInfo->zVfsName, p->zFName, zOp); rc = p->pReal->pMethods->xFileControl(p->pReal, op, pArg); vfstrace_print_errcode(pInfo, " -> %s\n", rc); + if( op==SQLITE_FCNTL_VFSNAME && rc==SQLITE_OK ){ + *(char**)pArg = sqlite3_mprintf("vfstrace.%s/%z", + pInfo->zVfsName, *(char**)pArg); + } return rc; } diff --git a/test/quota.test b/test/quota.test index 49b403f1eb..29cb612fd4 100644 --- a/test/quota.test +++ b/test/quota.test @@ -14,6 +14,8 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/malloc_common.tcl +unset -nocomplain defaultVfs +set defaultVfs [file_control_vfsname db] db close do_test quota-1.1 { sqlite3_quota_initialize nosuchvfs 1 } {SQLITE_ERROR} @@ -73,6 +75,9 @@ do_test quota-2.1.2 { } set ::quota } {} +do_test quota-2.1.2.1 { + file_control_vfsname db +} quota/$defaultVfs do_test quota-2.1.3 { file size test.db } {4096} do_test quota-2.1.4 { catchsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }