1cd61c281Sdrh# 2002 March 6 2cd61c281Sdrh# 3cd61c281Sdrh# The author disclaims copyright to this source code. In place of 4cd61c281Sdrh# a legal notice, here is a blessing: 5cd61c281Sdrh# 6cd61c281Sdrh# May you do good and not evil. 7cd61c281Sdrh# May you find forgiveness for yourself and forgive others. 8cd61c281Sdrh# May you share freely, never taking more than you give. 9cd61c281Sdrh# 10cd61c281Sdrh#*********************************************************************** 11cd61c281Sdrh# This file implements regression tests for SQLite library. 12cd61c281Sdrh# 13cd61c281Sdrh# This file implements tests for the PRAGMA command. 14cd61c281Sdrh# 15*5558a8a6Sdanielk1977# $Id: pragma.test,v 1.32 2005/01/17 07:53:44 danielk1977 Exp $ 16cd61c281Sdrh 17cd61c281Sdrhset testdir [file dirname $argv0] 18cd61c281Sdrhsource $testdir/tester.tcl 19cd61c281Sdrh 2091cf71b0Sdanielk1977# Test organization: 2191cf71b0Sdanielk1977# 2291cf71b0Sdanielk1977# pragma-1.*: Test cache_size, default_cache_size and synchronous on main db. 2391cf71b0Sdanielk1977# pragma-2.*: Test synchronous on attached db. 2491cf71b0Sdanielk1977# pragma-3.*: Test detection of table/index inconsistency by integrity_check. 2591cf71b0Sdanielk1977# pragma-4.*: Test cache_size and default_cache_size on attached db. 2691cf71b0Sdanielk1977# pragma-5.*: Test that pragma synchronous may not be used inside of a 2791cf71b0Sdanielk1977# transaction. 28cc6bd383Sdanielk1977# pragma-6.*: Test schema-query pragmas. 29cc6bd383Sdanielk1977# pragma-7.*: Miscellaneous tests. 30cc6bd383Sdanielk1977# pragma-8.*: Test user_version and schema_version pragmas. 319a09a3caStpoindex# pragma-9.*: Test temp_store and temp_store_directory. 32cc6bd383Sdanielk1977# pragma-10.*: Test the count_changes pragma in the presence of triggers. 3391cf71b0Sdanielk1977# 3491cf71b0Sdanielk1977 35cd61c281Sdrh# Delete the preexisting database to avoid the special setup 36cd61c281Sdrh# that the "all.test" script does. 37cd61c281Sdrh# 38cd61c281Sdrhdb close 39cd61c281Sdrhfile delete test.db 40ef4ac8f9Sdrhset DB [sqlite3 db test.db] 41cd61c281Sdrh 42c7b4a44cSdanielk1977ifcapable pager_pragmas { 43cd61c281Sdrhdo_test pragma-1.1 { 44cd61c281Sdrh execsql { 45cd61c281Sdrh PRAGMA cache_size; 46cd61c281Sdrh PRAGMA default_cache_size; 47cd61c281Sdrh PRAGMA synchronous; 48cd61c281Sdrh } 4991cf71b0Sdanielk1977} {2000 2000 2} 50cd61c281Sdrhdo_test pragma-1.2 { 51cd61c281Sdrh execsql { 52cd61c281Sdrh PRAGMA cache_size=1234; 53cd61c281Sdrh PRAGMA cache_size; 54cd61c281Sdrh PRAGMA default_cache_size; 55cd61c281Sdrh PRAGMA synchronous; 56cd61c281Sdrh } 5791cf71b0Sdanielk1977} {1234 2000 2} 58cd61c281Sdrhdo_test pragma-1.3 { 59cd61c281Sdrh db close 60ef4ac8f9Sdrh sqlite3 db test.db 61cd61c281Sdrh execsql { 62cd61c281Sdrh PRAGMA cache_size; 63cd61c281Sdrh PRAGMA default_cache_size; 64cd61c281Sdrh PRAGMA synchronous; 65cd61c281Sdrh } 6691cf71b0Sdanielk1977} {2000 2000 2} 67cd61c281Sdrhdo_test pragma-1.4 { 68cd61c281Sdrh execsql { 69cd61c281Sdrh PRAGMA synchronous=OFF; 70cd61c281Sdrh PRAGMA cache_size; 71cd61c281Sdrh PRAGMA default_cache_size; 72cd61c281Sdrh PRAGMA synchronous; 73cd61c281Sdrh } 7491cf71b0Sdanielk1977} {2000 2000 0} 75cd61c281Sdrhdo_test pragma-1.5 { 76cd61c281Sdrh execsql { 77cd61c281Sdrh PRAGMA cache_size=4321; 78cd61c281Sdrh PRAGMA cache_size; 79cd61c281Sdrh PRAGMA default_cache_size; 80cd61c281Sdrh PRAGMA synchronous; 81cd61c281Sdrh } 8291cf71b0Sdanielk1977} {4321 2000 0} 83cd61c281Sdrhdo_test pragma-1.6 { 84cd61c281Sdrh execsql { 85cd61c281Sdrh PRAGMA synchronous=ON; 86cd61c281Sdrh PRAGMA cache_size; 87cd61c281Sdrh PRAGMA default_cache_size; 88cd61c281Sdrh PRAGMA synchronous; 89cd61c281Sdrh } 9091cf71b0Sdanielk1977} {4321 2000 1} 91cd61c281Sdrhdo_test pragma-1.7 { 92cd61c281Sdrh db close 93ef4ac8f9Sdrh sqlite3 db test.db 94cd61c281Sdrh execsql { 95cd61c281Sdrh PRAGMA cache_size; 96cd61c281Sdrh PRAGMA default_cache_size; 97cd61c281Sdrh PRAGMA synchronous; 98cd61c281Sdrh } 9991cf71b0Sdanielk1977} {2000 2000 2} 100cd61c281Sdrhdo_test pragma-1.8 { 101cd61c281Sdrh execsql { 102cd61c281Sdrh PRAGMA default_cache_size=123; 103cd61c281Sdrh PRAGMA cache_size; 104cd61c281Sdrh PRAGMA default_cache_size; 105cd61c281Sdrh PRAGMA synchronous; 106cd61c281Sdrh } 10791cf71b0Sdanielk1977} {123 123 2} 10891cf71b0Sdanielk1977do_test pragma-1.9 { 109cd61c281Sdrh db close 110ef4ac8f9Sdrh set ::DB [sqlite3 db test.db] 111cd61c281Sdrh execsql { 112cd61c281Sdrh PRAGMA cache_size; 113cd61c281Sdrh PRAGMA default_cache_size; 114cd61c281Sdrh PRAGMA synchronous; 115cd61c281Sdrh } 11691cf71b0Sdanielk1977} {123 123 2} 11791cf71b0Sdanielk1977do_test pragma-1.10 { 1185a38705eSdrh execsql { 1194303feedSdrh PRAGMA synchronous=NORMAL; 1204303feedSdrh PRAGMA cache_size; 1214303feedSdrh PRAGMA default_cache_size; 1224303feedSdrh PRAGMA synchronous; 1234303feedSdrh } 12491cf71b0Sdanielk1977} {123 123 1} 12591cf71b0Sdanielk1977do_test pragma-1.11 { 1264303feedSdrh execsql { 1274303feedSdrh PRAGMA synchronous=FULL; 1284303feedSdrh PRAGMA cache_size; 1294303feedSdrh PRAGMA default_cache_size; 1304303feedSdrh PRAGMA synchronous; 1314303feedSdrh } 13291cf71b0Sdanielk1977} {123 123 2} 13391cf71b0Sdanielk1977do_test pragma-1.12 { 1344303feedSdrh db close 135ef4ac8f9Sdrh set ::DB [sqlite3 db test.db] 1364303feedSdrh execsql { 1374303feedSdrh PRAGMA cache_size; 1384303feedSdrh PRAGMA default_cache_size; 1394303feedSdrh PRAGMA synchronous; 1404303feedSdrh } 14191cf71b0Sdanielk1977} {123 123 2} 14291cf71b0Sdanielk1977 1435260f7e9Sdrh# Make sure the pragma handler understands numeric values in addition 1445260f7e9Sdrh# to keywords like "off" and "full". 1455260f7e9Sdrh# 1465260f7e9Sdrhdo_test pragma-1.13 { 1475260f7e9Sdrh execsql { 1485260f7e9Sdrh PRAGMA synchronous=0; 1495260f7e9Sdrh PRAGMA synchronous; 1505260f7e9Sdrh } 1515260f7e9Sdrh} {0} 1525260f7e9Sdrhdo_test pragma-1.14 { 1535260f7e9Sdrh execsql { 1545260f7e9Sdrh PRAGMA synchronous=2; 1555260f7e9Sdrh PRAGMA synchronous; 1565260f7e9Sdrh } 1575260f7e9Sdrh} {2} 158c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas 1595260f7e9Sdrh 1605260f7e9Sdrh# Test turning "flag" pragmas on and off. 1615260f7e9Sdrh# 1625260f7e9Sdrhdo_test pragma-1.15 { 1635260f7e9Sdrh execsql { 1645260f7e9Sdrh PRAGMA vdbe_listing=YES; 1655260f7e9Sdrh PRAGMA vdbe_listing; 1665260f7e9Sdrh } 1675260f7e9Sdrh} {1} 1685260f7e9Sdrhdo_test pragma-1.16 { 1695260f7e9Sdrh execsql { 1705260f7e9Sdrh PRAGMA vdbe_listing=NO; 1715260f7e9Sdrh PRAGMA vdbe_listing; 1725260f7e9Sdrh } 1735260f7e9Sdrh} {0} 1745260f7e9Sdrhdo_test pragma-1.17 { 1755260f7e9Sdrh execsql { 1765260f7e9Sdrh PRAGMA parser_trace=ON; 1775260f7e9Sdrh PRAGMA parser_trace=OFF; 1785260f7e9Sdrh } 1795260f7e9Sdrh} {} 1805260f7e9Sdrhdo_test pragma-1.18 { 1815260f7e9Sdrh execsql { 1825260f7e9Sdrh PRAGMA bogus = -1234; -- Parsing of negative values 1835260f7e9Sdrh } 1845260f7e9Sdrh} {} 1855260f7e9Sdrh 18691cf71b0Sdanielk1977# Test modifying the safety_level of an attached database. 18791cf71b0Sdanielk1977do_test pragma-2.1 { 18891cf71b0Sdanielk1977 file delete -force test2.db 18991cf71b0Sdanielk1977 file delete -force test2.db-journal 1904303feedSdrh execsql { 19191cf71b0Sdanielk1977 ATTACH 'test2.db' AS aux; 1924303feedSdrh } 19391cf71b0Sdanielk1977} {} 194c7b4a44cSdanielk1977ifcapable pager_pragmas { 19591cf71b0Sdanielk1977do_test pragma-2.2 { 1964303feedSdrh execsql { 19791cf71b0Sdanielk1977 pragma aux.synchronous; 1984303feedSdrh } 19991cf71b0Sdanielk1977} {2} 20091cf71b0Sdanielk1977do_test pragma-2.3 { 20191cf71b0Sdanielk1977 execsql { 20291cf71b0Sdanielk1977 pragma aux.synchronous = OFF; 20391cf71b0Sdanielk1977 pragma aux.synchronous; 20491cf71b0Sdanielk1977 pragma synchronous; 20591cf71b0Sdanielk1977 } 20691cf71b0Sdanielk1977} {0 2} 20791cf71b0Sdanielk1977do_test pragma-2.4 { 20891cf71b0Sdanielk1977 execsql { 20991cf71b0Sdanielk1977 pragma aux.synchronous = ON; 21091cf71b0Sdanielk1977 pragma synchronous; 21191cf71b0Sdanielk1977 pragma aux.synchronous; 21291cf71b0Sdanielk1977 } 21391cf71b0Sdanielk1977} {2 1} 214c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas 2154303feedSdrh 216ed717fe3Sdrh# Construct a corrupted index and make sure the integrity_check 217ed717fe3Sdrh# pragma finds it. 218ed717fe3Sdrh# 21925d6543dSdrh# These tests won't work if the database is encrypted 22025d6543dSdrh# 221ed717fe3Sdrhdo_test pragma-3.1 { 222ed717fe3Sdrh execsql { 223ed717fe3Sdrh BEGIN; 224ed717fe3Sdrh CREATE TABLE t2(a,b,c); 225ed717fe3Sdrh CREATE INDEX i2 ON t2(a); 226ed717fe3Sdrh INSERT INTO t2 VALUES(11,2,3); 227ed717fe3Sdrh INSERT INTO t2 VALUES(22,3,4); 228ed717fe3Sdrh COMMIT; 229ed717fe3Sdrh SELECT rowid, * from t2; 230ed717fe3Sdrh } 231ed717fe3Sdrh} {1 11 2 3 2 22 3 4} 23240e016e4Sdrhif {![sqlite3 -has-codec] && $sqlite_options(integrityck)} { 233ed717fe3Sdrh do_test pragma-3.2 { 234ed717fe3Sdrh set rootpage [execsql {SELECT rootpage FROM sqlite_master WHERE name='i2'}] 23596fc5fe6Sdanielk1977 set db [btree_open test.db 100 0] 236ed717fe3Sdrh btree_begin_transaction $db 237ed717fe3Sdrh set c [btree_cursor $db $rootpage 1] 238ed717fe3Sdrh btree_first $c 239ed717fe3Sdrh btree_delete $c 240ed717fe3Sdrh btree_commit $db 241ed717fe3Sdrh btree_close $db 242ed717fe3Sdrh execsql {PRAGMA integrity_check} 2434be295beSdrh } {{rowid 1 missing from index i2} {wrong # of entries in index i2}} 24425d6543dSdrh} 24591cf71b0Sdanielk1977do_test pragma-3.3 { 24691cf71b0Sdanielk1977 execsql { 24791cf71b0Sdanielk1977 DROP INDEX i2; 24891cf71b0Sdanielk1977 } 24991cf71b0Sdanielk1977} {} 25091cf71b0Sdanielk1977 25191cf71b0Sdanielk1977# Test modifying the cache_size of an attached database. 252c7b4a44cSdanielk1977ifcapable pager_pragmas { 25391cf71b0Sdanielk1977do_test pragma-4.1 { 25491cf71b0Sdanielk1977 execsql { 25591cf71b0Sdanielk1977 pragma aux.cache_size; 25691cf71b0Sdanielk1977 pragma aux.default_cache_size; 25791cf71b0Sdanielk1977 } 25891cf71b0Sdanielk1977} {2000 2000} 2591bdd9b57Sdrhdo_test pragma-4.2 { 2601bdd9b57Sdrh execsql { 26191cf71b0Sdanielk1977 pragma aux.cache_size = 50; 26291cf71b0Sdanielk1977 pragma aux.cache_size; 26391cf71b0Sdanielk1977 pragma aux.default_cache_size; 2641bdd9b57Sdrh } 26591cf71b0Sdanielk1977} {50 2000} 2661bdd9b57Sdrhdo_test pragma-4.3 { 2671bdd9b57Sdrh execsql { 26891cf71b0Sdanielk1977 pragma aux.default_cache_size = 456; 26991cf71b0Sdanielk1977 pragma aux.cache_size; 27091cf71b0Sdanielk1977 pragma aux.default_cache_size; 2711bdd9b57Sdrh } 27291cf71b0Sdanielk1977} {456 456} 2731bdd9b57Sdrhdo_test pragma-4.4 { 2741bdd9b57Sdrh execsql { 27591cf71b0Sdanielk1977 pragma cache_size; 27691cf71b0Sdanielk1977 pragma default_cache_size; 2771bdd9b57Sdrh } 27891cf71b0Sdanielk1977} {123 123} 2791bdd9b57Sdrhdo_test pragma-4.5 { 2801bdd9b57Sdrh execsql { 28191cf71b0Sdanielk1977 DETACH aux; 28291cf71b0Sdanielk1977 ATTACH 'test3.db' AS aux; 28391cf71b0Sdanielk1977 pragma aux.cache_size; 28491cf71b0Sdanielk1977 pragma aux.default_cache_size; 2851bdd9b57Sdrh } 28691cf71b0Sdanielk1977} {2000 2000} 2871bdd9b57Sdrhdo_test pragma-4.6 { 2881bdd9b57Sdrh execsql { 28991cf71b0Sdanielk1977 DETACH aux; 29091cf71b0Sdanielk1977 ATTACH 'test2.db' AS aux; 29191cf71b0Sdanielk1977 pragma aux.cache_size; 29291cf71b0Sdanielk1977 pragma aux.default_cache_size; 2931bdd9b57Sdrh } 29491cf71b0Sdanielk1977} {456 456} 295c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas 2961bdd9b57Sdrh 29791cf71b0Sdanielk1977# Test that modifying the sync-level in the middle of a transaction is 29891cf71b0Sdanielk1977# disallowed. 299c7b4a44cSdanielk1977ifcapable pager_pragmas { 30091cf71b0Sdanielk1977do_test pragma-5.0 { 3011bdd9b57Sdrh execsql { 30291cf71b0Sdanielk1977 pragma synchronous; 3031bdd9b57Sdrh } 30491cf71b0Sdanielk1977} {2} 30591cf71b0Sdanielk1977do_test pragma-5.1 { 3061bdd9b57Sdrh catchsql { 3071bdd9b57Sdrh BEGIN; 30891cf71b0Sdanielk1977 pragma synchronous = OFF; 3091bdd9b57Sdrh } 31091cf71b0Sdanielk1977} {1 {Safety level may not be changed inside a transaction}} 31191cf71b0Sdanielk1977do_test pragma-5.2 { 31291cf71b0Sdanielk1977 execsql { 31391cf71b0Sdanielk1977 pragma synchronous; 31491cf71b0Sdanielk1977 } 31591cf71b0Sdanielk1977} {2} 3165260f7e9Sdrhcatchsql {COMMIT;} 317c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas 3185260f7e9Sdrh 3195260f7e9Sdrh# Test schema-query pragmas 3205260f7e9Sdrh# 32127188fb5Sdanielk1977ifcapable schema_pragmas { 3225260f7e9Sdrhdo_test pragma-6.1 { 323956bc92cSdrh set res {} 32440e016e4Sdrh execsql {SELECT * FROM sqlite_temp_master} 3255260f7e9Sdrh foreach {idx name file} [execsql {pragma database_list}] { 3265260f7e9Sdrh lappend res $idx $name 3275260f7e9Sdrh } 3285260f7e9Sdrh set res 329a71aa001Sdrh} {0 main 1 temp 2 aux} 3305260f7e9Sdrhdo_test pragma-6.2 { 3315260f7e9Sdrh execsql { 3325260f7e9Sdrh pragma table_info(t2) 3335260f7e9Sdrh } 3345260f7e9Sdrh} {0 a numeric 0 {} 0 1 b numeric 0 {} 0 2 c numeric 0 {} 0} 3356bf89570Sdrhifcapable {foreignkey} { 3365260f7e9Sdrh do_test pragma-6.3 { 3375260f7e9Sdrh execsql { 3385260f7e9Sdrh CREATE TABLE t3(a int references t2(b), b UNIQUE); 3395260f7e9Sdrh pragma foreign_key_list(t3); 3405260f7e9Sdrh } 3415260f7e9Sdrh } {0 0 t2 a b} 3425260f7e9Sdrh do_test pragma-6.4 { 3435260f7e9Sdrh execsql { 3445260f7e9Sdrh pragma index_list(t3); 3455260f7e9Sdrh } 3465260f7e9Sdrh } {0 sqlite_autoindex_t3_1 1} 3476bf89570Sdrh} 3486bf89570Sdrhifcapable {!foreignkey} { 3496bf89570Sdrh execsql {CREATE TABLE t3(a,b UNIQUE)} 3506bf89570Sdrh} 3515260f7e9Sdrhdo_test pragma-6.5 { 3525260f7e9Sdrh execsql { 3535260f7e9Sdrh CREATE INDEX t3i1 ON t3(a,b); 3545260f7e9Sdrh pragma index_info(t3i1); 3555260f7e9Sdrh } 3565260f7e9Sdrh} {0 0 a 1 1 b} 35727188fb5Sdanielk1977} ;# ifcapable schema_pragmas 3585260f7e9Sdrh# Miscellaneous tests 3595260f7e9Sdrh# 36027188fb5Sdanielk1977ifcapable schema_pragmas { 3615260f7e9Sdrhdo_test pragma-7.1 { 3625260f7e9Sdrh # Make sure a pragma knows to read the schema if it needs to 3635260f7e9Sdrh db close 3645260f7e9Sdrh sqlite3 db test.db 3655260f7e9Sdrh execsql { 3665260f7e9Sdrh pragma index_list(t3); 3675260f7e9Sdrh } 3685260f7e9Sdrh} {0 t3i1 0 1 sqlite_autoindex_t3_1 1} 36927188fb5Sdanielk1977} ;# ifcapable schema_pragmas 3706c62608fSdrhifcapable {utf16} { 3715260f7e9Sdrh do_test pragma-7.2 { 3725260f7e9Sdrh db close 3735260f7e9Sdrh sqlite3 db test.db 3745260f7e9Sdrh catchsql { 3755260f7e9Sdrh pragma encoding=bogus; 3765260f7e9Sdrh } 3775260f7e9Sdrh } {1 {unsupported encoding: bogus}} 3786c62608fSdrh} 3795260f7e9Sdrhdo_test pragma-7.3 { 3805260f7e9Sdrh db close 3815260f7e9Sdrh sqlite3 db test.db 3825260f7e9Sdrh execsql { 3835260f7e9Sdrh pragma lock_status; 3845260f7e9Sdrh } 3855260f7e9Sdrh} {main unlocked temp closed} 3865260f7e9Sdrh 3875260f7e9Sdrh 388dae2495bSdanielk1977#---------------------------------------------------------------------- 389b92b70bbSdanielk1977# Test cases pragma-8.* test the "PRAGMA schema_version" and "PRAGMA 390b92b70bbSdanielk1977# user_version" statements. 391dae2495bSdanielk1977# 392b92b70bbSdanielk1977# pragma-8.1: PRAGMA schema_version 393b92b70bbSdanielk1977# pragma-8.2: PRAGMA user_version 394dae2495bSdanielk1977# 395dae2495bSdanielk1977 39611cf9fbcSdanielk1977ifcapable schema_version { 39711cf9fbcSdanielk1977 398b92b70bbSdanielk1977# First check that we can set the schema version and then retrieve the 399dae2495bSdanielk1977# same value. 400dae2495bSdanielk1977do_test pragma-8.1.1 { 401dae2495bSdanielk1977 execsql { 402b92b70bbSdanielk1977 PRAGMA schema_version = 105; 403dae2495bSdanielk1977 } 404dae2495bSdanielk1977} {} 405dae2495bSdanielk1977do_test pragma-8.1.2 { 406dae2495bSdanielk1977 execsql { 407b92b70bbSdanielk1977 PRAGMA schema_version; 408dae2495bSdanielk1977 } 409dae2495bSdanielk1977} 105 410dae2495bSdanielk1977do_test pragma-8.1.3 { 411dae2495bSdanielk1977 execsql { 412b92b70bbSdanielk1977 PRAGMA schema_version = 106; 413dae2495bSdanielk1977 } 414dae2495bSdanielk1977} {} 415dae2495bSdanielk1977do_test pragma-8.1.4 { 416dae2495bSdanielk1977 execsql { 417b92b70bbSdanielk1977 PRAGMA schema_version; 418dae2495bSdanielk1977 } 419dae2495bSdanielk1977} 106 420dae2495bSdanielk1977 421b92b70bbSdanielk1977# Check that creating a table modifies the schema-version (this is really 422b92b70bbSdanielk1977# to verify that the value being read is in fact the schema version). 423dae2495bSdanielk1977do_test pragma-8.1.5 { 424dae2495bSdanielk1977 execsql { 425dae2495bSdanielk1977 CREATE TABLE t4(a, b, c); 426dae2495bSdanielk1977 INSERT INTO t4 VALUES(1, 2, 3); 427dae2495bSdanielk1977 SELECT * FROM t4; 428dae2495bSdanielk1977 } 429dae2495bSdanielk1977} {1 2 3} 430dae2495bSdanielk1977do_test pragma-8.1.6 { 431dae2495bSdanielk1977 execsql { 432b92b70bbSdanielk1977 PRAGMA schema_version; 433dae2495bSdanielk1977 } 434dae2495bSdanielk1977} 107 435dae2495bSdanielk1977 436dae2495bSdanielk1977# Now open a second connection to the database. Ensure that changing the 437b92b70bbSdanielk1977# schema-version using the first connection forces the second connection 438dae2495bSdanielk1977# to reload the schema. This has to be done using the C-API test functions, 439dae2495bSdanielk1977# because the TCL API accounts for SCHEMA_ERROR and retries the query. 440dae2495bSdanielk1977do_test pragma-8.1.7 { 441dae2495bSdanielk1977 set ::DB2 [sqlite3 db2 test.db] 442dae2495bSdanielk1977 execsql { 443dae2495bSdanielk1977 SELECT * FROM t4; 444dae2495bSdanielk1977 } db2 445dae2495bSdanielk1977} {1 2 3} 446dae2495bSdanielk1977do_test pragma-8.1.8 { 447dae2495bSdanielk1977 execsql { 448b92b70bbSdanielk1977 PRAGMA schema_version = 108; 449dae2495bSdanielk1977 } 450dae2495bSdanielk1977} {} 451dae2495bSdanielk1977do_test pragma-8.1.9 { 452dae2495bSdanielk1977 set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY] 453dae2495bSdanielk1977 sqlite3_step $::STMT 454dae2495bSdanielk1977} SQLITE_ERROR 455dae2495bSdanielk1977do_test pragma-8.1.10 { 456dae2495bSdanielk1977 sqlite3_finalize $::STMT 457dae2495bSdanielk1977} SQLITE_SCHEMA 458dae2495bSdanielk1977 459b92b70bbSdanielk1977# Make sure the schema-version can be manipulated in an attached database. 460dae2495bSdanielk1977file delete -force test2.db 461dae2495bSdanielk1977file delete -force test2.db-journal 462dae2495bSdanielk1977do_test pragma-8.1.11 { 463dae2495bSdanielk1977 execsql { 464dae2495bSdanielk1977 ATTACH 'test2.db' AS aux; 465dae2495bSdanielk1977 CREATE TABLE aux.t1(a, b, c); 466b92b70bbSdanielk1977 PRAGMA aux.schema_version = 205; 467dae2495bSdanielk1977 } 468dae2495bSdanielk1977} {} 469dae2495bSdanielk1977do_test pragma-8.1.12 { 470dae2495bSdanielk1977 execsql { 471b92b70bbSdanielk1977 PRAGMA aux.schema_version; 472dae2495bSdanielk1977 } 473dae2495bSdanielk1977} 205 474dae2495bSdanielk1977do_test pragma-8.1.13 { 475dae2495bSdanielk1977 execsql { 476b92b70bbSdanielk1977 PRAGMA schema_version; 477dae2495bSdanielk1977 } 478dae2495bSdanielk1977} 108 479dae2495bSdanielk1977 480b92b70bbSdanielk1977# And check that modifying the schema-version in an attached database 481dae2495bSdanielk1977# forces the second connection to reload the schema. 482dae2495bSdanielk1977do_test pragma-8.1.14 { 483dae2495bSdanielk1977 set ::DB2 [sqlite3 db2 test.db] 484dae2495bSdanielk1977 execsql { 485dae2495bSdanielk1977 ATTACH 'test2.db' AS aux; 486dae2495bSdanielk1977 SELECT * FROM aux.t1; 487dae2495bSdanielk1977 } db2 488dae2495bSdanielk1977} {} 489dae2495bSdanielk1977do_test pragma-8.1.15 { 490dae2495bSdanielk1977 execsql { 491b92b70bbSdanielk1977 PRAGMA aux.schema_version = 206; 492dae2495bSdanielk1977 } 493dae2495bSdanielk1977} {} 494dae2495bSdanielk1977do_test pragma-8.1.16 { 495dae2495bSdanielk1977 set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY] 496dae2495bSdanielk1977 sqlite3_step $::STMT 497dae2495bSdanielk1977} SQLITE_ERROR 498dae2495bSdanielk1977do_test pragma-8.1.17 { 499dae2495bSdanielk1977 sqlite3_finalize $::STMT 500dae2495bSdanielk1977} SQLITE_SCHEMA 501dae2495bSdanielk1977do_test pragma-8.1.18 { 502dae2495bSdanielk1977 db2 close 503dae2495bSdanielk1977} {} 504dae2495bSdanielk1977 505b92b70bbSdanielk1977# Now test that the user-version can be read and written (and that we aren't 506b92b70bbSdanielk1977# accidentally manipulating the schema-version instead). 507dae2495bSdanielk1977do_test pragma-8.2.1 { 508dae2495bSdanielk1977 execsql { 509b92b70bbSdanielk1977 PRAGMA user_version; 510dae2495bSdanielk1977 } 511dae2495bSdanielk1977} {0} 512dae2495bSdanielk1977do_test pragma-8.2.2 { 513dae2495bSdanielk1977 execsql { 514b92b70bbSdanielk1977 PRAGMA user_version = 2; 515dae2495bSdanielk1977 } 516dae2495bSdanielk1977} {} 517dae2495bSdanielk1977do_test pragma-8.2.3 { 518dae2495bSdanielk1977 execsql { 519b92b70bbSdanielk1977 PRAGMA user_version; 520dae2495bSdanielk1977 } 521dae2495bSdanielk1977} {2} 522dae2495bSdanielk1977do_test pragma-8.2.4 { 523dae2495bSdanielk1977 execsql { 524b92b70bbSdanielk1977 PRAGMA schema_version; 525dae2495bSdanielk1977 } 526dae2495bSdanielk1977} {108} 527dae2495bSdanielk1977 528b92b70bbSdanielk1977# Check that the user-version in the auxilary database can be manipulated ( 529dae2495bSdanielk1977# and that we aren't accidentally manipulating the same in the main db). 530dae2495bSdanielk1977do_test pragma-8.2.5 { 531dae2495bSdanielk1977 execsql { 532b92b70bbSdanielk1977 PRAGMA aux.user_version; 533dae2495bSdanielk1977 } 534dae2495bSdanielk1977} {0} 535dae2495bSdanielk1977do_test pragma-8.2.6 { 536dae2495bSdanielk1977 execsql { 537b92b70bbSdanielk1977 PRAGMA aux.user_version = 3; 538dae2495bSdanielk1977 } 539dae2495bSdanielk1977} {} 540dae2495bSdanielk1977do_test pragma-8.2.7 { 541dae2495bSdanielk1977 execsql { 542b92b70bbSdanielk1977 PRAGMA aux.user_version; 543dae2495bSdanielk1977 } 544dae2495bSdanielk1977} {3} 545dae2495bSdanielk1977do_test pragma-8.2.8 { 546dae2495bSdanielk1977 execsql { 547b92b70bbSdanielk1977 PRAGMA main.user_version; 548dae2495bSdanielk1977 } 549dae2495bSdanielk1977} {2} 550dae2495bSdanielk1977 551b92b70bbSdanielk1977# Now check that a ROLLBACK resets the user-version if it has been modified 552dae2495bSdanielk1977# within a transaction. 553dae2495bSdanielk1977do_test pragma-8.2.9 { 554dae2495bSdanielk1977 execsql { 555dae2495bSdanielk1977 BEGIN; 556b92b70bbSdanielk1977 PRAGMA aux.user_version = 10; 557b92b70bbSdanielk1977 PRAGMA user_version = 11; 558dae2495bSdanielk1977 } 559dae2495bSdanielk1977} {} 560dae2495bSdanielk1977do_test pragma-8.2.10 { 561dae2495bSdanielk1977 execsql { 562b92b70bbSdanielk1977 PRAGMA aux.user_version; 563dae2495bSdanielk1977 } 564dae2495bSdanielk1977} {10} 565dae2495bSdanielk1977do_test pragma-8.2.11 { 566dae2495bSdanielk1977 execsql { 567b92b70bbSdanielk1977 PRAGMA main.user_version; 568dae2495bSdanielk1977 } 569dae2495bSdanielk1977} {11} 570dae2495bSdanielk1977do_test pragma-8.2.12 { 571dae2495bSdanielk1977 execsql { 572dae2495bSdanielk1977 ROLLBACK; 573b92b70bbSdanielk1977 PRAGMA aux.user_version; 574dae2495bSdanielk1977 } 575dae2495bSdanielk1977} {3} 576dae2495bSdanielk1977do_test pragma-8.2.13 { 577dae2495bSdanielk1977 execsql { 578b92b70bbSdanielk1977 PRAGMA main.user_version; 579dae2495bSdanielk1977 } 580dae2495bSdanielk1977} {2} 581dae2495bSdanielk1977 582b92b70bbSdanielk1977# Try a negative value for the user-version 583dae2495bSdanielk1977do_test pragma-8.2.14 { 584dae2495bSdanielk1977 execsql { 585b92b70bbSdanielk1977 PRAGMA user_version = -450; 586dae2495bSdanielk1977 } 587dae2495bSdanielk1977} {} 588dae2495bSdanielk1977do_test pragma-8.2.15 { 589dae2495bSdanielk1977 execsql { 590b92b70bbSdanielk1977 PRAGMA user_version; 591dae2495bSdanielk1977 } 592dae2495bSdanielk1977} {-450} 593d9c847dcSdanielk1977} ; # ifcapable schema_version 594d9c847dcSdanielk1977 5959a09a3caStpoindex 5969a09a3caStpoindex# Test temp_store and temp_store_directory pragmas 5979a09a3caStpoindex# 598268283bcSdrhifcapable pager_pragmas { 5999a09a3caStpoindexdo_test pragma-9.1 { 6009a09a3caStpoindex db close 6019a09a3caStpoindex sqlite3 db test.db 6029a09a3caStpoindex execsql { 6039a09a3caStpoindex PRAGMA temp_store; 6049a09a3caStpoindex } 6059a09a3caStpoindex} {0} 6069a09a3caStpoindexdo_test pragma-9.2 { 6079a09a3caStpoindex execsql { 6089a09a3caStpoindex PRAGMA temp_store=file; 6099a09a3caStpoindex PRAGMA temp_store; 6109a09a3caStpoindex } 6119a09a3caStpoindex} {1} 6129a09a3caStpoindexdo_test pragma-9.3 { 6139a09a3caStpoindex execsql { 6149a09a3caStpoindex PRAGMA temp_store=memory; 6159a09a3caStpoindex PRAGMA temp_store; 6169a09a3caStpoindex } 6179a09a3caStpoindex} {2} 6189a09a3caStpoindexdo_test pragma-9.4 { 6199a09a3caStpoindex execsql { 6209a09a3caStpoindex PRAGMA temp_store_directory; 6219a09a3caStpoindex } 6229a09a3caStpoindex} {} 6239a09a3caStpoindexdo_test pragma-9.5 { 624268283bcSdrh set pwd [string map {' ''} [pwd]] 625268283bcSdrh execsql " 626268283bcSdrh PRAGMA temp_store_directory='$pwd'; 6279a09a3caStpoindex " 6289a09a3caStpoindex} {} 6299a09a3caStpoindexdo_test pragma-9.6 { 6309a09a3caStpoindex execsql { 6319a09a3caStpoindex PRAGMA temp_store_directory; 6329a09a3caStpoindex } 6339a09a3caStpoindex} [pwd] 6349a09a3caStpoindexdo_test pragma-9.7 { 635268283bcSdrh catchsql { 6369a09a3caStpoindex PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR'; 6379a09a3caStpoindex } 638268283bcSdrh} {1 {not a writable directory}} 6399a09a3caStpoindexdo_test pragma-9.8 { 6409a09a3caStpoindex execsql { 6419a09a3caStpoindex PRAGMA temp_store_directory=''; 6429a09a3caStpoindex } 6439a09a3caStpoindex} {} 6449a09a3caStpoindexdo_test pragma-9.9 { 6459a09a3caStpoindex execsql { 6469a09a3caStpoindex PRAGMA temp_store_directory; 6479a09a3caStpoindex PRAGMA temp_store=FILE; 6489a09a3caStpoindex CREATE TEMP TABLE temp_store_directory_test(a integer); 6499a09a3caStpoindex INSERT INTO temp_store_directory_test values (2); 6509a09a3caStpoindex SELECT * FROM temp_store_directory_test; 6519a09a3caStpoindex } 6529a09a3caStpoindex} {2} 6539a09a3caStpoindexdo_test pragma-9.10 { 654268283bcSdrh catchsql " 655268283bcSdrh PRAGMA temp_store_directory='$pwd'; 6569a09a3caStpoindex SELECT * FROM temp_store_directory_test; 6579a09a3caStpoindex " 658268283bcSdrh} {1 {no such table: temp_store_directory_test}} 659268283bcSdrh} ;# ifcapable pager_pragmas 6609a09a3caStpoindex 661cc6bd383Sdanielk1977ifcapable trigger { 662cc6bd383Sdanielk1977 663cc6bd383Sdanielk1977do_test pragma-10.0 { 664cc6bd383Sdanielk1977 catchsql { 665cc6bd383Sdanielk1977 DROP TABLE main.t1; 666cc6bd383Sdanielk1977 } 667cc6bd383Sdanielk1977 execsql { 668cc6bd383Sdanielk1977 PRAGMA count_changes = 1; 669cc6bd383Sdanielk1977 670cc6bd383Sdanielk1977 CREATE TABLE t1(a PRIMARY KEY); 671cc6bd383Sdanielk1977 CREATE TABLE t1_mirror(a); 672cc6bd383Sdanielk1977 CREATE TABLE t1_mirror2(a); 673cc6bd383Sdanielk1977 CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN 674cc6bd383Sdanielk1977 INSERT INTO t1_mirror VALUES(new.a); 675cc6bd383Sdanielk1977 END; 676cc6bd383Sdanielk1977 CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN 677cc6bd383Sdanielk1977 INSERT INTO t1_mirror2 VALUES(new.a); 678cc6bd383Sdanielk1977 END; 679cc6bd383Sdanielk1977 CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN 680cc6bd383Sdanielk1977 UPDATE t1_mirror SET a = new.a WHERE a = old.a; 681cc6bd383Sdanielk1977 END; 682cc6bd383Sdanielk1977 CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN 683cc6bd383Sdanielk1977 UPDATE t1_mirror2 SET a = new.a WHERE a = old.a; 684cc6bd383Sdanielk1977 END; 685cc6bd383Sdanielk1977 CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN 686cc6bd383Sdanielk1977 DELETE FROM t1_mirror WHERE a = old.a; 687cc6bd383Sdanielk1977 END; 688cc6bd383Sdanielk1977 CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN 689cc6bd383Sdanielk1977 DELETE FROM t1_mirror2 WHERE a = old.a; 690cc6bd383Sdanielk1977 END; 691cc6bd383Sdanielk1977 } 692cc6bd383Sdanielk1977} {} 693cc6bd383Sdanielk1977 694cc6bd383Sdanielk1977do_test pragma-10.1 { 695cc6bd383Sdanielk1977 execsql { 696cc6bd383Sdanielk1977 INSERT INTO t1 VALUES(randstr(10,10)); 697cc6bd383Sdanielk1977 } 698cc6bd383Sdanielk1977} {1} 699cc6bd383Sdanielk1977do_test pragma-10.2 { 700cc6bd383Sdanielk1977 execsql { 701cc6bd383Sdanielk1977 UPDATE t1 SET a = randstr(10,10); 702cc6bd383Sdanielk1977 } 703cc6bd383Sdanielk1977} {1} 704cc6bd383Sdanielk1977do_test pragma-10.3 { 705cc6bd383Sdanielk1977 execsql { 706cc6bd383Sdanielk1977 DELETE FROM t1; 707cc6bd383Sdanielk1977 } 708cc6bd383Sdanielk1977} {1} 709cc6bd383Sdanielk1977 710cc6bd383Sdanielk1977} ;# ifcapable trigger 711cc6bd383Sdanielk1977 712*5558a8a6Sdanielk1977# Reset the sqlite3_temp_directory variable for the next run of tests: 713*5558a8a6Sdanielk1977sqlite3 dbX :memory: 714*5558a8a6Sdanielk1977dbX eval {PRAGMA temp_store_directory = ""} 715*5558a8a6Sdanielk1977dbX close 716*5558a8a6Sdanielk1977 717cd61c281Sdrhfinish_test 718cc6bd383Sdanielk1977 719cc6bd383Sdanielk1977 720