2017-03-16 21:14:39 +03:00
|
|
|
# 2017 March 16
|
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
#***********************************************************************
|
|
|
|
# This file implements regression tests for SQLite library.
|
|
|
|
#
|
|
|
|
# Specificly, it tests that "PRAGMA synchronous" appears to work.
|
|
|
|
#
|
|
|
|
|
|
|
|
set testdir [file dirname $argv0]
|
|
|
|
source $testdir/tester.tcl
|
|
|
|
set testprefix sync2
|
|
|
|
|
|
|
|
#
|
|
|
|
# These tests are only applicable when pager pragma are
|
|
|
|
# enabled. Also, since every test uses an ATTACHed database, they
|
|
|
|
# are only run when ATTACH is enabled.
|
|
|
|
#
|
2017-04-03 16:59:22 +03:00
|
|
|
ifcapable !pager_pragmas||!attach||!dirsync {
|
2017-03-16 21:14:39 +03:00
|
|
|
finish_test
|
|
|
|
return
|
|
|
|
}
|
2017-03-21 13:45:38 +03:00
|
|
|
if {$::tcl_platform(platform)!="unix"
|
|
|
|
|| [permutation] == "journaltest"
|
|
|
|
|| [permutation] == "inmemory_journal"
|
2018-01-13 16:07:49 +03:00
|
|
|
|| [atomic_batch_write test.db]
|
2017-03-21 13:45:38 +03:00
|
|
|
} {
|
2017-03-20 18:11:40 +03:00
|
|
|
finish_test
|
|
|
|
return
|
|
|
|
}
|
2017-03-16 21:14:39 +03:00
|
|
|
|
|
|
|
proc execsql_sync {sql} {
|
|
|
|
set s $::sqlite_sync_count
|
|
|
|
set res [execsql $sql]
|
|
|
|
concat [expr $::sqlite_sync_count-$s] $res
|
|
|
|
}
|
|
|
|
|
|
|
|
proc do_execsql_sync_test {tn sql res} {
|
|
|
|
uplevel [list do_test $tn [list execsql_sync $sql] [list {*}$res]]
|
|
|
|
}
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------
|
|
|
|
# Tests for journal mode.
|
|
|
|
#
|
|
|
|
sqlite3 db test.db
|
|
|
|
do_execsql_test 1.0 {
|
|
|
|
CREATE TABLE t1(a, b);
|
|
|
|
INSERT INTO t1 VALUES(1, 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
do_execsql_sync_test 1.1 { INSERT INTO t1 VALUES(3, 4) } 4
|
|
|
|
|
|
|
|
# synchronous=normal. So, 1 sync on the directory, 1 on the journal, 1
|
|
|
|
# on the db file. 3 in total.
|
|
|
|
do_execsql_test 1.2.1 { PRAGMA main.synchronous = NORMAL }
|
|
|
|
do_execsql_test 1.2.2 { PRAGMA main.synchronous } 1
|
|
|
|
do_execsql_sync_test 1.2.3 { INSERT INTO t1 VALUES(5, 6) } 3
|
|
|
|
|
|
|
|
# synchronous=off. No syncs.
|
|
|
|
do_execsql_test 1.3.1 { PRAGMA main.synchronous = OFF }
|
|
|
|
do_execsql_test 1.3.2 { PRAGMA main.synchronous } 0
|
|
|
|
do_execsql_sync_test 1.3.3 { INSERT INTO t1 VALUES(7, 8) } 0
|
|
|
|
|
|
|
|
# synchronous=full, journal_mode=delete. So, 1 sync on the directory,
|
|
|
|
# 2 on the journal, 1 on the db file. 4 in total.
|
|
|
|
do_execsql_test 1.4.1 { PRAGMA main.synchronous = FULL }
|
|
|
|
do_execsql_test 1.4.2 { PRAGMA main.synchronous } 2
|
|
|
|
do_execsql_sync_test 1.4.3 { INSERT INTO t1 VALUES(9, 10) } 4
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------
|
|
|
|
# Tests for wal mode.
|
|
|
|
#
|
|
|
|
do_execsql_test 1.5 { PRAGMA journal_mode = wal } {wal}
|
|
|
|
|
|
|
|
# sync=full, journal_mode=wal. One sync on the directory, two on the
|
|
|
|
# wal file.
|
|
|
|
do_execsql_sync_test 1.6 { INSERT INTO t1 VALUES(11, 12) } 3
|
|
|
|
|
|
|
|
# One sync on the wal file.
|
|
|
|
do_execsql_sync_test 1.7 { INSERT INTO t1 VALUES(13, 14) } 1
|
|
|
|
|
|
|
|
# No syncs.
|
|
|
|
do_execsql_test 1.8.1 { PRAGMA main.synchronous = NORMAL }
|
|
|
|
do_execsql_test 1.8.2 { PRAGMA main.synchronous } 1
|
|
|
|
do_execsql_sync_test 1.8.3 { INSERT INTO t1 VALUES(15, 16) } 0
|
|
|
|
|
|
|
|
# One sync on wal file, one on the db file.
|
|
|
|
do_execsql_sync_test 1.9 { PRAGMA wal_checkpoint } {2 0 3 3}
|
|
|
|
|
|
|
|
# No syncs.
|
|
|
|
do_execsql_test 1.10.1 { PRAGMA main.synchronous = OFF }
|
|
|
|
do_execsql_test 1.10.2 { PRAGMA main.synchronous } 0
|
|
|
|
do_execsql_sync_test 1.10.3 { INSERT INTO t1 VALUES(17, 18) } 0
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------
|
|
|
|
# Tests for the compile time settings SQLITE_DEFAULT_SYNCHRONOUS and
|
|
|
|
# SQLITE_DEFAULT_WAL_SYNCHRONOUS. These tests only run if the former
|
|
|
|
# is set to "2" and the latter to "1". This is not the default, but
|
|
|
|
# it is currently the recommended configuration.
|
|
|
|
#
|
|
|
|
# https://sqlite.org/compile.html#recommended_compile_time_options
|
|
|
|
#
|
|
|
|
if {$SQLITE_DEFAULT_SYNCHRONOUS==2 && $SQLITE_DEFAULT_WAL_SYNCHRONOUS==1} {
|
|
|
|
|
|
|
|
db close
|
|
|
|
sqlite3 db test.db
|
|
|
|
|
|
|
|
# Wal mode, sync=normal. The first transaction does one sync on directory,
|
|
|
|
# one on the wal file. The second does no syncs.
|
|
|
|
do_execsql_sync_test 1.11.1 { INSERT INTO t1 VALUES(19, 20) } 2
|
|
|
|
do_execsql_sync_test 1.11.2 { INSERT INTO t1 VALUES(21, 22) } 0
|
|
|
|
do_execsql_test 1.11.3 { PRAGMA main.synchronous } 1
|
|
|
|
|
|
|
|
# One sync on wal file, one on the db file.
|
|
|
|
do_execsql_sync_test 1.12 { PRAGMA wal_checkpoint } {2 0 2 2}
|
|
|
|
|
|
|
|
# First transaction syncs the wal file once, the second not at all.
|
|
|
|
# one on the wal file. The second does no syncs.
|
|
|
|
do_execsql_sync_test 1.13.1 { INSERT INTO t1 VALUES(22, 23) } 1
|
|
|
|
do_execsql_sync_test 1.13.2 { INSERT INTO t1 VALUES(24, 25) } 0
|
|
|
|
|
|
|
|
do_execsql_test 1.14 { PRAGMA journal_mode = delete } {delete}
|
|
|
|
|
|
|
|
# Delete mode, sync=full. The first transaction does one sync on
|
|
|
|
# directory, two on the journal file, one on the db. The second does
|
|
|
|
# the same.
|
|
|
|
do_execsql_sync_test 1.15.1 { INSERT INTO t1 VALUES(26, 27) } 4
|
|
|
|
do_execsql_sync_test 1.15.2 { INSERT INTO t1 VALUES(28, 29) } 4
|
|
|
|
do_execsql_test 1.15.3 { PRAGMA main.synchronous } 2
|
|
|
|
|
|
|
|
# Switch back to wal mode.
|
|
|
|
do_execsql_test 1.16 { PRAGMA journal_mode = wal } {wal}
|
|
|
|
|
|
|
|
do_execsql_sync_test 1.17.1 { INSERT INTO t1 VALUES(30, 31) } 2
|
|
|
|
do_execsql_sync_test 1.17.2 { INSERT INTO t1 VALUES(32, 33) } 0
|
|
|
|
do_execsql_test 1.17.3 { PRAGMA main.synchronous } 1
|
|
|
|
|
|
|
|
# Now set synchronous=off, then switch back to delete mode. Check
|
|
|
|
# that the db handle is still using synchronous=off.
|
|
|
|
do_execsql_test 1.18.3 { PRAGMA main.synchronous=off }
|
|
|
|
do_execsql_test 1.18 { PRAGMA journal_mode = delete } {delete}
|
|
|
|
|
|
|
|
do_execsql_sync_test 1.19.1 { INSERT INTO t1 VALUES(34, 35) } 0
|
|
|
|
do_execsql_sync_test 1.19.2 { INSERT INTO t1 VALUES(36, 37) } 0
|
|
|
|
do_execsql_test 1.19.3 { PRAGMA main.synchronous } 0
|
|
|
|
|
|
|
|
# Close and reopen the db. Back to synchronous=normal.
|
|
|
|
db close
|
|
|
|
sqlite3 db test.db
|
|
|
|
do_execsql_sync_test 1.20.1 { INSERT INTO t1 VALUES(38, 39) } 4
|
|
|
|
do_execsql_sync_test 1.20.2 { INSERT INTO t1 VALUES(40, 41) } 4
|
|
|
|
do_execsql_test 1.20.3 { PRAGMA main.synchronous } 2
|
|
|
|
}
|
|
|
|
|
|
|
|
finish_test
|