xref: /sqlite-3.40.0/test/pragma.test (revision 802d69a7)
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*802d69a7Sdrh# $Id: pragma.test,v 1.34 2005/02/13 23:34:25 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 {
53cd61c281Sdrh    PRAGMA cache_size=1234;
54cd61c281Sdrh    PRAGMA cache_size;
55cd61c281Sdrh    PRAGMA default_cache_size;
56cd61c281Sdrh    PRAGMA synchronous;
57cd61c281Sdrh  }
5891cf71b0Sdanielk1977} {1234 2000 2}
59cd61c281Sdrhdo_test pragma-1.3 {
60cd61c281Sdrh  db close
61ef4ac8f9Sdrh  sqlite3 db test.db
62cd61c281Sdrh  execsql {
63cd61c281Sdrh    PRAGMA cache_size;
64cd61c281Sdrh    PRAGMA default_cache_size;
65cd61c281Sdrh    PRAGMA synchronous;
66cd61c281Sdrh  }
6791cf71b0Sdanielk1977} {2000 2000 2}
68cd61c281Sdrhdo_test pragma-1.4 {
69cd61c281Sdrh  execsql {
70cd61c281Sdrh    PRAGMA synchronous=OFF;
71cd61c281Sdrh    PRAGMA cache_size;
72cd61c281Sdrh    PRAGMA default_cache_size;
73cd61c281Sdrh    PRAGMA synchronous;
74cd61c281Sdrh  }
7591cf71b0Sdanielk1977} {2000 2000 0}
76cd61c281Sdrhdo_test pragma-1.5 {
77cd61c281Sdrh  execsql {
78cd61c281Sdrh    PRAGMA cache_size=4321;
79cd61c281Sdrh    PRAGMA cache_size;
80cd61c281Sdrh    PRAGMA default_cache_size;
81cd61c281Sdrh    PRAGMA synchronous;
82cd61c281Sdrh  }
8391cf71b0Sdanielk1977} {4321 2000 0}
84cd61c281Sdrhdo_test pragma-1.6 {
85cd61c281Sdrh  execsql {
86cd61c281Sdrh    PRAGMA synchronous=ON;
87cd61c281Sdrh    PRAGMA cache_size;
88cd61c281Sdrh    PRAGMA default_cache_size;
89cd61c281Sdrh    PRAGMA synchronous;
90cd61c281Sdrh  }
9191cf71b0Sdanielk1977} {4321 2000 1}
92cd61c281Sdrhdo_test pragma-1.7 {
93cd61c281Sdrh  db close
94ef4ac8f9Sdrh  sqlite3 db test.db
95cd61c281Sdrh  execsql {
96cd61c281Sdrh    PRAGMA cache_size;
97cd61c281Sdrh    PRAGMA default_cache_size;
98cd61c281Sdrh    PRAGMA synchronous;
99cd61c281Sdrh  }
10091cf71b0Sdanielk1977} {2000 2000 2}
101cd61c281Sdrhdo_test pragma-1.8 {
102cd61c281Sdrh  execsql {
103cd61c281Sdrh    PRAGMA default_cache_size=123;
104cd61c281Sdrh    PRAGMA cache_size;
105cd61c281Sdrh    PRAGMA default_cache_size;
106cd61c281Sdrh    PRAGMA synchronous;
107cd61c281Sdrh  }
10891cf71b0Sdanielk1977} {123 123 2}
109*802d69a7Sdrhdo_test pragma-1.9.1 {
110cd61c281Sdrh  db close
111ef4ac8f9Sdrh  set ::DB [sqlite3 db test.db]
112cd61c281Sdrh  execsql {
113cd61c281Sdrh    PRAGMA cache_size;
114cd61c281Sdrh    PRAGMA default_cache_size;
115cd61c281Sdrh    PRAGMA synchronous;
116cd61c281Sdrh  }
11791cf71b0Sdanielk1977} {123 123 2}
118*802d69a7Sdrhifcapable vacuum {
119*802d69a7Sdrh  do_test pragma-1.9.2 {
120*802d69a7Sdrh    execsql {
121*802d69a7Sdrh      VACUUM;
122*802d69a7Sdrh      PRAGMA cache_size;
123*802d69a7Sdrh      PRAGMA default_cache_size;
124*802d69a7Sdrh      PRAGMA synchronous;
125*802d69a7Sdrh    }
126*802d69a7Sdrh  } {123 123 2}
127*802d69a7Sdrh}
12891cf71b0Sdanielk1977do_test pragma-1.10 {
1295a38705eSdrh  execsql {
1304303feedSdrh    PRAGMA synchronous=NORMAL;
1314303feedSdrh    PRAGMA cache_size;
1324303feedSdrh    PRAGMA default_cache_size;
1334303feedSdrh    PRAGMA synchronous;
1344303feedSdrh  }
13591cf71b0Sdanielk1977} {123 123 1}
13691cf71b0Sdanielk1977do_test pragma-1.11 {
1374303feedSdrh  execsql {
1384303feedSdrh    PRAGMA synchronous=FULL;
1394303feedSdrh    PRAGMA cache_size;
1404303feedSdrh    PRAGMA default_cache_size;
1414303feedSdrh    PRAGMA synchronous;
1424303feedSdrh  }
14391cf71b0Sdanielk1977} {123 123 2}
14491cf71b0Sdanielk1977do_test pragma-1.12 {
1454303feedSdrh  db close
146ef4ac8f9Sdrh  set ::DB [sqlite3 db test.db]
1474303feedSdrh  execsql {
1484303feedSdrh    PRAGMA cache_size;
1494303feedSdrh    PRAGMA default_cache_size;
1504303feedSdrh    PRAGMA synchronous;
1514303feedSdrh  }
15291cf71b0Sdanielk1977} {123 123 2}
15391cf71b0Sdanielk1977
1545260f7e9Sdrh# Make sure the pragma handler understands numeric values in addition
1555260f7e9Sdrh# to keywords like "off" and "full".
1565260f7e9Sdrh#
1575260f7e9Sdrhdo_test pragma-1.13 {
1585260f7e9Sdrh  execsql {
1595260f7e9Sdrh    PRAGMA synchronous=0;
1605260f7e9Sdrh    PRAGMA synchronous;
1615260f7e9Sdrh  }
1625260f7e9Sdrh} {0}
1635260f7e9Sdrhdo_test pragma-1.14 {
1645260f7e9Sdrh  execsql {
1655260f7e9Sdrh    PRAGMA synchronous=2;
1665260f7e9Sdrh    PRAGMA synchronous;
1675260f7e9Sdrh  }
1685260f7e9Sdrh} {2}
169c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
1705260f7e9Sdrh
1715260f7e9Sdrh# Test turning "flag" pragmas on and off.
1725260f7e9Sdrh#
1735260f7e9Sdrhdo_test pragma-1.15 {
1745260f7e9Sdrh  execsql {
1755260f7e9Sdrh    PRAGMA vdbe_listing=YES;
1765260f7e9Sdrh    PRAGMA vdbe_listing;
1775260f7e9Sdrh  }
1785260f7e9Sdrh} {1}
1795260f7e9Sdrhdo_test pragma-1.16 {
1805260f7e9Sdrh  execsql {
1815260f7e9Sdrh    PRAGMA vdbe_listing=NO;
1825260f7e9Sdrh    PRAGMA vdbe_listing;
1835260f7e9Sdrh  }
1845260f7e9Sdrh} {0}
1855260f7e9Sdrhdo_test pragma-1.17 {
1865260f7e9Sdrh  execsql {
1875260f7e9Sdrh    PRAGMA parser_trace=ON;
1885260f7e9Sdrh    PRAGMA parser_trace=OFF;
1895260f7e9Sdrh  }
1905260f7e9Sdrh} {}
1915260f7e9Sdrhdo_test pragma-1.18 {
1925260f7e9Sdrh  execsql {
1935260f7e9Sdrh    PRAGMA bogus = -1234;  -- Parsing of negative values
1945260f7e9Sdrh  }
1955260f7e9Sdrh} {}
1965260f7e9Sdrh
19791cf71b0Sdanielk1977# Test modifying the safety_level of an attached database.
19891cf71b0Sdanielk1977do_test pragma-2.1 {
19991cf71b0Sdanielk1977  file delete -force test2.db
20091cf71b0Sdanielk1977  file delete -force test2.db-journal
2014303feedSdrh  execsql {
20291cf71b0Sdanielk1977    ATTACH 'test2.db' AS aux;
2034303feedSdrh  }
20491cf71b0Sdanielk1977} {}
205c7b4a44cSdanielk1977ifcapable pager_pragmas {
20691cf71b0Sdanielk1977do_test pragma-2.2 {
2074303feedSdrh  execsql {
20891cf71b0Sdanielk1977    pragma aux.synchronous;
2094303feedSdrh  }
21091cf71b0Sdanielk1977} {2}
21191cf71b0Sdanielk1977do_test pragma-2.3 {
21291cf71b0Sdanielk1977  execsql {
21391cf71b0Sdanielk1977    pragma aux.synchronous = OFF;
21491cf71b0Sdanielk1977    pragma aux.synchronous;
21591cf71b0Sdanielk1977    pragma synchronous;
21691cf71b0Sdanielk1977  }
21791cf71b0Sdanielk1977} {0 2}
21891cf71b0Sdanielk1977do_test pragma-2.4 {
21991cf71b0Sdanielk1977  execsql {
22091cf71b0Sdanielk1977    pragma aux.synchronous = ON;
22191cf71b0Sdanielk1977    pragma synchronous;
22291cf71b0Sdanielk1977    pragma aux.synchronous;
22391cf71b0Sdanielk1977  }
22491cf71b0Sdanielk1977} {2 1}
225c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
2264303feedSdrh
227ed717fe3Sdrh# Construct a corrupted index and make sure the integrity_check
228ed717fe3Sdrh# pragma finds it.
229ed717fe3Sdrh#
23025d6543dSdrh# These tests won't work if the database is encrypted
23125d6543dSdrh#
232ed717fe3Sdrhdo_test pragma-3.1 {
233ed717fe3Sdrh  execsql {
234ed717fe3Sdrh    BEGIN;
235ed717fe3Sdrh    CREATE TABLE t2(a,b,c);
236ed717fe3Sdrh    CREATE INDEX i2 ON t2(a);
237ed717fe3Sdrh    INSERT INTO t2 VALUES(11,2,3);
238ed717fe3Sdrh    INSERT INTO t2 VALUES(22,3,4);
239ed717fe3Sdrh    COMMIT;
240ed717fe3Sdrh    SELECT rowid, * from t2;
241ed717fe3Sdrh  }
242ed717fe3Sdrh} {1 11 2 3 2 22 3 4}
24340e016e4Sdrhif {![sqlite3 -has-codec] && $sqlite_options(integrityck)} {
244ed717fe3Sdrh  do_test pragma-3.2 {
245ed717fe3Sdrh    set rootpage [execsql {SELECT rootpage FROM sqlite_master WHERE name='i2'}]
24696fc5fe6Sdanielk1977    set db [btree_open test.db 100 0]
247ed717fe3Sdrh    btree_begin_transaction $db
248ed717fe3Sdrh    set c [btree_cursor $db $rootpage 1]
249ed717fe3Sdrh    btree_first $c
250ed717fe3Sdrh    btree_delete $c
251ed717fe3Sdrh    btree_commit $db
252ed717fe3Sdrh    btree_close $db
253ed717fe3Sdrh    execsql {PRAGMA integrity_check}
2544be295beSdrh  } {{rowid 1 missing from index i2} {wrong # of entries in index i2}}
25525d6543dSdrh}
25691cf71b0Sdanielk1977do_test pragma-3.3 {
25791cf71b0Sdanielk1977  execsql {
25891cf71b0Sdanielk1977    DROP INDEX i2;
25991cf71b0Sdanielk1977  }
26091cf71b0Sdanielk1977} {}
26191cf71b0Sdanielk1977
26291cf71b0Sdanielk1977# Test modifying the cache_size of an attached database.
263c7b4a44cSdanielk1977ifcapable pager_pragmas {
26491cf71b0Sdanielk1977do_test pragma-4.1 {
26591cf71b0Sdanielk1977  execsql {
26691cf71b0Sdanielk1977    pragma aux.cache_size;
26791cf71b0Sdanielk1977    pragma aux.default_cache_size;
26891cf71b0Sdanielk1977  }
26991cf71b0Sdanielk1977} {2000 2000}
2701bdd9b57Sdrhdo_test pragma-4.2 {
2711bdd9b57Sdrh  execsql {
27291cf71b0Sdanielk1977    pragma aux.cache_size = 50;
27391cf71b0Sdanielk1977    pragma aux.cache_size;
27491cf71b0Sdanielk1977    pragma aux.default_cache_size;
2751bdd9b57Sdrh  }
27691cf71b0Sdanielk1977} {50 2000}
2771bdd9b57Sdrhdo_test pragma-4.3 {
2781bdd9b57Sdrh  execsql {
27991cf71b0Sdanielk1977    pragma aux.default_cache_size = 456;
28091cf71b0Sdanielk1977    pragma aux.cache_size;
28191cf71b0Sdanielk1977    pragma aux.default_cache_size;
2821bdd9b57Sdrh  }
28391cf71b0Sdanielk1977} {456 456}
2841bdd9b57Sdrhdo_test pragma-4.4 {
2851bdd9b57Sdrh  execsql {
28691cf71b0Sdanielk1977    pragma cache_size;
28791cf71b0Sdanielk1977    pragma default_cache_size;
2881bdd9b57Sdrh  }
28991cf71b0Sdanielk1977} {123 123}
2901bdd9b57Sdrhdo_test pragma-4.5 {
2911bdd9b57Sdrh  execsql {
29291cf71b0Sdanielk1977    DETACH aux;
29391cf71b0Sdanielk1977    ATTACH 'test3.db' AS aux;
29491cf71b0Sdanielk1977    pragma aux.cache_size;
29591cf71b0Sdanielk1977    pragma aux.default_cache_size;
2961bdd9b57Sdrh  }
29791cf71b0Sdanielk1977} {2000 2000}
2981bdd9b57Sdrhdo_test pragma-4.6 {
2991bdd9b57Sdrh  execsql {
30091cf71b0Sdanielk1977    DETACH aux;
30191cf71b0Sdanielk1977    ATTACH 'test2.db' AS aux;
30291cf71b0Sdanielk1977    pragma aux.cache_size;
30391cf71b0Sdanielk1977    pragma aux.default_cache_size;
3041bdd9b57Sdrh  }
30591cf71b0Sdanielk1977} {456 456}
306c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
3071bdd9b57Sdrh
30891cf71b0Sdanielk1977# Test that modifying the sync-level in the middle of a transaction is
30991cf71b0Sdanielk1977# disallowed.
310c7b4a44cSdanielk1977ifcapable pager_pragmas {
31191cf71b0Sdanielk1977do_test pragma-5.0 {
3121bdd9b57Sdrh  execsql {
31391cf71b0Sdanielk1977    pragma synchronous;
3141bdd9b57Sdrh  }
31591cf71b0Sdanielk1977} {2}
31691cf71b0Sdanielk1977do_test pragma-5.1 {
3171bdd9b57Sdrh  catchsql {
3181bdd9b57Sdrh    BEGIN;
31991cf71b0Sdanielk1977    pragma synchronous = OFF;
3201bdd9b57Sdrh  }
32191cf71b0Sdanielk1977} {1 {Safety level may not be changed inside a transaction}}
32291cf71b0Sdanielk1977do_test pragma-5.2 {
32391cf71b0Sdanielk1977  execsql {
32491cf71b0Sdanielk1977    pragma synchronous;
32591cf71b0Sdanielk1977  }
32691cf71b0Sdanielk1977} {2}
3275260f7e9Sdrhcatchsql {COMMIT;}
328c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
3295260f7e9Sdrh
3305260f7e9Sdrh# Test schema-query pragmas
3315260f7e9Sdrh#
33227188fb5Sdanielk1977ifcapable schema_pragmas {
3335260f7e9Sdrhdo_test pragma-6.1 {
334956bc92cSdrh  set res {}
33540e016e4Sdrh  execsql {SELECT * FROM sqlite_temp_master}
3365260f7e9Sdrh  foreach {idx name file} [execsql {pragma database_list}] {
3375260f7e9Sdrh    lappend res $idx $name
3385260f7e9Sdrh  }
3395260f7e9Sdrh  set res
340a71aa001Sdrh} {0 main 1 temp 2 aux}
3415260f7e9Sdrhdo_test pragma-6.2 {
3425260f7e9Sdrh  execsql {
3435260f7e9Sdrh    pragma table_info(t2)
3445260f7e9Sdrh  }
3455260f7e9Sdrh} {0 a numeric 0 {} 0 1 b numeric 0 {} 0 2 c numeric 0 {} 0}
3466bf89570Sdrhifcapable {foreignkey} {
3475260f7e9Sdrh  do_test pragma-6.3 {
3485260f7e9Sdrh    execsql {
3495260f7e9Sdrh      CREATE TABLE t3(a int references t2(b), b UNIQUE);
3505260f7e9Sdrh      pragma foreign_key_list(t3);
3515260f7e9Sdrh    }
3525260f7e9Sdrh  } {0 0 t2 a b}
3535260f7e9Sdrh  do_test pragma-6.4 {
3545260f7e9Sdrh    execsql {
3555260f7e9Sdrh      pragma index_list(t3);
3565260f7e9Sdrh    }
3575260f7e9Sdrh  } {0 sqlite_autoindex_t3_1 1}
3586bf89570Sdrh}
3596bf89570Sdrhifcapable {!foreignkey} {
3606bf89570Sdrh  execsql {CREATE TABLE t3(a,b UNIQUE)}
3616bf89570Sdrh}
3625260f7e9Sdrhdo_test pragma-6.5 {
3635260f7e9Sdrh  execsql {
3645260f7e9Sdrh    CREATE INDEX t3i1 ON t3(a,b);
3655260f7e9Sdrh    pragma index_info(t3i1);
3665260f7e9Sdrh  }
3675260f7e9Sdrh} {0 0 a 1 1 b}
36827188fb5Sdanielk1977} ;# ifcapable schema_pragmas
3695260f7e9Sdrh# Miscellaneous tests
3705260f7e9Sdrh#
37127188fb5Sdanielk1977ifcapable schema_pragmas {
3725260f7e9Sdrhdo_test pragma-7.1 {
3735260f7e9Sdrh  # Make sure a pragma knows to read the schema if it needs to
3745260f7e9Sdrh  db close
3755260f7e9Sdrh  sqlite3 db test.db
3765260f7e9Sdrh  execsql {
3775260f7e9Sdrh    pragma index_list(t3);
3785260f7e9Sdrh  }
3795260f7e9Sdrh} {0 t3i1 0 1 sqlite_autoindex_t3_1 1}
38027188fb5Sdanielk1977} ;# ifcapable schema_pragmas
3816c62608fSdrhifcapable {utf16} {
3825260f7e9Sdrh  do_test pragma-7.2 {
3835260f7e9Sdrh    db close
3845260f7e9Sdrh    sqlite3 db test.db
3855260f7e9Sdrh    catchsql {
3865260f7e9Sdrh      pragma encoding=bogus;
3875260f7e9Sdrh    }
3885260f7e9Sdrh  } {1 {unsupported encoding: bogus}}
3896c62608fSdrh}
3905260f7e9Sdrhdo_test pragma-7.3 {
3915260f7e9Sdrh  db close
3925260f7e9Sdrh  sqlite3 db test.db
3935260f7e9Sdrh  execsql {
3945260f7e9Sdrh    pragma lock_status;
3955260f7e9Sdrh  }
3965260f7e9Sdrh} {main unlocked temp closed}
3975260f7e9Sdrh
3985260f7e9Sdrh
399dae2495bSdanielk1977#----------------------------------------------------------------------
400b92b70bbSdanielk1977# Test cases pragma-8.* test the "PRAGMA schema_version" and "PRAGMA
401b92b70bbSdanielk1977# user_version" statements.
402dae2495bSdanielk1977#
403b92b70bbSdanielk1977# pragma-8.1: PRAGMA schema_version
404b92b70bbSdanielk1977# pragma-8.2: PRAGMA user_version
405dae2495bSdanielk1977#
406dae2495bSdanielk1977
40711cf9fbcSdanielk1977ifcapable schema_version {
40811cf9fbcSdanielk1977
409b92b70bbSdanielk1977# First check that we can set the schema version and then retrieve the
410dae2495bSdanielk1977# same value.
411dae2495bSdanielk1977do_test pragma-8.1.1 {
412dae2495bSdanielk1977  execsql {
413b92b70bbSdanielk1977    PRAGMA schema_version = 105;
414dae2495bSdanielk1977  }
415dae2495bSdanielk1977} {}
416dae2495bSdanielk1977do_test pragma-8.1.2 {
417dae2495bSdanielk1977  execsql {
418b92b70bbSdanielk1977    PRAGMA schema_version;
419dae2495bSdanielk1977  }
420dae2495bSdanielk1977} 105
421dae2495bSdanielk1977do_test pragma-8.1.3 {
422dae2495bSdanielk1977  execsql {
423b92b70bbSdanielk1977    PRAGMA schema_version = 106;
424dae2495bSdanielk1977  }
425dae2495bSdanielk1977} {}
426dae2495bSdanielk1977do_test pragma-8.1.4 {
427dae2495bSdanielk1977  execsql {
428b92b70bbSdanielk1977    PRAGMA schema_version;
429dae2495bSdanielk1977  }
430dae2495bSdanielk1977} 106
431dae2495bSdanielk1977
432b92b70bbSdanielk1977# Check that creating a table modifies the schema-version (this is really
433b92b70bbSdanielk1977# to verify that the value being read is in fact the schema version).
434dae2495bSdanielk1977do_test pragma-8.1.5 {
435dae2495bSdanielk1977  execsql {
436dae2495bSdanielk1977    CREATE TABLE t4(a, b, c);
437dae2495bSdanielk1977    INSERT INTO t4 VALUES(1, 2, 3);
438dae2495bSdanielk1977    SELECT * FROM t4;
439dae2495bSdanielk1977  }
440dae2495bSdanielk1977} {1 2 3}
441dae2495bSdanielk1977do_test pragma-8.1.6 {
442dae2495bSdanielk1977  execsql {
443b92b70bbSdanielk1977    PRAGMA schema_version;
444dae2495bSdanielk1977  }
445dae2495bSdanielk1977} 107
446dae2495bSdanielk1977
447dae2495bSdanielk1977# Now open a second connection to the database. Ensure that changing the
448b92b70bbSdanielk1977# schema-version using the first connection forces the second connection
449dae2495bSdanielk1977# to reload the schema. This has to be done using the C-API test functions,
450dae2495bSdanielk1977# because the TCL API accounts for SCHEMA_ERROR and retries the query.
451dae2495bSdanielk1977do_test pragma-8.1.7 {
452dae2495bSdanielk1977  set ::DB2 [sqlite3 db2 test.db]
453dae2495bSdanielk1977  execsql {
454dae2495bSdanielk1977    SELECT * FROM t4;
455dae2495bSdanielk1977  } db2
456dae2495bSdanielk1977} {1 2 3}
457dae2495bSdanielk1977do_test pragma-8.1.8 {
458dae2495bSdanielk1977  execsql {
459b92b70bbSdanielk1977    PRAGMA schema_version = 108;
460dae2495bSdanielk1977  }
461dae2495bSdanielk1977} {}
462dae2495bSdanielk1977do_test pragma-8.1.9 {
463dae2495bSdanielk1977  set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY]
464dae2495bSdanielk1977  sqlite3_step $::STMT
465dae2495bSdanielk1977} SQLITE_ERROR
466dae2495bSdanielk1977do_test pragma-8.1.10 {
467dae2495bSdanielk1977  sqlite3_finalize $::STMT
468dae2495bSdanielk1977} SQLITE_SCHEMA
469dae2495bSdanielk1977
470b92b70bbSdanielk1977# Make sure the schema-version can be manipulated in an attached database.
471dae2495bSdanielk1977file delete -force test2.db
472dae2495bSdanielk1977file delete -force test2.db-journal
473dae2495bSdanielk1977do_test pragma-8.1.11 {
474dae2495bSdanielk1977  execsql {
475dae2495bSdanielk1977    ATTACH 'test2.db' AS aux;
476dae2495bSdanielk1977    CREATE TABLE aux.t1(a, b, c);
477b92b70bbSdanielk1977    PRAGMA aux.schema_version = 205;
478dae2495bSdanielk1977  }
479dae2495bSdanielk1977} {}
480dae2495bSdanielk1977do_test pragma-8.1.12 {
481dae2495bSdanielk1977  execsql {
482b92b70bbSdanielk1977    PRAGMA aux.schema_version;
483dae2495bSdanielk1977  }
484dae2495bSdanielk1977} 205
485dae2495bSdanielk1977do_test pragma-8.1.13 {
486dae2495bSdanielk1977  execsql {
487b92b70bbSdanielk1977    PRAGMA schema_version;
488dae2495bSdanielk1977  }
489dae2495bSdanielk1977} 108
490dae2495bSdanielk1977
491b92b70bbSdanielk1977# And check that modifying the schema-version in an attached database
492dae2495bSdanielk1977# forces the second connection to reload the schema.
493dae2495bSdanielk1977do_test pragma-8.1.14 {
494dae2495bSdanielk1977  set ::DB2 [sqlite3 db2 test.db]
495dae2495bSdanielk1977  execsql {
496dae2495bSdanielk1977    ATTACH 'test2.db' AS aux;
497dae2495bSdanielk1977    SELECT * FROM aux.t1;
498dae2495bSdanielk1977  } db2
499dae2495bSdanielk1977} {}
500dae2495bSdanielk1977do_test pragma-8.1.15 {
501dae2495bSdanielk1977  execsql {
502b92b70bbSdanielk1977    PRAGMA aux.schema_version = 206;
503dae2495bSdanielk1977  }
504dae2495bSdanielk1977} {}
505dae2495bSdanielk1977do_test pragma-8.1.16 {
506dae2495bSdanielk1977  set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY]
507dae2495bSdanielk1977  sqlite3_step $::STMT
508dae2495bSdanielk1977} SQLITE_ERROR
509dae2495bSdanielk1977do_test pragma-8.1.17 {
510dae2495bSdanielk1977  sqlite3_finalize $::STMT
511dae2495bSdanielk1977} SQLITE_SCHEMA
512dae2495bSdanielk1977do_test pragma-8.1.18 {
513dae2495bSdanielk1977  db2 close
514dae2495bSdanielk1977} {}
515dae2495bSdanielk1977
516b92b70bbSdanielk1977# Now test that the user-version can be read and written (and that we aren't
517b92b70bbSdanielk1977# accidentally manipulating the schema-version instead).
518dae2495bSdanielk1977do_test pragma-8.2.1 {
519dae2495bSdanielk1977  execsql {
520b92b70bbSdanielk1977    PRAGMA user_version;
521dae2495bSdanielk1977  }
522dae2495bSdanielk1977} {0}
523dae2495bSdanielk1977do_test pragma-8.2.2 {
524dae2495bSdanielk1977  execsql {
525b92b70bbSdanielk1977    PRAGMA user_version = 2;
526dae2495bSdanielk1977  }
527dae2495bSdanielk1977} {}
528*802d69a7Sdrhdo_test pragma-8.2.3.1 {
529dae2495bSdanielk1977  execsql {
530b92b70bbSdanielk1977    PRAGMA user_version;
531dae2495bSdanielk1977  }
532dae2495bSdanielk1977} {2}
533*802d69a7Sdrhdo_test pragma-8.2.3.2 {
534*802d69a7Sdrh  db close
535*802d69a7Sdrh  sqlite3 db test.db
536*802d69a7Sdrh  execsql {
537*802d69a7Sdrh    PRAGMA user_version;
538*802d69a7Sdrh  }
539*802d69a7Sdrh} {2}
540*802d69a7Sdrhdo_test pragma-8.2.4.1 {
541dae2495bSdanielk1977  execsql {
542b92b70bbSdanielk1977    PRAGMA schema_version;
543dae2495bSdanielk1977  }
544dae2495bSdanielk1977} {108}
545*802d69a7Sdrhifcapable vacuum {
546*802d69a7Sdrh  do_test pragma-8.2.4.2 {
547*802d69a7Sdrh    execsql {
548*802d69a7Sdrh      VACUUM;
549*802d69a7Sdrh      PRAGMA user_version;
550*802d69a7Sdrh    }
551*802d69a7Sdrh  } {2}
552*802d69a7Sdrh  do_test pragma-8.2.4.3 {
553*802d69a7Sdrh    execsql {
554*802d69a7Sdrh      PRAGMA schema_version;
555*802d69a7Sdrh    }
556*802d69a7Sdrh  } {109}
557*802d69a7Sdrh}
558*802d69a7Sdrhdb eval {ATTACH 'test2.db' AS aux}
559dae2495bSdanielk1977
560b92b70bbSdanielk1977# Check that the user-version in the auxilary database can be manipulated (
561dae2495bSdanielk1977# and that we aren't accidentally manipulating the same in the main db).
562dae2495bSdanielk1977do_test pragma-8.2.5 {
563dae2495bSdanielk1977  execsql {
564b92b70bbSdanielk1977    PRAGMA aux.user_version;
565dae2495bSdanielk1977  }
566dae2495bSdanielk1977} {0}
567dae2495bSdanielk1977do_test pragma-8.2.6 {
568dae2495bSdanielk1977  execsql {
569b92b70bbSdanielk1977    PRAGMA aux.user_version = 3;
570dae2495bSdanielk1977  }
571dae2495bSdanielk1977} {}
572dae2495bSdanielk1977do_test pragma-8.2.7 {
573dae2495bSdanielk1977  execsql {
574b92b70bbSdanielk1977    PRAGMA aux.user_version;
575dae2495bSdanielk1977  }
576dae2495bSdanielk1977} {3}
577dae2495bSdanielk1977do_test pragma-8.2.8 {
578dae2495bSdanielk1977  execsql {
579b92b70bbSdanielk1977    PRAGMA main.user_version;
580dae2495bSdanielk1977  }
581dae2495bSdanielk1977} {2}
582dae2495bSdanielk1977
583b92b70bbSdanielk1977# Now check that a ROLLBACK resets the user-version if it has been modified
584dae2495bSdanielk1977# within a transaction.
585dae2495bSdanielk1977do_test pragma-8.2.9 {
586dae2495bSdanielk1977  execsql {
587dae2495bSdanielk1977    BEGIN;
588b92b70bbSdanielk1977    PRAGMA aux.user_version = 10;
589b92b70bbSdanielk1977    PRAGMA user_version = 11;
590dae2495bSdanielk1977  }
591dae2495bSdanielk1977} {}
592dae2495bSdanielk1977do_test pragma-8.2.10 {
593dae2495bSdanielk1977  execsql {
594b92b70bbSdanielk1977    PRAGMA aux.user_version;
595dae2495bSdanielk1977  }
596dae2495bSdanielk1977} {10}
597dae2495bSdanielk1977do_test pragma-8.2.11 {
598dae2495bSdanielk1977  execsql {
599b92b70bbSdanielk1977    PRAGMA main.user_version;
600dae2495bSdanielk1977  }
601dae2495bSdanielk1977} {11}
602dae2495bSdanielk1977do_test pragma-8.2.12 {
603dae2495bSdanielk1977  execsql {
604dae2495bSdanielk1977    ROLLBACK;
605b92b70bbSdanielk1977    PRAGMA aux.user_version;
606dae2495bSdanielk1977  }
607dae2495bSdanielk1977} {3}
608dae2495bSdanielk1977do_test pragma-8.2.13 {
609dae2495bSdanielk1977  execsql {
610b92b70bbSdanielk1977    PRAGMA main.user_version;
611dae2495bSdanielk1977  }
612dae2495bSdanielk1977} {2}
613dae2495bSdanielk1977
614b92b70bbSdanielk1977# Try a negative value for the user-version
615dae2495bSdanielk1977do_test pragma-8.2.14 {
616dae2495bSdanielk1977  execsql {
617b92b70bbSdanielk1977    PRAGMA user_version = -450;
618dae2495bSdanielk1977  }
619dae2495bSdanielk1977} {}
620dae2495bSdanielk1977do_test pragma-8.2.15 {
621dae2495bSdanielk1977  execsql {
622b92b70bbSdanielk1977    PRAGMA user_version;
623dae2495bSdanielk1977  }
624dae2495bSdanielk1977} {-450}
625d9c847dcSdanielk1977} ; # ifcapable schema_version
626d9c847dcSdanielk1977
6279a09a3caStpoindex
6289a09a3caStpoindex# Test temp_store and temp_store_directory pragmas
6299a09a3caStpoindex#
630268283bcSdrhifcapable pager_pragmas {
6319a09a3caStpoindexdo_test pragma-9.1 {
6329a09a3caStpoindex  db close
6339a09a3caStpoindex  sqlite3 db test.db
6349a09a3caStpoindex  execsql {
6359a09a3caStpoindex    PRAGMA temp_store;
6369a09a3caStpoindex  }
6379a09a3caStpoindex} {0}
6389a09a3caStpoindexdo_test pragma-9.2 {
6399a09a3caStpoindex  execsql {
6409a09a3caStpoindex    PRAGMA temp_store=file;
6419a09a3caStpoindex    PRAGMA temp_store;
6429a09a3caStpoindex  }
6439a09a3caStpoindex} {1}
6449a09a3caStpoindexdo_test pragma-9.3 {
6459a09a3caStpoindex  execsql {
6469a09a3caStpoindex    PRAGMA temp_store=memory;
6479a09a3caStpoindex    PRAGMA temp_store;
6489a09a3caStpoindex  }
6499a09a3caStpoindex} {2}
6509a09a3caStpoindexdo_test pragma-9.4 {
6519a09a3caStpoindex  execsql {
6529a09a3caStpoindex    PRAGMA temp_store_directory;
6539a09a3caStpoindex  }
6549a09a3caStpoindex} {}
6559a09a3caStpoindexdo_test pragma-9.5 {
656268283bcSdrh  set pwd [string map {' ''} [pwd]]
657268283bcSdrh  execsql "
658268283bcSdrh    PRAGMA temp_store_directory='$pwd';
6599a09a3caStpoindex  "
6609a09a3caStpoindex} {}
6619a09a3caStpoindexdo_test pragma-9.6 {
6629a09a3caStpoindex  execsql {
6639a09a3caStpoindex    PRAGMA temp_store_directory;
6649a09a3caStpoindex  }
6659a09a3caStpoindex} [pwd]
6669a09a3caStpoindexdo_test pragma-9.7 {
667268283bcSdrh  catchsql {
6689a09a3caStpoindex    PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR';
6699a09a3caStpoindex  }
670268283bcSdrh} {1 {not a writable directory}}
6719a09a3caStpoindexdo_test pragma-9.8 {
6729a09a3caStpoindex  execsql {
6739a09a3caStpoindex    PRAGMA temp_store_directory='';
6749a09a3caStpoindex  }
6759a09a3caStpoindex} {}
6769a09a3caStpoindexdo_test pragma-9.9 {
6779a09a3caStpoindex  execsql {
6789a09a3caStpoindex    PRAGMA temp_store_directory;
6799a09a3caStpoindex    PRAGMA temp_store=FILE;
6809a09a3caStpoindex    CREATE TEMP TABLE temp_store_directory_test(a integer);
6819a09a3caStpoindex    INSERT INTO temp_store_directory_test values (2);
6829a09a3caStpoindex    SELECT * FROM temp_store_directory_test;
6839a09a3caStpoindex  }
6849a09a3caStpoindex} {2}
6859a09a3caStpoindexdo_test pragma-9.10 {
686268283bcSdrh  catchsql "
687268283bcSdrh    PRAGMA temp_store_directory='$pwd';
6889a09a3caStpoindex    SELECT * FROM temp_store_directory_test;
6899a09a3caStpoindex  "
690268283bcSdrh} {1 {no such table: temp_store_directory_test}}
691268283bcSdrh} ;# ifcapable pager_pragmas
6929a09a3caStpoindex
693cc6bd383Sdanielk1977ifcapable trigger {
694cc6bd383Sdanielk1977
695cc6bd383Sdanielk1977do_test pragma-10.0 {
696cc6bd383Sdanielk1977  catchsql {
697cc6bd383Sdanielk1977    DROP TABLE main.t1;
698cc6bd383Sdanielk1977  }
699cc6bd383Sdanielk1977  execsql {
700cc6bd383Sdanielk1977    PRAGMA count_changes = 1;
701cc6bd383Sdanielk1977
702cc6bd383Sdanielk1977    CREATE TABLE t1(a PRIMARY KEY);
703cc6bd383Sdanielk1977    CREATE TABLE t1_mirror(a);
704cc6bd383Sdanielk1977    CREATE TABLE t1_mirror2(a);
705cc6bd383Sdanielk1977    CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN
706cc6bd383Sdanielk1977      INSERT INTO t1_mirror VALUES(new.a);
707cc6bd383Sdanielk1977    END;
708cc6bd383Sdanielk1977    CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN
709cc6bd383Sdanielk1977      INSERT INTO t1_mirror2 VALUES(new.a);
710cc6bd383Sdanielk1977    END;
711cc6bd383Sdanielk1977    CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN
712cc6bd383Sdanielk1977      UPDATE t1_mirror SET a = new.a WHERE a = old.a;
713cc6bd383Sdanielk1977    END;
714cc6bd383Sdanielk1977    CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN
715cc6bd383Sdanielk1977      UPDATE t1_mirror2 SET a = new.a WHERE a = old.a;
716cc6bd383Sdanielk1977    END;
717cc6bd383Sdanielk1977    CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN
718cc6bd383Sdanielk1977      DELETE FROM t1_mirror WHERE a = old.a;
719cc6bd383Sdanielk1977    END;
720cc6bd383Sdanielk1977    CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN
721cc6bd383Sdanielk1977      DELETE FROM t1_mirror2 WHERE a = old.a;
722cc6bd383Sdanielk1977    END;
723cc6bd383Sdanielk1977  }
724cc6bd383Sdanielk1977} {}
725cc6bd383Sdanielk1977
726cc6bd383Sdanielk1977do_test pragma-10.1 {
727cc6bd383Sdanielk1977  execsql {
728cc6bd383Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,10));
729cc6bd383Sdanielk1977  }
730cc6bd383Sdanielk1977} {1}
731cc6bd383Sdanielk1977do_test pragma-10.2 {
732cc6bd383Sdanielk1977  execsql {
733cc6bd383Sdanielk1977    UPDATE t1 SET a = randstr(10,10);
734cc6bd383Sdanielk1977  }
735cc6bd383Sdanielk1977} {1}
736cc6bd383Sdanielk1977do_test pragma-10.3 {
737cc6bd383Sdanielk1977  execsql {
738cc6bd383Sdanielk1977    DELETE FROM t1;
739cc6bd383Sdanielk1977  }
740cc6bd383Sdanielk1977} {1}
741cc6bd383Sdanielk1977
742cc6bd383Sdanielk1977} ;# ifcapable trigger
743cc6bd383Sdanielk1977
74448af65aeSdanielk1977ifcapable schema_pragmas {
74548af65aeSdanielk1977  do_test pragma-11.1 {
74648af65aeSdanielk1977    execsql2 {
74748af65aeSdanielk1977      pragma collation_list;
74848af65aeSdanielk1977    }
74948af65aeSdanielk1977  } {seq 0 name NOCASE seq 1 name BINARY}
75048af65aeSdanielk1977  do_test pragma-11.2 {
75148af65aeSdanielk1977    db collate New_Collation blah...
75248af65aeSdanielk1977    execsql {
75348af65aeSdanielk1977      pragma collation_list;
75448af65aeSdanielk1977    }
75548af65aeSdanielk1977  } {0 New_Collation 1 NOCASE 2 BINARY}
75648af65aeSdanielk1977}
75748af65aeSdanielk1977
7585558a8a6Sdanielk1977# Reset the sqlite3_temp_directory variable for the next run of tests:
7595558a8a6Sdanielk1977sqlite3 dbX :memory:
7605558a8a6Sdanielk1977dbX eval {PRAGMA temp_store_directory = ""}
7615558a8a6Sdanielk1977dbX close
7625558a8a6Sdanielk1977
763cd61c281Sdrhfinish_test
764