xref: /sqlite-3.40.0/test/pragma.test (revision dddca286)
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*dddca286Sdrh# $Id: pragma.test,v 1.37 2006/01/03 00:33:50 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
41*dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer 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 {
53eb43e5c7Sdrh    PRAGMA synchronous=OFF;
54cd61c281Sdrh    PRAGMA cache_size=1234;
55cd61c281Sdrh    PRAGMA cache_size;
56cd61c281Sdrh    PRAGMA default_cache_size;
57cd61c281Sdrh    PRAGMA synchronous;
58cd61c281Sdrh  }
59eb43e5c7Sdrh} {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
112*dddca286Sdrh  sqlite3 db test.db; set ::DB [sqlite3_connection_pointer 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
147*dddca286Sdrh  sqlite3 db test.db; set ::DB [sqlite3_connection_pointer 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 {
465*dddca286Sdrh  sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
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 {
507*dddca286Sdrh  sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
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