mirror of
https://github.com/sqlite/sqlite.git
synced 2026-10-28 10:57:26 +03:00
Integrated proxy locking file support for WAL journal mode and double free fix
FossilOrigin-Name: fd4d38fa66de85676189ff4922fb1bf5f8cac9c4
This commit is contained in:
@@ -76,6 +76,7 @@ set skipwaltests [expr {
|
||||
[permutation]=="journaltest" || [permutation]=="inmemory_journal"
|
||||
}]
|
||||
ifcapable !wal { set skipwaltests 1 }
|
||||
if {![wal_is_ok]} { set skipwaltests 1 }
|
||||
|
||||
if {!$skipwaltests} {
|
||||
db close
|
||||
|
||||
@@ -126,7 +126,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
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 {
|
||||
@@ -151,7 +151,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
|
||||
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 {
|
||||
|
||||
@@ -27,7 +27,7 @@ db close
|
||||
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
|
||||
@@ -135,7 +135,7 @@ ifcapable lock_proxy_pragmas {
|
||||
|
||||
file delete -force test.db
|
||||
|
||||
ifcapable lock_proxy_pragmas {
|
||||
ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy
|
||||
}
|
||||
|
||||
|
||||
@@ -1130,10 +1130,6 @@ if { $do_wal_tests } {
|
||||
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 {
|
||||
@@ -2276,24 +2272,26 @@ do_test pager1.27.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}
|
||||
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 }
|
||||
} {}
|
||||
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 }
|
||||
} {}
|
||||
}
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -1292,7 +1292,12 @@ sqlite3 dbX :memory:
|
||||
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
|
||||
@@ -1307,7 +1312,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
|
||||
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"
|
||||
@@ -1332,7 +1337,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
} $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 {
|
||||
@@ -1343,7 +1348,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
} 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 {
|
||||
@@ -1399,7 +1404,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
} {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 {
|
||||
@@ -1428,7 +1433,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
} {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 {
|
||||
@@ -1437,7 +1442,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
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
|
||||
@@ -1445,12 +1450,12 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
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)
|
||||
@@ -1469,17 +1474,17 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
} {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
|
||||
@@ -1496,12 +1501,12 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
|
||||
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
|
||||
|
||||
@@ -1183,7 +1183,7 @@ proc forced_proxy_locking {} {
|
||||
|
||||
proc wal_is_ok {} {
|
||||
if { [forced_proxy_locking] } {
|
||||
return 0
|
||||
return 1
|
||||
}
|
||||
if { ![path_is_local "."] } {
|
||||
return 0
|
||||
|
||||
@@ -617,7 +617,7 @@ T delete
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
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 {
|
||||
|
||||
@@ -35,7 +35,7 @@ ifcapable !wal {
|
||||
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}
|
||||
|
||||
@@ -15,6 +15,13 @@
|
||||
|
||||
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]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user