xref: /sqlite-3.40.0/test/pragma.test (revision cc6bd383)
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*cc6bd383Sdanielk1977# $Id: pragma.test,v 1.31 2005/01/10 02:48:49 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.
28*cc6bd383Sdanielk1977# pragma-6.*: Test schema-query pragmas.
29*cc6bd383Sdanielk1977# pragma-7.*: Miscellaneous tests.
30*cc6bd383Sdanielk1977# pragma-8.*: Test user_version and schema_version pragmas.
319a09a3caStpoindex# pragma-9.*: Test temp_store and temp_store_directory.
32*cc6bd383Sdanielk1977# 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
661*cc6bd383Sdanielk1977ifcapable trigger {
662*cc6bd383Sdanielk1977
663*cc6bd383Sdanielk1977do_test pragma-10.0 {
664*cc6bd383Sdanielk1977  catchsql {
665*cc6bd383Sdanielk1977    DROP TABLE main.t1;
666*cc6bd383Sdanielk1977  }
667*cc6bd383Sdanielk1977  execsql {
668*cc6bd383Sdanielk1977    PRAGMA count_changes = 1;
669*cc6bd383Sdanielk1977
670*cc6bd383Sdanielk1977    CREATE TABLE t1(a PRIMARY KEY);
671*cc6bd383Sdanielk1977    CREATE TABLE t1_mirror(a);
672*cc6bd383Sdanielk1977    CREATE TABLE t1_mirror2(a);
673*cc6bd383Sdanielk1977    CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN
674*cc6bd383Sdanielk1977      INSERT INTO t1_mirror VALUES(new.a);
675*cc6bd383Sdanielk1977    END;
676*cc6bd383Sdanielk1977    CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN
677*cc6bd383Sdanielk1977      INSERT INTO t1_mirror2 VALUES(new.a);
678*cc6bd383Sdanielk1977    END;
679*cc6bd383Sdanielk1977    CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN
680*cc6bd383Sdanielk1977      UPDATE t1_mirror SET a = new.a WHERE a = old.a;
681*cc6bd383Sdanielk1977    END;
682*cc6bd383Sdanielk1977    CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN
683*cc6bd383Sdanielk1977      UPDATE t1_mirror2 SET a = new.a WHERE a = old.a;
684*cc6bd383Sdanielk1977    END;
685*cc6bd383Sdanielk1977    CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN
686*cc6bd383Sdanielk1977      DELETE FROM t1_mirror WHERE a = old.a;
687*cc6bd383Sdanielk1977    END;
688*cc6bd383Sdanielk1977    CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN
689*cc6bd383Sdanielk1977      DELETE FROM t1_mirror2 WHERE a = old.a;
690*cc6bd383Sdanielk1977    END;
691*cc6bd383Sdanielk1977  }
692*cc6bd383Sdanielk1977} {}
693*cc6bd383Sdanielk1977
694*cc6bd383Sdanielk1977do_test pragma-10.1 {
695*cc6bd383Sdanielk1977  execsql {
696*cc6bd383Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,10));
697*cc6bd383Sdanielk1977  }
698*cc6bd383Sdanielk1977} {1}
699*cc6bd383Sdanielk1977do_test pragma-10.2 {
700*cc6bd383Sdanielk1977  execsql {
701*cc6bd383Sdanielk1977    UPDATE t1 SET a = randstr(10,10);
702*cc6bd383Sdanielk1977  }
703*cc6bd383Sdanielk1977} {1}
704*cc6bd383Sdanielk1977do_test pragma-10.3 {
705*cc6bd383Sdanielk1977  execsql {
706*cc6bd383Sdanielk1977    DELETE FROM t1;
707*cc6bd383Sdanielk1977  }
708*cc6bd383Sdanielk1977} {1}
709*cc6bd383Sdanielk1977
710*cc6bd383Sdanielk1977} ;# ifcapable trigger
711*cc6bd383Sdanielk1977
712cd61c281Sdrhfinish_test
713*cc6bd383Sdanielk1977
714*cc6bd383Sdanielk1977
715