1# 2002 March 6 2# 3# The author disclaims copyright to this source code. In place of 4# 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. 12# 13# This file implements tests for the PRAGMA command. 14# 15# $Id: pragma2.test,v 1.4 2007/10/09 08:29:33 danielk1977 Exp $ 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# Test organization: 21# 22# pragma2-1.*: Test freelist_count pragma on the main database. 23# pragma2-2.*: Test freelist_count pragma on an attached database. 24# pragma2-3.*: Test trying to write to the freelist_count is a no-op. 25# pragma2-4.*: Tests for PRAGMA cache_spill 26# 27 28ifcapable !pragma||!schema_pragmas { 29 finish_test 30 return 31} 32 33# Delete the preexisting database to avoid the special setup 34# that the "all.test" script does. 35# 36db close 37delete_file test.db test.db-journal 38delete_file test3.db test3.db-journal 39sqlite3 db test.db; set DB [sqlite3_connection_pointer db] 40db eval {PRAGMA auto_vacuum=0} 41 42do_test pragma2-1.1 { 43 execsql { 44 PRAGMA freelist_count; 45 } 46} {0} 47do_test pragma2-1.2 { 48 execsql { 49 CREATE TABLE abc(a, b, c); 50 PRAGMA freelist_count; 51 } 52} {0} 53do_test pragma2-1.3 { 54 execsql { 55 DROP TABLE abc; 56 PRAGMA freelist_count; 57 } 58} {1} 59do_test pragma2-1.4 { 60 execsql { 61 PRAGMA main.freelist_count; 62 } 63} {1} 64 65forcedelete test2.db 66forcedelete test2.db-journal 67 68ifcapable attach { 69 do_test pragma2-2.1 { 70 execsql { 71 ATTACH 'test2.db' AS aux; 72 PRAGMA aux.auto_vacuum=OFF; 73 PRAGMA aux.freelist_count; 74 } 75 } {0} 76 do_test pragma2-2.2 { 77 execsql { 78 CREATE TABLE aux.abc(a, b, c); 79 PRAGMA aux.freelist_count; 80 } 81 } {0} 82 do_test pragma2-2.3 { 83 set ::val [string repeat 0123456789 1000] 84 execsql { 85 INSERT INTO aux.abc VALUES(1, 2, $::val); 86 PRAGMA aux.freelist_count; 87 } 88 } {0} 89 do_test pragma2-2.4 { 90 expr {[file size test2.db] / 1024} 91 } {11} 92 do_test pragma2-2.5 { 93 execsql { 94 DELETE FROM aux.abc; 95 PRAGMA aux.freelist_count; 96 } 97 } {9} 98 99 do_test pragma2-3.1 { 100 execsql { 101 PRAGMA aux.freelist_count; 102 PRAGMA main.freelist_count; 103 PRAGMA freelist_count; 104 } 105 } {9 1 1} 106 do_test pragma2-3.2 { 107 execsql { 108 PRAGMA freelist_count = 500; 109 PRAGMA freelist_count; 110 } 111 } {1 1} 112 do_test pragma2-3.3 { 113 execsql { 114 PRAGMA aux.freelist_count = 500; 115 PRAGMA aux.freelist_count; 116 } 117 } {9 9} 118} 119 120# Default setting of PRAGMA cache_spill is always ON 121# 122# EVIDENCE-OF: R-51036-62828 PRAGMA cache_spill; PRAGMA 123# cache_spill=boolean; 124# 125# EVIDENCE-OF: R-23955-02765 Cache_spill is enabled by default 126# 127db close 128delete_file test.db test.db-journal 129delete_file test2.db test2.db-journal 130sqlite3 db test.db 131do_execsql_test pragma2-4.1 { 132 PRAGMA cache_spill; 133 PRAGMA main.cache_spill; 134 PRAGMA temp.cache_spill; 135} {1 1 1} 136do_execsql_test pragma2-4.2 { 137 PRAGMA cache_spill=OFF; 138 PRAGMA cache_spill; 139 PRAGMA main.cache_spill; 140 PRAGMA temp.cache_spill; 141} {0 0 0} 142do_execsql_test pragma2-4.3 { 143 PRAGMA page_size=1024; 144 PRAGMA cache_size=50; 145 BEGIN; 146 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d); 147 INSERT INTO t1 VALUES(1, randomblob(400), 1, randomblob(400)); 148 INSERT INTO t1 SELECT a+1, randomblob(400), a+1, randomblob(400) FROM t1; 149 INSERT INTO t1 SELECT a+2, randomblob(400), a+2, randomblob(400) FROM t1; 150 INSERT INTO t1 SELECT a+4, randomblob(400), a+4, randomblob(400) FROM t1; 151 INSERT INTO t1 SELECT a+8, randomblob(400), a+8, randomblob(400) FROM t1; 152 INSERT INTO t1 SELECT a+16, randomblob(400), a+16, randomblob(400) FROM t1; 153 INSERT INTO t1 SELECT a+32, randomblob(400), a+32, randomblob(400) FROM t1; 154 INSERT INTO t1 SELECT a+64, randomblob(400), a+64, randomblob(400) FROM t1; 155 COMMIT; 156 ATTACH 'test2.db' AS aux1; 157 CREATE TABLE aux1.t2(a INTEGER PRIMARY KEY, b, c, d); 158 INSERT INTO t2 SELECT * FROM t1; 159 DETACH aux1; 160 PRAGMA cache_spill=ON; 161} {} 162sqlite3_release_memory 163# 164# EVIDENCE-OF: R-07634-40532 The cache_spill pragma enables or disables 165# the ability of the pager to spill dirty cache pages to the database 166# file in the middle of a transaction. 167# 168do_test pragma2-4.4 { 169 db eval { 170 BEGIN; 171 UPDATE t1 SET c=c+1; 172 PRAGMA lock_status; 173 } 174} {main exclusive temp unknown} ;# EXCLUSIVE lock due to cache spill 175do_test pragma2-4.5 { 176 db eval { 177 COMMIT; 178 PRAGMA cache_spill=OFF; 179 BEGIN; 180 UPDATE t1 SET c=c-1; 181 PRAGMA lock_status; 182 } 183} {main reserved temp unknown} ;# No cache spill, so no exclusive lock 184 185# Verify that newly attached databases inherit the cache_spill=OFF 186# setting. 187# 188do_execsql_test pragma2-4.6 { 189 COMMIT; 190 ATTACH 'test2.db' AS aux1; 191 PRAGMA aux1.cache_size=50; 192 BEGIN; 193 UPDATE t2 SET c=c+1; 194 PRAGMA lock_status; 195} {main unlocked temp unknown aux1 reserved} 196do_execsql_test pragma2-4.7 { 197 COMMIT; 198} 199sqlite3_release_memory 200do_execsql_test pragma2-4.8 { 201 PRAGMA cache_spill=ON; -- Applies to all databases 202 BEGIN; 203 UPDATE t2 SET c=c-1; 204 PRAGMA lock_status; 205} {main unlocked temp unknown aux1 exclusive} 206 207 208finish_test 209