-C fixed\smemory\sleak\sin\sproxy\slock\sfile\serror\shandling
-D 2010-09-10T23:16:17
+C Integrated\sproxy\slocking\sfile\ssupport\sfor\sWAL\sjournal\smode\sand\sdouble\sfree\sfix
+D 2010-11-09T00:43:59
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in c58f7d37ad0f9b28655ba4e28c6cb0f879569cd7
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F src/legacy.c 015826a958f690302d27e096a68d50b3657e4201
F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
F src/loadext.c 6d422ea91cf3d2d00408c5a8f2391cd458da85f8
-F src/main.c 414f59006f66a665169327700ceb27c2fd0e7c72
+F src/main.c 79573a52c9746bdc3e7942e0127556fa39cdbae5
F src/malloc.c 19a468460c7df72de245f10c06bd0625777b7c83
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 0f36f1eecd786240924a56f8796ffa850d47a96f
F src/os.h 9dbed8c2b9c1f2f2ebabc09e49829d4777c26bf9
F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f
F src/os_os2.c 72d0b2e562952a2464308c4ce5f7913ac10bef3e
-F src/os_unix.c e10e9f086dcf83b6a7cb997edd97a1e3edb92f44
+F src/os_unix.c 79cf726c9a0bcc4691a01389031513c10bf15bed
F src/os_win.c 51cb62f76262d961ea4249489383d714501315a7
F src/pager.c a5f5d9787b11dfb0b6082e6f5846d00b459a8e19
F src/pager.h ef8c8f71ab022cc2fff768a1175dd32355be9dcd
F test/exclusive2.test fcbb1c9ca9739292a0a22a3763243ad6d868086b
F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
F test/expr.test 9f521ae22f00e074959f72ce2e55d46b9ed23f68
-F test/fallocate.test 43dc34b8c24be6baffadc3b4401ee15710ce83c6
+F test/fallocate.test a9927b638567e2e776c112f54d701402a0e74023
F test/filectrl.test 97003734290887566e01dded09dc9e99cb937e9e
F test/filefmt.test f77c92141960b7933bc6691631d2ad62257ef40a
F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00
F test/lock4.test c82268c031d39345d05efa672f80b025481b3ae5
F test/lock5.test d0d313f059ae5661726d3f197ba6ed8f69257d8e
-F test/lock6.test b3cb49eec15cfcd6573b0a52b032046066f12114
+F test/lock6.test 55bbfce7a6905be8282f125c2dbeb8688e2cfd8b
F test/lock7.test 64006c84c1c616657e237c7ad6532b765611cf64
F test/lock_common.tcl 18c637fc89e12f1ac0d27d2186f12c3d3f789e3e
-F test/lock_proxy.test 9ea4307b186949fcfd012e4cd44149d2b6360da6
+F test/lock_proxy.test 95be9c32d79be25cf643b4e41a0aa0e53aa21621
F test/lookaside.test 382e7bc2fab23d902c8eafb1b9ed7ababfff75a6
F test/main.test 753e2b772c041bd8dbd17c7e4132b3981378eaab
F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9
F test/notnull.test cc7c78340328e6112a13c3e311a9ab3127114347
F test/null.test a8b09b8ed87852742343b33441a9240022108993
F test/openv2.test af02ed0a9cbc0d2a61b8f35171d4d117e588e4ec
-F test/pager1.test 3c43e01a1daa7a843b8be832b87e719363f585f2
+F test/pager1.test 4d3bf78c043af2054cfb63897ef3f990a420c6a5
F test/pager2.test 0fbb6b6dc40ce1fecfe758c555a748ad2e9beaa3
F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f
F test/pagerfault.test f168ec2c659faccffc083ec1847bf4295dd67d14
F test/pcache.test 4118a183908ecaed343a06fcef3ba82e87e0129d
F test/pcache2.test 0d85f2ab6963aee28c671d4c71bec038c00a1d16
F test/permutations.test 17498d1219f922d5a6da893a94c4dc7766fb2426
-F test/pragma.test 68abf5033386f89a873e066360e568de8f4c0b29
+F test/pragma.test 90f2386eba9785875dc19c6c464106ad7cca12c1
F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
F test/tempdb.test 285dda9fdf10730702549e8aa19c9258bbf753b8
F test/temptable.test f42121a0d29a62f00f93274464164177ab1cc24a
F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05
-F test/tester.tcl f0dd6c80ec062e2d1a76b8b21ecff36ade1e4a2d
+F test/tester.tcl e4bed769a9e7b55d569fe90e9548fc86d405acf8
F test/thread001.test a3e6a7254d1cb057836cb3145b60c10bf5b7e60f
F test/thread002.test afd20095e6e845b405df4f2c920cb93301ca69db
F test/thread003.test b824d4f52b870ae39fc5bae4d8070eca73085dca
F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d
F test/wal.test d83c3d227e9e9bb5c7a0c1447ea4a3c6cd5fced4
F test/wal2.test 998e1807c7bea96f1a5246adf670d02137118339
-F test/wal3.test 2bc5bed33ba16db805ee00185c083a7c24070fe2
+F test/wal3.test 09278a6f54b3a847b502f426a63a0a3028c4e57e
F test/wal4.test 6a68c45bc1ca24a3592ec449ddcb92b29d0e0e87
F test/wal_common.tcl 895d76138043b86bdccf36494054bdabcf65837b
F test/walbak.test 767e1c9e0ea0cfb907873b332883e66e187fa4bc
F test/walcrash2.test 929c99d14ee2e3e3ef82585058968a8b12f72706
F test/walfault.test 60527645638532a565a8e729db287ef0dba85ece
F test/walhook.test c934ac5219fee2b4e7653d291db9107b8dc73bba
-F test/walmode.test c326079dd35481bbf1bbcf0f74a2d16463c97e49
-F test/walshared.test 985b4a3406b2b2dace1d52a42d26a11dd6900981
+F test/walmode.test 8746ec81f78597e0f988d8e31347dc1b9b22ebbd
+F test/walshared.test 51082db7d1edc720256c524e9b22e92c50f72149
F test/walslow.test 989854bc5c214700a9f2d545bb158643813b8881
F test/walthread.test e6e32e93ccebfa401dfc0dd930c79daa3472b0ae
F test/where.test de337a3fe0a459ec7c93db16a519657a90552330
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 782c33512ab2b677b0734c591fcecddc5a655203
-R 467c6229a39e637a404ffbb673aa3796
+P e01c5f3eda7fe6e6afe9c3894384f09b58173da1
+R 0f46b01a6860ee53146a14c10ec341dc
U adam
-Z da8ed86c71f33338841987133c20b65c
+Z d51fce1db464c676813e4eba90c98e2f
-e01c5f3eda7fe6e6afe9c3894384f09b58173da1
\ No newline at end of file
+fd4d38fa66de85676189ff4922fb1bf5f8cac9c4
\ No newline at end of file
return oldLimit;
}
#if defined(SQLITE_ENABLE_AUTO_PROFILE)
-static void profile_sql(void *aux, const char *sql, uint64_t ns) {
+static void profile_sql(void *aux, const char *sql, u64 ns) {
#pragma unused(aux)
fprintf(stderr, "Query: %s\n Execution Time: %llu ms\n", sql, ns / 1000000);
}
}
}
+static int isProxyLockingMode(unixFile *);
+static const char *proxySharedMemoryBasePath(unixFile *);
+
/*
** Open a shared-memory area associated with open database file pDbFd.
** This particular implementation uses mmapped files.
goto shm_open_err;
}
+ const char *zBasePath = pDbFd->zPath;
+#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
+ /* If pDbFd is configured with proxy locking mode, use the local
+ ** lock file path to determine the -shm file path
+ */
+ if( isProxyLockingMode(pDbFd) ){
+ zBasePath = proxySharedMemoryBasePath(pDbFd);
+ if( !zBasePath ){
+ rc = SQLITE_CANTOPEN_BKPT;
+ goto shm_open_err;
+ }
+ }
+#endif
+
#ifdef SQLITE_SHM_DIRECTORY
nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 30;
#else
- nShmFilename = 5 + (int)strlen(pDbFd->zPath);
+ nShmFilename = 5 + (int)strlen(zBasePath);
#endif
pShmNode = sqlite3_malloc( sizeof(*pShmNode) + nShmFilename );
if( pShmNode==0 ){
SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x",
(u32)sStat.st_ino, (u32)sStat.st_dev);
#else
- sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", pDbFd->zPath);
+ sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", zBasePath);
#endif
pShmNode->h = -1;
pDbFd->pInode->pShmNode = pShmNode;
IOMETHODS(
proxyIoFinder, /* Finder function name */
proxyIoMethods, /* sqlite3_io_methods object name */
- 1, /* shared memory is disabled */
+ 2, /* shared memory is enabled */
proxyClose, /* xClose method */
proxyLock, /* xLock method */
proxyUnlock, /* xUnlock method */
if( envforce!=NULL ){
useProxy = atoi(envforce)>0;
}else{
- struct statfs fsInfo;
- if( statfs(zPath, &fsInfo) == -1 ){
- /* In theory, the close(fd) call is sub-optimal. If the file opened
- ** with fd is a database file, and there are other connections open
- ** on that file that are currently holding advisory locks on it,
- ** then the call to close() will cancel those locks. In practice,
- ** we're assuming that statfs() doesn't fail very often. At least
- ** not while other file descriptors opened by the same process on
- ** the same file are working. */
- p->lastErrno = errno;
- if( dirfd>=0 ){
- close(dirfd); /* silently leak if fail, in error */
- }
- close(fd); /* silently leak if fail, in error */
- rc = SQLITE_IOERR_ACCESS;
- goto open_finished;
- }
useProxy = !(fsInfo.f_flags&MNT_LOCAL);
}
if( useProxy ){
return 0;
}
+static int isProxyLockingMode(unixFile *pFile) {
+ return (pFile->pMethod == &proxyIoMethods) ? 1 : 0;
+}
+
+/*
+** Return the shared memory base path based on the lock proxy file if the
+** lock proxy file is hosted on a shared memory compatible FS
+*/
+static const char *proxySharedMemoryBasePath(unixFile *pFile) {
+ proxyLockingContext *pCtx;
+ unixFile *pLockFile;
+
+ assert(pFile!=NULL && pFile->lockingContext!=NULL);
+ assert(pFile->pMethod == &proxyIoMethods);
+ pCtx = ((proxyLockingContext *)(pFile->lockingContext));
+ pLockFile = pCtx->lockProxy;
+ if( pLockFile->pMethod->iVersion>=2 && pLockFile->pMethod->xShmMap!=0 ){
+ return pCtx->lockProxyPath;
+ }
+ return NULL;
+}
+
/*
** Create a new VFS file descriptor (stored in memory obtained from
** sqlite3_malloc) and open the file named "path" in the file descriptor.
*ppFile = pNew;
return SQLITE_OK;
}
- sqlite3_free(pNew->pUnused);
end_create_proxy:
close(fd); /* silently leak fd if error, we're already in error */
sqlite3_free(pNew);
switch( op ){
case SQLITE_GET_LOCKPROXYFILE: {
unixFile *pFile = (unixFile*)id;
- if( pFile->pMethod == &proxyIoMethods ){
+ if( isProxyLockingMode(pFile) ){
proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext;
proxyTakeConch(pFile);
if( pCtx->lockProxyPath ){
case SQLITE_SET_LOCKPROXYFILE: {
unixFile *pFile = (unixFile*)id;
int rc = SQLITE_OK;
- int isProxyStyle = (pFile->pMethod == &proxyIoMethods);
+ int isProxyStyle = isProxyLockingMode(pFile);
if( pArg==NULL || (const char *)pArg==0 ){
if( isProxyStyle ){
- /* turn off proxy locking - not supported */
+ /* turn off proxy locking - not supported. If support is added for
+ ** switching proxy locking mode off then it will need to fail if
+ ** the journal mode is WAL mode.
+ */
rc = SQLITE_ERROR /*SQLITE_PROTOCOL? SQLITE_MISUSE?*/;
}else{
/* turn off proxy locking - already off - NOOP */
[permutation]=="journaltest" || [permutation]=="inmemory_journal"
}]
ifcapable !wal { set skipwaltests 1 }
+if {![wal_is_ok]} { set skipwaltests 1 }
if {!$skipwaltests} {
db close
set lockpath
} {{:auto: (not held)}}
- set lpp [pwd]/notmine
+ set lpp [exec mktemp -t fail]
do_test lock6-1.4.1 {
execsql "PRAGMA lock_proxy_file='$lpp'"
catchsql {
catch {testfixture $::tf1 {db close}}
- set lpp [pwd]/mine
+ set lpp [exec mktemp -t ok]
do_test lock6-1.6 {
execsql "PRAGMA lock_proxy_file='$lpp'"
execsql {
file delete -force test.db.lock
#####################################################################
-ifcapable lock_proxy_pragmas {
+ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
set ::using_proxy 0
foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
set ::using_proxy $value
file delete -force test.db
-ifcapable lock_proxy_pragmas {
+ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy
}
do_test pager1-7.1.$tn.2 { list $J $W } [list $js $ws]
}
}
-} else {
- do_test pager1-7.1.wal_is_not_ok {
- execsql { PRAGMA journal_mode = WAL }
- } {delete}
}
do_test pager1-7.2.1 {
# the same database.
#
catch { db close }
-do_multiclient_test tn {
- do_test pager1-28.$tn.1 {
- sql1 {
- PRAGMA journal_mode = WAL;
- CREATE TABLE t1(a, b);
- INSERT INTO t1 VALUES('a', 'b');
- }
- } {wal}
- do_test pager1-28.$tn.2 { sql2 { SELECT * FROM t1 } } {a b}
-
- do_test pager1-28.$tn.3 { sql1 { PRAGMA locking_mode=exclusive } } {exclusive}
- do_test pager1-28.$tn.4 {
- csql1 { BEGIN; INSERT INTO t1 VALUES('c', 'd'); }
- } {1 {database is locked}}
- code2 { db2 close ; sqlite3 db2 test.db }
- do_test pager1-28.$tn.4 {
- sql1 { INSERT INTO t1 VALUES('c', 'd'); COMMIT }
- } {}
+if {[wal_is_ok]} {
+ do_multiclient_test tn {
+ do_test pager1-28.$tn.1 {
+ sql1 {
+ PRAGMA journal_mode = WAL;
+ CREATE TABLE t1(a, b);
+ INSERT INTO t1 VALUES('a', 'b');
+ }
+ } {wal}
+ do_test pager1-28.$tn.2 { sql2 { SELECT * FROM t1 } } {a b}
+
+ do_test pager1-28.$tn.3 { sql1 { PRAGMA locking_mode=exclusive } } {exclusive}
+ do_test pager1-28.$tn.4 {
+ csql1 { BEGIN; INSERT INTO t1 VALUES('c', 'd'); }
+ } {1 {database is locked}}
+ code2 { db2 close ; sqlite3 db2 test.db }
+ do_test pager1-28.$tn.4 {
+ sql1 { INSERT INTO t1 VALUES('c', 'd'); COMMIT }
+ } {}
+ }
}
#-------------------------------------------------------------------------
dbX eval {PRAGMA temp_store_directory = ""}
dbX close
-ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
+set skip_lock_proxy_tests [path_is_dos "."]
+ifcapable !lock_proxy_pragmas&&prefer_proxy_locking {
+ set skip_lock_proxy_tests 1
+}
+
+if !$skip_lock_proxy_tests {
set sqlite_hostid_num 1
set using_proxy 0
sqlite3 db test.db
# set lock proxy name and then query it via pragma interface
- set lpp [pwd]/proxyfile_1
+ set lpp [exec mktemp -t 'proxy1']
do_test pragma-16.1 {
execsql "PRAGMA lock_proxy_file='$lpp'"
execsql "select * from sqlite_master"
} $lpp
db2 close
- set lpp2 [pwd]/proxyfile_2
+ set lpp2 [exec mktemp -t 'proxy2']
# 2nd database connection cannot override the lock proxy file
do_test pragma-16.3 {
} db2
} {1 {database is locked}}
- set lpp3 [pwd]/unused_proxyfile
+ set lpp3 [exec mktemp -t 'proxy3']
# lock proxy file can be renamed if no other connections are active
do_test pragma-16.4 {
} {1 {database is locked}}
db2 close
- set lpp4 [pwd]/proxyfile_4
+ set lpp4 [exec mktemp -t 'proxy4']
# check that db is unlocked after first host connection closes
do_test pragma-16.8.1 {
} {1}
# ensure creating directories for a lock proxy file works
- set lpp5 [pwd]/proxytest/sub/dir/lock
+ set lpp5 [exec mktemp -d -t "proxy5"]/sub/dir/lock
db close
file delete -force proxytest
do_test pragma-16.10.1 {
set lockpath2 [execsql {
PRAGMA lock_proxy_file;
} db]
- string match "*proxytest/sub/dir/lock" $lockpath2
+ string match "*sub/dir/lock" $lockpath2
} {1}
# ensure that after deleting the path, setting ":auto:" works correctly
file delete -force proxytest
do_test pragma-16.10.2 {
sqlite3 db proxytest.db
- set lockpath2 [execsql {
+ set lockpath3 [execsql {
PRAGMA lock_proxy_file=":auto:";
create table if not exists pt(y);
PRAGMA lock_proxy_file;
} db]
- string match "*proxytest/sub/dir/lock" $lockpath2
+ string match "*sub/dir/lock" $lockpath3
} {1}
# ensure that if the path can not be created (file instead of dir)
} {1}
# make sure we can deal with ugly file paths correctly
- set lpp6 [pwd]/./././////./proxytest/../proxytest/sub/dir/lock
+ set lpp6 [exec mktemp -d -t "proxy6"]/./././////./proxytest/../proxytest/sub/dir/lock
db close
file delete -force proxytest
do_test pragma-16.10.4 {
sqlite3 db proxytest.db
execsql "PRAGMA lock_proxy_file='$lpp6'"
- set lockpath2 [execsql {
+ set lockpath4 [execsql {
create table if not exists aa(bb);
PRAGMA lock_proxy_file;
} db]
- string match "*proxytest/sub/dir/lock" $lockpath2
+ string match "*proxytest/sub/dir/lock" $lockpath4
} {1}
# ensure that if the path can not be created (perm), setting :auto: deals
file mkdir proxytest
file attributes proxytest -permission 0000
sqlite3 db proxytest.db
- set lockpath2 [execsql {
+ set lockpath5 [execsql {
PRAGMA lock_proxy_file=":auto:";
create table if not exists cc(bb);
PRAGMA lock_proxy_file;
} db]
- string match "*proxytest.db:auto:" $lockpath2
+ string match "*proxytest.db:auto:" $lockpath5
} {1}
# ensure that if the path can not be created, locking fails
proc wal_is_ok {} {
if { [forced_proxy_locking] } {
- return 0
+ return 1
}
if { ![path_is_local "."] } {
return 0
#-------------------------------------------------------------------------
#
do_test wal3-8.1 {
- file delete -force test.db test.db-journal test.db wal
+ file delete -force test.db test.db-journal test.db wal .test.db-conch
sqlite3 db test.db
sqlite3 db2 test.db
execsql {
finish_test
return
}
-if { ![wal_is_ok] } {
+if { ![wal_is_ok] && ![path_is_dos "."]} {
do_test walmode-0.1 {
execsql { PRAGMA journal_mode = wal }
} {delete}
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+
+ifcapable !wal {finish_test ; return }
+if { ![wal_is_ok] } {
+ finish_test
+ return
+}
+
db close
set ::enable_shared_cache [sqlite3_enable_shared_cache 1]