AryaWu/sqlite
0
1# 2016 October 312#3# The author disclaims copyright to this source code. In place of4# a legal notice, here is a blessing:5#6# May you do good and not evil.7# May you find forgiveness for yourself and forgive others.8# May you share freely, never taking more than you give.9#10#***********************************************************************11# This file implements regression tests for SQLite library. The12# focus of this file is testing the SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE13# option.14#15 16set testdir [file dirname $argv0]17source $testdir/tester.tcl18source $testdir/lock_common.tcl19source $testdir/malloc_common.tcl20source $testdir/wal_common.tcl21ifcapable !wal {finish_test ; return }22if {[permutation]=="journaltest" || [permutation]=="inmemory_journal"} {23 finish_test24 return25}26 27set testprefix nockpt28 29do_execsql_test 1.0 {30 PRAGMA auto_vacuum=OFF;31 PRAGMA page_size = 1024;32 PRAGMA journal_mode = wal;33 CREATE TABLE c1(x, y, z);34 INSERT INTO c1 VALUES(1, 2, 3);35} {wal}36 37do_test 1.1 { file exists test.db-wal } 138do_test 1.2 { file size test.db-wal } [wal_file_size 3 1024]39do_test 1.3 { db close } {}40do_test 1.4 { file exists test.db-wal } 041 42sqlite3 db test.db43do_execsql_test 1.5 {44 INSERT INTO c1 VALUES(4, 5, 6);45 INSERT INTO c1 VALUES(7, 8, 9);46}47do_test 1.6 { file exists test.db-wal } 148do_test 1.7 { sqlite3_db_config db NO_CKPT_ON_CLOSE 1 } {1}49do_test 1.8 { file size test.db-wal } [wal_file_size 2 1024]50do_test 1.9 { db close } {}51do_test 1.10 { file exists test.db-wal } 152do_test 1.11 { file size test.db-wal } [wal_file_size 2 1024]53 54sqlite3 db test.db55do_execsql_test 1.12 {56 SELECT * FROM c157} {1 2 3 4 5 6 7 8 9}58 59do_execsql_test 1.13 { PRAGMA main.journal_mode } {wal}60do_test 1.14 { sqlite3_db_config db NO_CKPT_ON_CLOSE 1 } {1}61do_execsql_test 1.14 { PRAGMA main.journal_mode = delete } {delete}62do_test 1.15 { file exists test.db-wal } {0}63 64if {$::tcl_platform(platform) ne "windows"} {65#-------------------------------------------------------------------------66# Test an unusual scenario:67#68# 1. A wal mode db is opened and written. Then sqlite3_close_v2() used69# to close the db handle while there is still an unfinalized70# statement (so the db handle stays open).71#72# 2. The db, wal and *-shm files are deleted from the file system.73#74# 3. Another connection creates a new wal mode db at the same file-system75# location as the previous one.76#77# 4. The statement left unfinalized in (1) is finalized.78#79# The test is to ensure that the connection left open in step (1) does80# not try to delete the wal file from the file-system as part of step81# 4.82#83reset_db84db close85 86# Open a connection on a wal database. Write to it a bit. Then prepare87# a statement and call sqlite3_close_v2() (so that the statement handle88# holds the db connection open).89#90set ::db1 [sqlite3_open_v2 test.db SQLITE_OPEN_READWRITE ""]91do_test 2.0 {92 lindex [93 sqlite3_exec $::db1 {94 PRAGMA journal_mode = wal;95 CREATE TABLE t1(x PRIMARY KEY, y UNIQUE, z);96 INSERT INTO t1 VALUES(1, 2, 3);97 PRAGMA wal_checkpoint;98 }] 099} {0}100set ::stmt [sqlite3_prepare $::db1 "SELECT * FROM t1" -1 dummy]101sqlite3_close_v2 $::db1102 103# Delete the database, wal and shm files.104#105catch {forcedelete test.db}106catch {forcedelete test.db-wal}107catch {forcedelete test.db-shm}108 109# Open and populate a new database file at the same file-system location110# as the one just deleted. Contrive a partial checkpoint on it.111#112sqlite3 db test.db113sqlite3 db2 test.db114do_execsql_test 2.1 {115 PRAGMA auto_vacuum=OFF;116 PRAGMA journal_mode = wal;117 CREATE TABLE y1(a PRIMARY KEY, b UNIQUE, c);118 INSERT INTO y1 VALUES('a', 'b', 'c');119 INSERT INTO y1 VALUES('d', 'e', 'f');120} {wal}121do_execsql_test -db db2 2.2 {122 BEGIN;123 SELECT * FROM y1;124} {a b c d e f}125do_execsql_test 2.3 {126 UPDATE y1 SET c='g' WHERE a='d';127 PRAGMA wal_checkpoint;128} {0 11 10}129do_execsql_test -db db2 2.4 {130 COMMIT131}132 133# Finalize the statement handle, causing the first connection to be134# closed. Test that this has not corrupted the database file by 135# deleting the new wal file from the file-system. If it has, this136# test should fail with an IO or corruption error.137#138do_test 2.5 {139 sqlite3_finalize $::stmt140 sqlite3 db3 test.db141 execsql { 142 PRAGMA integrity_check; 143 SELECT * FROM y1;144 } db3145} {ok a b c d e g}146}147 148 149finish_test150 