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*eb43e5c7Sdrh# $Id: pragma.test,v 1.36 2005/05/22 20:30:39 drh 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. 3348af65aeSdanielk1977# pragma-11.*: Test the collation_list pragma. 3491cf71b0Sdanielk1977# 3591cf71b0Sdanielk1977 36cd61c281Sdrh# Delete the preexisting database to avoid the special setup 37cd61c281Sdrh# that the "all.test" script does. 38cd61c281Sdrh# 39cd61c281Sdrhdb close 40cd61c281Sdrhfile delete test.db 41ef4ac8f9Sdrhset DB [sqlite3 db test.db] 42cd61c281Sdrh 43c7b4a44cSdanielk1977ifcapable pager_pragmas { 44cd61c281Sdrhdo_test pragma-1.1 { 45cd61c281Sdrh execsql { 46cd61c281Sdrh PRAGMA cache_size; 47cd61c281Sdrh PRAGMA default_cache_size; 48cd61c281Sdrh PRAGMA synchronous; 49cd61c281Sdrh } 5091cf71b0Sdanielk1977} {2000 2000 2} 51cd61c281Sdrhdo_test pragma-1.2 { 52cd61c281Sdrh execsql { 53*eb43e5c7Sdrh PRAGMA synchronous=OFF; 54cd61c281Sdrh PRAGMA cache_size=1234; 55cd61c281Sdrh PRAGMA cache_size; 56cd61c281Sdrh PRAGMA default_cache_size; 57cd61c281Sdrh PRAGMA synchronous; 58cd61c281Sdrh } 59*eb43e5c7Sdrh} {1234 2000 0} 60cd61c281Sdrhdo_test pragma-1.3 { 61cd61c281Sdrh db close 62ef4ac8f9Sdrh sqlite3 db test.db 63cd61c281Sdrh execsql { 64cd61c281Sdrh PRAGMA cache_size; 65cd61c281Sdrh PRAGMA default_cache_size; 66cd61c281Sdrh PRAGMA synchronous; 67cd61c281Sdrh } 6891cf71b0Sdanielk1977} {2000 2000 2} 69cd61c281Sdrhdo_test pragma-1.4 { 70cd61c281Sdrh execsql { 71cd61c281Sdrh PRAGMA synchronous=OFF; 72cd61c281Sdrh PRAGMA cache_size; 73cd61c281Sdrh PRAGMA default_cache_size; 74cd61c281Sdrh PRAGMA synchronous; 75cd61c281Sdrh } 7691cf71b0Sdanielk1977} {2000 2000 0} 77cd61c281Sdrhdo_test pragma-1.5 { 78cd61c281Sdrh execsql { 79cd61c281Sdrh PRAGMA cache_size=4321; 80cd61c281Sdrh PRAGMA cache_size; 81cd61c281Sdrh PRAGMA default_cache_size; 82cd61c281Sdrh PRAGMA synchronous; 83cd61c281Sdrh } 8491cf71b0Sdanielk1977} {4321 2000 0} 85cd61c281Sdrhdo_test pragma-1.6 { 86cd61c281Sdrh execsql { 87cd61c281Sdrh PRAGMA synchronous=ON; 88cd61c281Sdrh PRAGMA cache_size; 89cd61c281Sdrh PRAGMA default_cache_size; 90cd61c281Sdrh PRAGMA synchronous; 91cd61c281Sdrh } 9291cf71b0Sdanielk1977} {4321 2000 1} 93cd61c281Sdrhdo_test pragma-1.7 { 94cd61c281Sdrh db close 95ef4ac8f9Sdrh sqlite3 db test.db 96cd61c281Sdrh execsql { 97cd61c281Sdrh PRAGMA cache_size; 98cd61c281Sdrh PRAGMA default_cache_size; 99cd61c281Sdrh PRAGMA synchronous; 100cd61c281Sdrh } 10191cf71b0Sdanielk1977} {2000 2000 2} 102cd61c281Sdrhdo_test pragma-1.8 { 103cd61c281Sdrh execsql { 104cd61c281Sdrh PRAGMA default_cache_size=123; 105cd61c281Sdrh PRAGMA cache_size; 106cd61c281Sdrh PRAGMA default_cache_size; 107cd61c281Sdrh PRAGMA synchronous; 108cd61c281Sdrh } 10991cf71b0Sdanielk1977} {123 123 2} 110802d69a7Sdrhdo_test pragma-1.9.1 { 111cd61c281Sdrh db close 112ef4ac8f9Sdrh set ::DB [sqlite3 db test.db] 113cd61c281Sdrh execsql { 114cd61c281Sdrh PRAGMA cache_size; 115cd61c281Sdrh PRAGMA default_cache_size; 116cd61c281Sdrh PRAGMA synchronous; 117cd61c281Sdrh } 11891cf71b0Sdanielk1977} {123 123 2} 119802d69a7Sdrhifcapable vacuum { 120802d69a7Sdrh do_test pragma-1.9.2 { 121802d69a7Sdrh execsql { 122802d69a7Sdrh VACUUM; 123802d69a7Sdrh PRAGMA cache_size; 124802d69a7Sdrh PRAGMA default_cache_size; 125802d69a7Sdrh PRAGMA synchronous; 126802d69a7Sdrh } 127802d69a7Sdrh } {123 123 2} 128802d69a7Sdrh} 12991cf71b0Sdanielk1977do_test pragma-1.10 { 1305a38705eSdrh execsql { 1314303feedSdrh PRAGMA synchronous=NORMAL; 1324303feedSdrh PRAGMA cache_size; 1334303feedSdrh PRAGMA default_cache_size; 1344303feedSdrh PRAGMA synchronous; 1354303feedSdrh } 13691cf71b0Sdanielk1977} {123 123 1} 13791cf71b0Sdanielk1977do_test pragma-1.11 { 1384303feedSdrh execsql { 1394303feedSdrh PRAGMA synchronous=FULL; 1404303feedSdrh PRAGMA cache_size; 1414303feedSdrh PRAGMA default_cache_size; 1424303feedSdrh PRAGMA synchronous; 1434303feedSdrh } 14491cf71b0Sdanielk1977} {123 123 2} 14591cf71b0Sdanielk1977do_test pragma-1.12 { 1464303feedSdrh db close 147ef4ac8f9Sdrh set ::DB [sqlite3 db test.db] 1484303feedSdrh execsql { 1494303feedSdrh PRAGMA cache_size; 1504303feedSdrh PRAGMA default_cache_size; 1514303feedSdrh PRAGMA synchronous; 1524303feedSdrh } 15391cf71b0Sdanielk1977} {123 123 2} 15491cf71b0Sdanielk1977 1555260f7e9Sdrh# Make sure the pragma handler understands numeric values in addition 1565260f7e9Sdrh# to keywords like "off" and "full". 1575260f7e9Sdrh# 1585260f7e9Sdrhdo_test pragma-1.13 { 1595260f7e9Sdrh execsql { 1605260f7e9Sdrh PRAGMA synchronous=0; 1615260f7e9Sdrh PRAGMA synchronous; 1625260f7e9Sdrh } 1635260f7e9Sdrh} {0} 1645260f7e9Sdrhdo_test pragma-1.14 { 1655260f7e9Sdrh execsql { 1665260f7e9Sdrh PRAGMA synchronous=2; 1675260f7e9Sdrh PRAGMA synchronous; 1685260f7e9Sdrh } 1695260f7e9Sdrh} {2} 170c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas 1715260f7e9Sdrh 1725260f7e9Sdrh# Test turning "flag" pragmas on and off. 1735260f7e9Sdrh# 1745260f7e9Sdrhdo_test pragma-1.15 { 1755260f7e9Sdrh execsql { 1765260f7e9Sdrh PRAGMA vdbe_listing=YES; 1775260f7e9Sdrh PRAGMA vdbe_listing; 1785260f7e9Sdrh } 1795260f7e9Sdrh} {1} 1805260f7e9Sdrhdo_test pragma-1.16 { 1815260f7e9Sdrh execsql { 1825260f7e9Sdrh PRAGMA vdbe_listing=NO; 1835260f7e9Sdrh PRAGMA vdbe_listing; 1845260f7e9Sdrh } 1855260f7e9Sdrh} {0} 1865260f7e9Sdrhdo_test pragma-1.17 { 1875260f7e9Sdrh execsql { 1885260f7e9Sdrh PRAGMA parser_trace=ON; 1895260f7e9Sdrh PRAGMA parser_trace=OFF; 1905260f7e9Sdrh } 1915260f7e9Sdrh} {} 1925260f7e9Sdrhdo_test pragma-1.18 { 1935260f7e9Sdrh execsql { 1945260f7e9Sdrh PRAGMA bogus = -1234; -- Parsing of negative values 1955260f7e9Sdrh } 1965260f7e9Sdrh} {} 1975260f7e9Sdrh 19891cf71b0Sdanielk1977# Test modifying the safety_level of an attached database. 19991cf71b0Sdanielk1977do_test pragma-2.1 { 20091cf71b0Sdanielk1977 file delete -force test2.db 20191cf71b0Sdanielk1977 file delete -force test2.db-journal 2024303feedSdrh execsql { 20391cf71b0Sdanielk1977 ATTACH 'test2.db' AS aux; 2044303feedSdrh } 20591cf71b0Sdanielk1977} {} 206c7b4a44cSdanielk1977ifcapable pager_pragmas { 20791cf71b0Sdanielk1977do_test pragma-2.2 { 2084303feedSdrh execsql { 20991cf71b0Sdanielk1977 pragma aux.synchronous; 2104303feedSdrh } 21191cf71b0Sdanielk1977} {2} 21291cf71b0Sdanielk1977do_test pragma-2.3 { 21391cf71b0Sdanielk1977 execsql { 21491cf71b0Sdanielk1977 pragma aux.synchronous = OFF; 21591cf71b0Sdanielk1977 pragma aux.synchronous; 21691cf71b0Sdanielk1977 pragma synchronous; 21791cf71b0Sdanielk1977 } 21891cf71b0Sdanielk1977} {0 2} 21991cf71b0Sdanielk1977do_test pragma-2.4 { 22091cf71b0Sdanielk1977 execsql { 22191cf71b0Sdanielk1977 pragma aux.synchronous = ON; 22291cf71b0Sdanielk1977 pragma synchronous; 22391cf71b0Sdanielk1977 pragma aux.synchronous; 22491cf71b0Sdanielk1977 } 22591cf71b0Sdanielk1977} {2 1} 226c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas 2274303feedSdrh 228ed717fe3Sdrh# Construct a corrupted index and make sure the integrity_check 229ed717fe3Sdrh# pragma finds it. 230ed717fe3Sdrh# 23125d6543dSdrh# These tests won't work if the database is encrypted 23225d6543dSdrh# 233ed717fe3Sdrhdo_test pragma-3.1 { 234ed717fe3Sdrh execsql { 235ed717fe3Sdrh BEGIN; 236ed717fe3Sdrh CREATE TABLE t2(a,b,c); 237ed717fe3Sdrh CREATE INDEX i2 ON t2(a); 238ed717fe3Sdrh INSERT INTO t2 VALUES(11,2,3); 239ed717fe3Sdrh INSERT INTO t2 VALUES(22,3,4); 240ed717fe3Sdrh COMMIT; 241ed717fe3Sdrh SELECT rowid, * from t2; 242ed717fe3Sdrh } 243ed717fe3Sdrh} {1 11 2 3 2 22 3 4} 24440e016e4Sdrhif {![sqlite3 -has-codec] && $sqlite_options(integrityck)} { 245ed717fe3Sdrh do_test pragma-3.2 { 246ed717fe3Sdrh set rootpage [execsql {SELECT rootpage FROM sqlite_master WHERE name='i2'}] 24796fc5fe6Sdanielk1977 set db [btree_open test.db 100 0] 248ed717fe3Sdrh btree_begin_transaction $db 249ed717fe3Sdrh set c [btree_cursor $db $rootpage 1] 250ed717fe3Sdrh btree_first $c 251ed717fe3Sdrh btree_delete $c 252ed717fe3Sdrh btree_commit $db 253ed717fe3Sdrh btree_close $db 254ed717fe3Sdrh execsql {PRAGMA integrity_check} 2554be295beSdrh } {{rowid 1 missing from index i2} {wrong # of entries in index i2}} 25625d6543dSdrh} 25791cf71b0Sdanielk1977do_test pragma-3.3 { 25891cf71b0Sdanielk1977 execsql { 25991cf71b0Sdanielk1977 DROP INDEX i2; 26091cf71b0Sdanielk1977 } 26191cf71b0Sdanielk1977} {} 26291cf71b0Sdanielk1977 26391cf71b0Sdanielk1977# Test modifying the cache_size of an attached database. 264c7b4a44cSdanielk1977ifcapable pager_pragmas { 26591cf71b0Sdanielk1977do_test pragma-4.1 { 26691cf71b0Sdanielk1977 execsql { 26791cf71b0Sdanielk1977 pragma aux.cache_size; 26891cf71b0Sdanielk1977 pragma aux.default_cache_size; 26991cf71b0Sdanielk1977 } 27091cf71b0Sdanielk1977} {2000 2000} 2711bdd9b57Sdrhdo_test pragma-4.2 { 2721bdd9b57Sdrh execsql { 27391cf71b0Sdanielk1977 pragma aux.cache_size = 50; 27491cf71b0Sdanielk1977 pragma aux.cache_size; 27591cf71b0Sdanielk1977 pragma aux.default_cache_size; 2761bdd9b57Sdrh } 27791cf71b0Sdanielk1977} {50 2000} 2781bdd9b57Sdrhdo_test pragma-4.3 { 2791bdd9b57Sdrh execsql { 28091cf71b0Sdanielk1977 pragma aux.default_cache_size = 456; 28191cf71b0Sdanielk1977 pragma aux.cache_size; 28291cf71b0Sdanielk1977 pragma aux.default_cache_size; 2831bdd9b57Sdrh } 28491cf71b0Sdanielk1977} {456 456} 2851bdd9b57Sdrhdo_test pragma-4.4 { 2861bdd9b57Sdrh execsql { 28791cf71b0Sdanielk1977 pragma cache_size; 28891cf71b0Sdanielk1977 pragma default_cache_size; 2891bdd9b57Sdrh } 29091cf71b0Sdanielk1977} {123 123} 2911bdd9b57Sdrhdo_test pragma-4.5 { 2921bdd9b57Sdrh execsql { 29391cf71b0Sdanielk1977 DETACH aux; 29491cf71b0Sdanielk1977 ATTACH 'test3.db' AS aux; 29591cf71b0Sdanielk1977 pragma aux.cache_size; 29691cf71b0Sdanielk1977 pragma aux.default_cache_size; 2971bdd9b57Sdrh } 29891cf71b0Sdanielk1977} {2000 2000} 2991bdd9b57Sdrhdo_test pragma-4.6 { 3001bdd9b57Sdrh execsql { 30191cf71b0Sdanielk1977 DETACH aux; 30291cf71b0Sdanielk1977 ATTACH 'test2.db' AS aux; 30391cf71b0Sdanielk1977 pragma aux.cache_size; 30491cf71b0Sdanielk1977 pragma aux.default_cache_size; 3051bdd9b57Sdrh } 30691cf71b0Sdanielk1977} {456 456} 307c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas 3081bdd9b57Sdrh 30991cf71b0Sdanielk1977# Test that modifying the sync-level in the middle of a transaction is 31091cf71b0Sdanielk1977# disallowed. 311c7b4a44cSdanielk1977ifcapable pager_pragmas { 31291cf71b0Sdanielk1977do_test pragma-5.0 { 3131bdd9b57Sdrh execsql { 31491cf71b0Sdanielk1977 pragma synchronous; 3151bdd9b57Sdrh } 31691cf71b0Sdanielk1977} {2} 31791cf71b0Sdanielk1977do_test pragma-5.1 { 3181bdd9b57Sdrh catchsql { 3191bdd9b57Sdrh BEGIN; 32091cf71b0Sdanielk1977 pragma synchronous = OFF; 3211bdd9b57Sdrh } 32291cf71b0Sdanielk1977} {1 {Safety level may not be changed inside a transaction}} 32391cf71b0Sdanielk1977do_test pragma-5.2 { 32491cf71b0Sdanielk1977 execsql { 32591cf71b0Sdanielk1977 pragma synchronous; 32691cf71b0Sdanielk1977 } 32791cf71b0Sdanielk1977} {2} 3285260f7e9Sdrhcatchsql {COMMIT;} 329c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas 3305260f7e9Sdrh 3315260f7e9Sdrh# Test schema-query pragmas 3325260f7e9Sdrh# 33327188fb5Sdanielk1977ifcapable schema_pragmas { 33453c0f748Sdanielk1977ifcapable tempdb { 3355260f7e9Sdrh do_test pragma-6.1 { 336956bc92cSdrh set res {} 33740e016e4Sdrh execsql {SELECT * FROM sqlite_temp_master} 3385260f7e9Sdrh foreach {idx name file} [execsql {pragma database_list}] { 3395260f7e9Sdrh lappend res $idx $name 3405260f7e9Sdrh } 3415260f7e9Sdrh set res 342a71aa001Sdrh } {0 main 1 temp 2 aux} 34353c0f748Sdanielk1977} 3445260f7e9Sdrhdo_test pragma-6.2 { 3455260f7e9Sdrh execsql { 3465260f7e9Sdrh pragma table_info(t2) 3475260f7e9Sdrh } 3485260f7e9Sdrh} {0 a numeric 0 {} 0 1 b numeric 0 {} 0 2 c numeric 0 {} 0} 3496bf89570Sdrhifcapable {foreignkey} { 3505260f7e9Sdrh do_test pragma-6.3 { 3515260f7e9Sdrh execsql { 3525260f7e9Sdrh CREATE TABLE t3(a int references t2(b), b UNIQUE); 3535260f7e9Sdrh pragma foreign_key_list(t3); 3545260f7e9Sdrh } 3555260f7e9Sdrh } {0 0 t2 a b} 3565260f7e9Sdrh do_test pragma-6.4 { 3575260f7e9Sdrh execsql { 3585260f7e9Sdrh pragma index_list(t3); 3595260f7e9Sdrh } 3605260f7e9Sdrh } {0 sqlite_autoindex_t3_1 1} 3616bf89570Sdrh} 3626bf89570Sdrhifcapable {!foreignkey} { 3636bf89570Sdrh execsql {CREATE TABLE t3(a,b UNIQUE)} 3646bf89570Sdrh} 3655260f7e9Sdrhdo_test pragma-6.5 { 3665260f7e9Sdrh execsql { 3675260f7e9Sdrh CREATE INDEX t3i1 ON t3(a,b); 3685260f7e9Sdrh pragma index_info(t3i1); 3695260f7e9Sdrh } 3705260f7e9Sdrh} {0 0 a 1 1 b} 37127188fb5Sdanielk1977} ;# ifcapable schema_pragmas 3725260f7e9Sdrh# Miscellaneous tests 3735260f7e9Sdrh# 37427188fb5Sdanielk1977ifcapable schema_pragmas { 3755260f7e9Sdrhdo_test pragma-7.1 { 3765260f7e9Sdrh # Make sure a pragma knows to read the schema if it needs to 3775260f7e9Sdrh db close 3785260f7e9Sdrh sqlite3 db test.db 3795260f7e9Sdrh execsql { 3805260f7e9Sdrh pragma index_list(t3); 3815260f7e9Sdrh } 3825260f7e9Sdrh} {0 t3i1 0 1 sqlite_autoindex_t3_1 1} 38327188fb5Sdanielk1977} ;# ifcapable schema_pragmas 3846c62608fSdrhifcapable {utf16} { 3855260f7e9Sdrh do_test pragma-7.2 { 3865260f7e9Sdrh db close 3875260f7e9Sdrh sqlite3 db test.db 3885260f7e9Sdrh catchsql { 3895260f7e9Sdrh pragma encoding=bogus; 3905260f7e9Sdrh } 3915260f7e9Sdrh } {1 {unsupported encoding: bogus}} 3926c62608fSdrh} 39353c0f748Sdanielk1977ifcapable tempdb { 3945260f7e9Sdrh do_test pragma-7.3 { 3955260f7e9Sdrh db close 3965260f7e9Sdrh sqlite3 db test.db 3975260f7e9Sdrh execsql { 3985260f7e9Sdrh pragma lock_status; 3995260f7e9Sdrh } 4005260f7e9Sdrh } {main unlocked temp closed} 40153c0f748Sdanielk1977} else { 40253c0f748Sdanielk1977 do_test pragma-7.3 { 40353c0f748Sdanielk1977 db close 40453c0f748Sdanielk1977 sqlite3 db test.db 40553c0f748Sdanielk1977 execsql { 40653c0f748Sdanielk1977 pragma lock_status; 40753c0f748Sdanielk1977 } 40853c0f748Sdanielk1977 } {main unlocked} 40953c0f748Sdanielk1977} 4105260f7e9Sdrh 4115260f7e9Sdrh 412dae2495bSdanielk1977#---------------------------------------------------------------------- 413b92b70bbSdanielk1977# Test cases pragma-8.* test the "PRAGMA schema_version" and "PRAGMA 414b92b70bbSdanielk1977# user_version" statements. 415dae2495bSdanielk1977# 416b92b70bbSdanielk1977# pragma-8.1: PRAGMA schema_version 417b92b70bbSdanielk1977# pragma-8.2: PRAGMA user_version 418dae2495bSdanielk1977# 419dae2495bSdanielk1977 42011cf9fbcSdanielk1977ifcapable schema_version { 42111cf9fbcSdanielk1977 422b92b70bbSdanielk1977# First check that we can set the schema version and then retrieve the 423dae2495bSdanielk1977# same value. 424dae2495bSdanielk1977do_test pragma-8.1.1 { 425dae2495bSdanielk1977 execsql { 426b92b70bbSdanielk1977 PRAGMA schema_version = 105; 427dae2495bSdanielk1977 } 428dae2495bSdanielk1977} {} 429dae2495bSdanielk1977do_test pragma-8.1.2 { 430dae2495bSdanielk1977 execsql { 431b92b70bbSdanielk1977 PRAGMA schema_version; 432dae2495bSdanielk1977 } 433dae2495bSdanielk1977} 105 434dae2495bSdanielk1977do_test pragma-8.1.3 { 435dae2495bSdanielk1977 execsql { 436b92b70bbSdanielk1977 PRAGMA schema_version = 106; 437dae2495bSdanielk1977 } 438dae2495bSdanielk1977} {} 439dae2495bSdanielk1977do_test pragma-8.1.4 { 440dae2495bSdanielk1977 execsql { 441b92b70bbSdanielk1977 PRAGMA schema_version; 442dae2495bSdanielk1977 } 443dae2495bSdanielk1977} 106 444dae2495bSdanielk1977 445b92b70bbSdanielk1977# Check that creating a table modifies the schema-version (this is really 446b92b70bbSdanielk1977# to verify that the value being read is in fact the schema version). 447dae2495bSdanielk1977do_test pragma-8.1.5 { 448dae2495bSdanielk1977 execsql { 449dae2495bSdanielk1977 CREATE TABLE t4(a, b, c); 450dae2495bSdanielk1977 INSERT INTO t4 VALUES(1, 2, 3); 451dae2495bSdanielk1977 SELECT * FROM t4; 452dae2495bSdanielk1977 } 453dae2495bSdanielk1977} {1 2 3} 454dae2495bSdanielk1977do_test pragma-8.1.6 { 455dae2495bSdanielk1977 execsql { 456b92b70bbSdanielk1977 PRAGMA schema_version; 457dae2495bSdanielk1977 } 458dae2495bSdanielk1977} 107 459dae2495bSdanielk1977 460dae2495bSdanielk1977# Now open a second connection to the database. Ensure that changing the 461b92b70bbSdanielk1977# schema-version using the first connection forces the second connection 462dae2495bSdanielk1977# to reload the schema. This has to be done using the C-API test functions, 463dae2495bSdanielk1977# because the TCL API accounts for SCHEMA_ERROR and retries the query. 464dae2495bSdanielk1977do_test pragma-8.1.7 { 465dae2495bSdanielk1977 set ::DB2 [sqlite3 db2 test.db] 466dae2495bSdanielk1977 execsql { 467dae2495bSdanielk1977 SELECT * FROM t4; 468dae2495bSdanielk1977 } db2 469dae2495bSdanielk1977} {1 2 3} 470dae2495bSdanielk1977do_test pragma-8.1.8 { 471dae2495bSdanielk1977 execsql { 472b92b70bbSdanielk1977 PRAGMA schema_version = 108; 473dae2495bSdanielk1977 } 474dae2495bSdanielk1977} {} 475dae2495bSdanielk1977do_test pragma-8.1.9 { 476dae2495bSdanielk1977 set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY] 477dae2495bSdanielk1977 sqlite3_step $::STMT 478dae2495bSdanielk1977} SQLITE_ERROR 479dae2495bSdanielk1977do_test pragma-8.1.10 { 480dae2495bSdanielk1977 sqlite3_finalize $::STMT 481dae2495bSdanielk1977} SQLITE_SCHEMA 482dae2495bSdanielk1977 483b92b70bbSdanielk1977# Make sure the schema-version can be manipulated in an attached database. 484dae2495bSdanielk1977file delete -force test2.db 485dae2495bSdanielk1977file delete -force test2.db-journal 486dae2495bSdanielk1977do_test pragma-8.1.11 { 487dae2495bSdanielk1977 execsql { 488dae2495bSdanielk1977 ATTACH 'test2.db' AS aux; 489dae2495bSdanielk1977 CREATE TABLE aux.t1(a, b, c); 490b92b70bbSdanielk1977 PRAGMA aux.schema_version = 205; 491dae2495bSdanielk1977 } 492dae2495bSdanielk1977} {} 493dae2495bSdanielk1977do_test pragma-8.1.12 { 494dae2495bSdanielk1977 execsql { 495b92b70bbSdanielk1977 PRAGMA aux.schema_version; 496dae2495bSdanielk1977 } 497dae2495bSdanielk1977} 205 498dae2495bSdanielk1977do_test pragma-8.1.13 { 499dae2495bSdanielk1977 execsql { 500b92b70bbSdanielk1977 PRAGMA schema_version; 501dae2495bSdanielk1977 } 502dae2495bSdanielk1977} 108 503dae2495bSdanielk1977 504b92b70bbSdanielk1977# And check that modifying the schema-version in an attached database 505dae2495bSdanielk1977# forces the second connection to reload the schema. 506dae2495bSdanielk1977do_test pragma-8.1.14 { 507dae2495bSdanielk1977 set ::DB2 [sqlite3 db2 test.db] 508dae2495bSdanielk1977 execsql { 509dae2495bSdanielk1977 ATTACH 'test2.db' AS aux; 510dae2495bSdanielk1977 SELECT * FROM aux.t1; 511dae2495bSdanielk1977 } db2 512dae2495bSdanielk1977} {} 513dae2495bSdanielk1977do_test pragma-8.1.15 { 514dae2495bSdanielk1977 execsql { 515b92b70bbSdanielk1977 PRAGMA aux.schema_version = 206; 516dae2495bSdanielk1977 } 517dae2495bSdanielk1977} {} 518dae2495bSdanielk1977do_test pragma-8.1.16 { 519dae2495bSdanielk1977 set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY] 520dae2495bSdanielk1977 sqlite3_step $::STMT 521dae2495bSdanielk1977} SQLITE_ERROR 522dae2495bSdanielk1977do_test pragma-8.1.17 { 523dae2495bSdanielk1977 sqlite3_finalize $::STMT 524dae2495bSdanielk1977} SQLITE_SCHEMA 525dae2495bSdanielk1977do_test pragma-8.1.18 { 526dae2495bSdanielk1977 db2 close 527dae2495bSdanielk1977} {} 528dae2495bSdanielk1977 529b92b70bbSdanielk1977# Now test that the user-version can be read and written (and that we aren't 530b92b70bbSdanielk1977# accidentally manipulating the schema-version instead). 531dae2495bSdanielk1977do_test pragma-8.2.1 { 532dae2495bSdanielk1977 execsql { 533b92b70bbSdanielk1977 PRAGMA user_version; 534dae2495bSdanielk1977 } 535dae2495bSdanielk1977} {0} 536dae2495bSdanielk1977do_test pragma-8.2.2 { 537dae2495bSdanielk1977 execsql { 538b92b70bbSdanielk1977 PRAGMA user_version = 2; 539dae2495bSdanielk1977 } 540dae2495bSdanielk1977} {} 541802d69a7Sdrhdo_test pragma-8.2.3.1 { 542dae2495bSdanielk1977 execsql { 543b92b70bbSdanielk1977 PRAGMA user_version; 544dae2495bSdanielk1977 } 545dae2495bSdanielk1977} {2} 546802d69a7Sdrhdo_test pragma-8.2.3.2 { 547802d69a7Sdrh db close 548802d69a7Sdrh sqlite3 db test.db 549802d69a7Sdrh execsql { 550802d69a7Sdrh PRAGMA user_version; 551802d69a7Sdrh } 552802d69a7Sdrh} {2} 553802d69a7Sdrhdo_test pragma-8.2.4.1 { 554dae2495bSdanielk1977 execsql { 555b92b70bbSdanielk1977 PRAGMA schema_version; 556dae2495bSdanielk1977 } 557dae2495bSdanielk1977} {108} 558802d69a7Sdrhifcapable vacuum { 559802d69a7Sdrh do_test pragma-8.2.4.2 { 560802d69a7Sdrh execsql { 561802d69a7Sdrh VACUUM; 562802d69a7Sdrh PRAGMA user_version; 563802d69a7Sdrh } 564802d69a7Sdrh } {2} 565802d69a7Sdrh do_test pragma-8.2.4.3 { 566802d69a7Sdrh execsql { 567802d69a7Sdrh PRAGMA schema_version; 568802d69a7Sdrh } 569802d69a7Sdrh } {109} 570802d69a7Sdrh} 571802d69a7Sdrhdb eval {ATTACH 'test2.db' AS aux} 572dae2495bSdanielk1977 573b92b70bbSdanielk1977# Check that the user-version in the auxilary database can be manipulated ( 574dae2495bSdanielk1977# and that we aren't accidentally manipulating the same in the main db). 575dae2495bSdanielk1977do_test pragma-8.2.5 { 576dae2495bSdanielk1977 execsql { 577b92b70bbSdanielk1977 PRAGMA aux.user_version; 578dae2495bSdanielk1977 } 579dae2495bSdanielk1977} {0} 580dae2495bSdanielk1977do_test pragma-8.2.6 { 581dae2495bSdanielk1977 execsql { 582b92b70bbSdanielk1977 PRAGMA aux.user_version = 3; 583dae2495bSdanielk1977 } 584dae2495bSdanielk1977} {} 585dae2495bSdanielk1977do_test pragma-8.2.7 { 586dae2495bSdanielk1977 execsql { 587b92b70bbSdanielk1977 PRAGMA aux.user_version; 588dae2495bSdanielk1977 } 589dae2495bSdanielk1977} {3} 590dae2495bSdanielk1977do_test pragma-8.2.8 { 591dae2495bSdanielk1977 execsql { 592b92b70bbSdanielk1977 PRAGMA main.user_version; 593dae2495bSdanielk1977 } 594dae2495bSdanielk1977} {2} 595dae2495bSdanielk1977 596b92b70bbSdanielk1977# Now check that a ROLLBACK resets the user-version if it has been modified 597dae2495bSdanielk1977# within a transaction. 598dae2495bSdanielk1977do_test pragma-8.2.9 { 599dae2495bSdanielk1977 execsql { 600dae2495bSdanielk1977 BEGIN; 601b92b70bbSdanielk1977 PRAGMA aux.user_version = 10; 602b92b70bbSdanielk1977 PRAGMA user_version = 11; 603dae2495bSdanielk1977 } 604dae2495bSdanielk1977} {} 605dae2495bSdanielk1977do_test pragma-8.2.10 { 606dae2495bSdanielk1977 execsql { 607b92b70bbSdanielk1977 PRAGMA aux.user_version; 608dae2495bSdanielk1977 } 609dae2495bSdanielk1977} {10} 610dae2495bSdanielk1977do_test pragma-8.2.11 { 611dae2495bSdanielk1977 execsql { 612b92b70bbSdanielk1977 PRAGMA main.user_version; 613dae2495bSdanielk1977 } 614dae2495bSdanielk1977} {11} 615dae2495bSdanielk1977do_test pragma-8.2.12 { 616dae2495bSdanielk1977 execsql { 617dae2495bSdanielk1977 ROLLBACK; 618b92b70bbSdanielk1977 PRAGMA aux.user_version; 619dae2495bSdanielk1977 } 620dae2495bSdanielk1977} {3} 621dae2495bSdanielk1977do_test pragma-8.2.13 { 622dae2495bSdanielk1977 execsql { 623b92b70bbSdanielk1977 PRAGMA main.user_version; 624dae2495bSdanielk1977 } 625dae2495bSdanielk1977} {2} 626dae2495bSdanielk1977 627b92b70bbSdanielk1977# Try a negative value for the user-version 628dae2495bSdanielk1977do_test pragma-8.2.14 { 629dae2495bSdanielk1977 execsql { 630b92b70bbSdanielk1977 PRAGMA user_version = -450; 631dae2495bSdanielk1977 } 632dae2495bSdanielk1977} {} 633dae2495bSdanielk1977do_test pragma-8.2.15 { 634dae2495bSdanielk1977 execsql { 635b92b70bbSdanielk1977 PRAGMA user_version; 636dae2495bSdanielk1977 } 637dae2495bSdanielk1977} {-450} 638d9c847dcSdanielk1977} ; # ifcapable schema_version 639d9c847dcSdanielk1977 6409a09a3caStpoindex 6419a09a3caStpoindex# Test temp_store and temp_store_directory pragmas 6429a09a3caStpoindex# 643268283bcSdrhifcapable pager_pragmas { 6449a09a3caStpoindexdo_test pragma-9.1 { 6459a09a3caStpoindex db close 6469a09a3caStpoindex sqlite3 db test.db 6479a09a3caStpoindex execsql { 6489a09a3caStpoindex PRAGMA temp_store; 6499a09a3caStpoindex } 6509a09a3caStpoindex} {0} 6519a09a3caStpoindexdo_test pragma-9.2 { 6529a09a3caStpoindex execsql { 6539a09a3caStpoindex PRAGMA temp_store=file; 6549a09a3caStpoindex PRAGMA temp_store; 6559a09a3caStpoindex } 6569a09a3caStpoindex} {1} 6579a09a3caStpoindexdo_test pragma-9.3 { 6589a09a3caStpoindex execsql { 6599a09a3caStpoindex PRAGMA temp_store=memory; 6609a09a3caStpoindex PRAGMA temp_store; 6619a09a3caStpoindex } 6629a09a3caStpoindex} {2} 6639a09a3caStpoindexdo_test pragma-9.4 { 6649a09a3caStpoindex execsql { 6659a09a3caStpoindex PRAGMA temp_store_directory; 6669a09a3caStpoindex } 6679a09a3caStpoindex} {} 6689a09a3caStpoindexdo_test pragma-9.5 { 669268283bcSdrh set pwd [string map {' ''} [pwd]] 670268283bcSdrh execsql " 671268283bcSdrh PRAGMA temp_store_directory='$pwd'; 6729a09a3caStpoindex " 6739a09a3caStpoindex} {} 6749a09a3caStpoindexdo_test pragma-9.6 { 6759a09a3caStpoindex execsql { 6769a09a3caStpoindex PRAGMA temp_store_directory; 6779a09a3caStpoindex } 6789a09a3caStpoindex} [pwd] 6799a09a3caStpoindexdo_test pragma-9.7 { 680268283bcSdrh catchsql { 6819a09a3caStpoindex PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR'; 6829a09a3caStpoindex } 683268283bcSdrh} {1 {not a writable directory}} 6849a09a3caStpoindexdo_test pragma-9.8 { 6859a09a3caStpoindex execsql { 6869a09a3caStpoindex PRAGMA temp_store_directory=''; 6879a09a3caStpoindex } 6889a09a3caStpoindex} {} 68953c0f748Sdanielk1977ifcapable tempdb { 6909a09a3caStpoindex do_test pragma-9.9 { 6919a09a3caStpoindex execsql { 6929a09a3caStpoindex PRAGMA temp_store_directory; 6939a09a3caStpoindex PRAGMA temp_store=FILE; 6949a09a3caStpoindex CREATE TEMP TABLE temp_store_directory_test(a integer); 6959a09a3caStpoindex INSERT INTO temp_store_directory_test values (2); 6969a09a3caStpoindex SELECT * FROM temp_store_directory_test; 6979a09a3caStpoindex } 6989a09a3caStpoindex } {2} 69953c0f748Sdanielk1977} 7009a09a3caStpoindexdo_test pragma-9.10 { 701268283bcSdrh catchsql " 702268283bcSdrh PRAGMA temp_store_directory='$pwd'; 7039a09a3caStpoindex SELECT * FROM temp_store_directory_test; 7049a09a3caStpoindex " 705268283bcSdrh} {1 {no such table: temp_store_directory_test}} 706268283bcSdrh} ;# ifcapable pager_pragmas 7079a09a3caStpoindex 708cc6bd383Sdanielk1977ifcapable trigger { 709cc6bd383Sdanielk1977 710cc6bd383Sdanielk1977do_test pragma-10.0 { 711cc6bd383Sdanielk1977 catchsql { 712cc6bd383Sdanielk1977 DROP TABLE main.t1; 713cc6bd383Sdanielk1977 } 714cc6bd383Sdanielk1977 execsql { 715cc6bd383Sdanielk1977 PRAGMA count_changes = 1; 716cc6bd383Sdanielk1977 717cc6bd383Sdanielk1977 CREATE TABLE t1(a PRIMARY KEY); 718cc6bd383Sdanielk1977 CREATE TABLE t1_mirror(a); 719cc6bd383Sdanielk1977 CREATE TABLE t1_mirror2(a); 720cc6bd383Sdanielk1977 CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN 721cc6bd383Sdanielk1977 INSERT INTO t1_mirror VALUES(new.a); 722cc6bd383Sdanielk1977 END; 723cc6bd383Sdanielk1977 CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN 724cc6bd383Sdanielk1977 INSERT INTO t1_mirror2 VALUES(new.a); 725cc6bd383Sdanielk1977 END; 726cc6bd383Sdanielk1977 CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN 727cc6bd383Sdanielk1977 UPDATE t1_mirror SET a = new.a WHERE a = old.a; 728cc6bd383Sdanielk1977 END; 729cc6bd383Sdanielk1977 CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN 730cc6bd383Sdanielk1977 UPDATE t1_mirror2 SET a = new.a WHERE a = old.a; 731cc6bd383Sdanielk1977 END; 732cc6bd383Sdanielk1977 CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN 733cc6bd383Sdanielk1977 DELETE FROM t1_mirror WHERE a = old.a; 734cc6bd383Sdanielk1977 END; 735cc6bd383Sdanielk1977 CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN 736cc6bd383Sdanielk1977 DELETE FROM t1_mirror2 WHERE a = old.a; 737cc6bd383Sdanielk1977 END; 738cc6bd383Sdanielk1977 } 739cc6bd383Sdanielk1977} {} 740cc6bd383Sdanielk1977 741cc6bd383Sdanielk1977do_test pragma-10.1 { 742cc6bd383Sdanielk1977 execsql { 743cc6bd383Sdanielk1977 INSERT INTO t1 VALUES(randstr(10,10)); 744cc6bd383Sdanielk1977 } 745cc6bd383Sdanielk1977} {1} 746cc6bd383Sdanielk1977do_test pragma-10.2 { 747cc6bd383Sdanielk1977 execsql { 748cc6bd383Sdanielk1977 UPDATE t1 SET a = randstr(10,10); 749cc6bd383Sdanielk1977 } 750cc6bd383Sdanielk1977} {1} 751cc6bd383Sdanielk1977do_test pragma-10.3 { 752cc6bd383Sdanielk1977 execsql { 753cc6bd383Sdanielk1977 DELETE FROM t1; 754cc6bd383Sdanielk1977 } 755cc6bd383Sdanielk1977} {1} 756cc6bd383Sdanielk1977 757cc6bd383Sdanielk1977} ;# ifcapable trigger 758cc6bd383Sdanielk1977 75948af65aeSdanielk1977ifcapable schema_pragmas { 76048af65aeSdanielk1977 do_test pragma-11.1 { 76148af65aeSdanielk1977 execsql2 { 76248af65aeSdanielk1977 pragma collation_list; 76348af65aeSdanielk1977 } 76448af65aeSdanielk1977 } {seq 0 name NOCASE seq 1 name BINARY} 76548af65aeSdanielk1977 do_test pragma-11.2 { 76648af65aeSdanielk1977 db collate New_Collation blah... 76748af65aeSdanielk1977 execsql { 76848af65aeSdanielk1977 pragma collation_list; 76948af65aeSdanielk1977 } 77048af65aeSdanielk1977 } {0 New_Collation 1 NOCASE 2 BINARY} 77148af65aeSdanielk1977} 77248af65aeSdanielk1977 7735558a8a6Sdanielk1977# Reset the sqlite3_temp_directory variable for the next run of tests: 7745558a8a6Sdanielk1977sqlite3 dbX :memory: 7755558a8a6Sdanielk1977dbX eval {PRAGMA temp_store_directory = ""} 7765558a8a6Sdanielk1977dbX close 7775558a8a6Sdanielk1977 778cd61c281Sdrhfinish_test 779