xref: /sqlite-3.40.0/test/pragma.test (revision dae2495b)
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*dae2495bSdanielk1977# $Id: pragma.test,v 1.22 2004/11/11 05:10:44 danielk1977 Exp $
16cd61c281Sdrh
17cd61c281Sdrhset testdir [file dirname $argv0]
18cd61c281Sdrhsource $testdir/tester.tcl
19cd61c281Sdrh
2091cf71b0Sdanielk1977# Test organization:
2191cf71b0Sdanielk1977#
2291cf71b0Sdanielk1977# pragma-1.*: Test cache_size, default_cache_size and synchronous on main db.
2391cf71b0Sdanielk1977# pragma-2.*: Test synchronous on attached db.
2491cf71b0Sdanielk1977# pragma-3.*: Test detection of table/index inconsistency by integrity_check.
2591cf71b0Sdanielk1977# pragma-4.*: Test cache_size and default_cache_size on attached db.
2691cf71b0Sdanielk1977# pragma-5.*: Test that pragma synchronous may not be used inside of a
2791cf71b0Sdanielk1977#             transaction.
2891cf71b0Sdanielk1977#
2991cf71b0Sdanielk1977
30cd61c281Sdrh# Delete the preexisting database to avoid the special setup
31cd61c281Sdrh# that the "all.test" script does.
32cd61c281Sdrh#
33cd61c281Sdrhdb close
34cd61c281Sdrhfile delete test.db
35ef4ac8f9Sdrhset DB [sqlite3 db test.db]
36cd61c281Sdrh
37cd61c281Sdrhdo_test pragma-1.1 {
38cd61c281Sdrh  execsql {
39cd61c281Sdrh    PRAGMA cache_size;
40cd61c281Sdrh    PRAGMA default_cache_size;
41cd61c281Sdrh    PRAGMA synchronous;
42cd61c281Sdrh  }
4391cf71b0Sdanielk1977} {2000 2000 2}
44cd61c281Sdrhdo_test pragma-1.2 {
45cd61c281Sdrh  execsql {
46cd61c281Sdrh    PRAGMA cache_size=1234;
47cd61c281Sdrh    PRAGMA cache_size;
48cd61c281Sdrh    PRAGMA default_cache_size;
49cd61c281Sdrh    PRAGMA synchronous;
50cd61c281Sdrh  }
5191cf71b0Sdanielk1977} {1234 2000 2}
52cd61c281Sdrhdo_test pragma-1.3 {
53cd61c281Sdrh  db close
54ef4ac8f9Sdrh  sqlite3 db test.db
55cd61c281Sdrh  execsql {
56cd61c281Sdrh    PRAGMA cache_size;
57cd61c281Sdrh    PRAGMA default_cache_size;
58cd61c281Sdrh    PRAGMA synchronous;
59cd61c281Sdrh  }
6091cf71b0Sdanielk1977} {2000 2000 2}
61cd61c281Sdrhdo_test pragma-1.4 {
62cd61c281Sdrh  execsql {
63cd61c281Sdrh    PRAGMA synchronous=OFF;
64cd61c281Sdrh    PRAGMA cache_size;
65cd61c281Sdrh    PRAGMA default_cache_size;
66cd61c281Sdrh    PRAGMA synchronous;
67cd61c281Sdrh  }
6891cf71b0Sdanielk1977} {2000 2000 0}
69cd61c281Sdrhdo_test pragma-1.5 {
70cd61c281Sdrh  execsql {
71cd61c281Sdrh    PRAGMA cache_size=4321;
72cd61c281Sdrh    PRAGMA cache_size;
73cd61c281Sdrh    PRAGMA default_cache_size;
74cd61c281Sdrh    PRAGMA synchronous;
75cd61c281Sdrh  }
7691cf71b0Sdanielk1977} {4321 2000 0}
77cd61c281Sdrhdo_test pragma-1.6 {
78cd61c281Sdrh  execsql {
79cd61c281Sdrh    PRAGMA synchronous=ON;
80cd61c281Sdrh    PRAGMA cache_size;
81cd61c281Sdrh    PRAGMA default_cache_size;
82cd61c281Sdrh    PRAGMA synchronous;
83cd61c281Sdrh  }
8491cf71b0Sdanielk1977} {4321 2000 1}
85cd61c281Sdrhdo_test pragma-1.7 {
86cd61c281Sdrh  db close
87ef4ac8f9Sdrh  sqlite3 db test.db
88cd61c281Sdrh  execsql {
89cd61c281Sdrh    PRAGMA cache_size;
90cd61c281Sdrh    PRAGMA default_cache_size;
91cd61c281Sdrh    PRAGMA synchronous;
92cd61c281Sdrh  }
9391cf71b0Sdanielk1977} {2000 2000 2}
94cd61c281Sdrhdo_test pragma-1.8 {
95cd61c281Sdrh  execsql {
96cd61c281Sdrh    PRAGMA default_cache_size=123;
97cd61c281Sdrh    PRAGMA cache_size;
98cd61c281Sdrh    PRAGMA default_cache_size;
99cd61c281Sdrh    PRAGMA synchronous;
100cd61c281Sdrh  }
10191cf71b0Sdanielk1977} {123 123 2}
10291cf71b0Sdanielk1977do_test pragma-1.9 {
103cd61c281Sdrh  db close
104ef4ac8f9Sdrh  set ::DB [sqlite3 db test.db]
105cd61c281Sdrh  execsql {
106cd61c281Sdrh    PRAGMA cache_size;
107cd61c281Sdrh    PRAGMA default_cache_size;
108cd61c281Sdrh    PRAGMA synchronous;
109cd61c281Sdrh  }
11091cf71b0Sdanielk1977} {123 123 2}
11191cf71b0Sdanielk1977do_test pragma-1.10 {
1125a38705eSdrh  execsql {
1134303feedSdrh    PRAGMA synchronous=NORMAL;
1144303feedSdrh    PRAGMA cache_size;
1154303feedSdrh    PRAGMA default_cache_size;
1164303feedSdrh    PRAGMA synchronous;
1174303feedSdrh  }
11891cf71b0Sdanielk1977} {123 123 1}
11991cf71b0Sdanielk1977do_test pragma-1.11 {
1204303feedSdrh  execsql {
1214303feedSdrh    PRAGMA synchronous=FULL;
1224303feedSdrh    PRAGMA cache_size;
1234303feedSdrh    PRAGMA default_cache_size;
1244303feedSdrh    PRAGMA synchronous;
1254303feedSdrh  }
12691cf71b0Sdanielk1977} {123 123 2}
12791cf71b0Sdanielk1977do_test pragma-1.12 {
1284303feedSdrh  db close
129ef4ac8f9Sdrh  set ::DB [sqlite3 db test.db]
1304303feedSdrh  execsql {
1314303feedSdrh    PRAGMA cache_size;
1324303feedSdrh    PRAGMA default_cache_size;
1334303feedSdrh    PRAGMA synchronous;
1344303feedSdrh  }
13591cf71b0Sdanielk1977} {123 123 2}
13691cf71b0Sdanielk1977
1375260f7e9Sdrh# Make sure the pragma handler understands numeric values in addition
1385260f7e9Sdrh# to keywords like "off" and "full".
1395260f7e9Sdrh#
1405260f7e9Sdrhdo_test pragma-1.13 {
1415260f7e9Sdrh  execsql {
1425260f7e9Sdrh    PRAGMA synchronous=0;
1435260f7e9Sdrh    PRAGMA synchronous;
1445260f7e9Sdrh  }
1455260f7e9Sdrh} {0}
1465260f7e9Sdrhdo_test pragma-1.14 {
1475260f7e9Sdrh  execsql {
1485260f7e9Sdrh    PRAGMA synchronous=2;
1495260f7e9Sdrh    PRAGMA synchronous;
1505260f7e9Sdrh  }
1515260f7e9Sdrh} {2}
1525260f7e9Sdrh
1535260f7e9Sdrh# Test turning "flag" pragmas on and off.
1545260f7e9Sdrh#
1555260f7e9Sdrhdo_test pragma-1.15 {
1565260f7e9Sdrh  execsql {
1575260f7e9Sdrh    PRAGMA vdbe_listing=YES;
1585260f7e9Sdrh    PRAGMA vdbe_listing;
1595260f7e9Sdrh  }
1605260f7e9Sdrh} {1}
1615260f7e9Sdrhdo_test pragma-1.16 {
1625260f7e9Sdrh  execsql {
1635260f7e9Sdrh    PRAGMA vdbe_listing=NO;
1645260f7e9Sdrh    PRAGMA vdbe_listing;
1655260f7e9Sdrh  }
1665260f7e9Sdrh} {0}
1675260f7e9Sdrhdo_test pragma-1.17 {
1685260f7e9Sdrh  execsql {
1695260f7e9Sdrh    PRAGMA parser_trace=ON;
1705260f7e9Sdrh    PRAGMA parser_trace=OFF;
1715260f7e9Sdrh  }
1725260f7e9Sdrh} {}
1735260f7e9Sdrhdo_test pragma-1.18 {
1745260f7e9Sdrh  execsql {
1755260f7e9Sdrh    PRAGMA bogus = -1234;  -- Parsing of negative values
1765260f7e9Sdrh  }
1775260f7e9Sdrh} {}
1785260f7e9Sdrh
17991cf71b0Sdanielk1977# Test modifying the safety_level of an attached database.
18091cf71b0Sdanielk1977do_test pragma-2.1 {
18191cf71b0Sdanielk1977  file delete -force test2.db
18291cf71b0Sdanielk1977  file delete -force test2.db-journal
1834303feedSdrh  execsql {
18491cf71b0Sdanielk1977    ATTACH 'test2.db' AS aux;
1854303feedSdrh  }
18691cf71b0Sdanielk1977} {}
18791cf71b0Sdanielk1977do_test pragma-2.2 {
1884303feedSdrh  execsql {
18991cf71b0Sdanielk1977    pragma aux.synchronous;
1904303feedSdrh  }
19191cf71b0Sdanielk1977} {2}
19291cf71b0Sdanielk1977do_test pragma-2.3 {
19391cf71b0Sdanielk1977  execsql {
19491cf71b0Sdanielk1977    pragma aux.synchronous = OFF;
19591cf71b0Sdanielk1977    pragma aux.synchronous;
19691cf71b0Sdanielk1977    pragma synchronous;
19791cf71b0Sdanielk1977  }
19891cf71b0Sdanielk1977} {0 2}
19991cf71b0Sdanielk1977do_test pragma-2.4 {
20091cf71b0Sdanielk1977  execsql {
20191cf71b0Sdanielk1977    pragma aux.synchronous = ON;
20291cf71b0Sdanielk1977    pragma synchronous;
20391cf71b0Sdanielk1977    pragma aux.synchronous;
20491cf71b0Sdanielk1977  }
20591cf71b0Sdanielk1977} {2 1}
2064303feedSdrh
207ed717fe3Sdrh# Construct a corrupted index and make sure the integrity_check
208ed717fe3Sdrh# pragma finds it.
209ed717fe3Sdrh#
21025d6543dSdrh# These tests won't work if the database is encrypted
21125d6543dSdrh#
212ed717fe3Sdrhdo_test pragma-3.1 {
213ed717fe3Sdrh  execsql {
214ed717fe3Sdrh    BEGIN;
215ed717fe3Sdrh    CREATE TABLE t2(a,b,c);
216ed717fe3Sdrh    CREATE INDEX i2 ON t2(a);
217ed717fe3Sdrh    INSERT INTO t2 VALUES(11,2,3);
218ed717fe3Sdrh    INSERT INTO t2 VALUES(22,3,4);
219ed717fe3Sdrh    COMMIT;
220ed717fe3Sdrh    SELECT rowid, * from t2;
221ed717fe3Sdrh  }
222ed717fe3Sdrh} {1 11 2 3 2 22 3 4}
22340e016e4Sdrhif {![sqlite3 -has-codec] && $sqlite_options(integrityck)} {
224ed717fe3Sdrh  do_test pragma-3.2 {
225ed717fe3Sdrh    set rootpage [execsql {SELECT rootpage FROM sqlite_master WHERE name='i2'}]
22696fc5fe6Sdanielk1977    set db [btree_open test.db 100 0]
227ed717fe3Sdrh    btree_begin_transaction $db
228ed717fe3Sdrh    set c [btree_cursor $db $rootpage 1]
229ed717fe3Sdrh    btree_first $c
230ed717fe3Sdrh    btree_delete $c
231ed717fe3Sdrh    btree_commit $db
232ed717fe3Sdrh    btree_close $db
233ed717fe3Sdrh    execsql {PRAGMA integrity_check}
2344be295beSdrh  } {{rowid 1 missing from index i2} {wrong # of entries in index i2}}
23525d6543dSdrh}
23691cf71b0Sdanielk1977do_test pragma-3.3 {
23791cf71b0Sdanielk1977  execsql {
23891cf71b0Sdanielk1977    DROP INDEX i2;
23991cf71b0Sdanielk1977  }
24091cf71b0Sdanielk1977} {}
24191cf71b0Sdanielk1977
24291cf71b0Sdanielk1977# Test modifying the cache_size of an attached database.
24391cf71b0Sdanielk1977do_test pragma-4.1 {
24491cf71b0Sdanielk1977  execsql {
24591cf71b0Sdanielk1977    pragma aux.cache_size;
24691cf71b0Sdanielk1977    pragma aux.default_cache_size;
24791cf71b0Sdanielk1977  }
24891cf71b0Sdanielk1977} {2000 2000}
2491bdd9b57Sdrhdo_test pragma-4.2 {
2501bdd9b57Sdrh  execsql {
25191cf71b0Sdanielk1977    pragma aux.cache_size = 50;
25291cf71b0Sdanielk1977    pragma aux.cache_size;
25391cf71b0Sdanielk1977    pragma aux.default_cache_size;
2541bdd9b57Sdrh  }
25591cf71b0Sdanielk1977} {50 2000}
2561bdd9b57Sdrhdo_test pragma-4.3 {
2571bdd9b57Sdrh  execsql {
25891cf71b0Sdanielk1977    pragma aux.default_cache_size = 456;
25991cf71b0Sdanielk1977    pragma aux.cache_size;
26091cf71b0Sdanielk1977    pragma aux.default_cache_size;
2611bdd9b57Sdrh  }
26291cf71b0Sdanielk1977} {456 456}
2631bdd9b57Sdrhdo_test pragma-4.4 {
2641bdd9b57Sdrh  execsql {
26591cf71b0Sdanielk1977    pragma cache_size;
26691cf71b0Sdanielk1977    pragma default_cache_size;
2671bdd9b57Sdrh  }
26891cf71b0Sdanielk1977} {123 123}
2691bdd9b57Sdrhdo_test pragma-4.5 {
2701bdd9b57Sdrh  execsql {
27191cf71b0Sdanielk1977    DETACH aux;
27291cf71b0Sdanielk1977    ATTACH 'test3.db' AS aux;
27391cf71b0Sdanielk1977    pragma aux.cache_size;
27491cf71b0Sdanielk1977    pragma aux.default_cache_size;
2751bdd9b57Sdrh  }
27691cf71b0Sdanielk1977} {2000 2000}
2771bdd9b57Sdrhdo_test pragma-4.6 {
2781bdd9b57Sdrh  execsql {
27991cf71b0Sdanielk1977    DETACH aux;
28091cf71b0Sdanielk1977    ATTACH 'test2.db' AS aux;
28191cf71b0Sdanielk1977    pragma aux.cache_size;
28291cf71b0Sdanielk1977    pragma aux.default_cache_size;
2831bdd9b57Sdrh  }
28491cf71b0Sdanielk1977} {456 456}
2851bdd9b57Sdrh
28691cf71b0Sdanielk1977# Test that modifying the sync-level in the middle of a transaction is
28791cf71b0Sdanielk1977# disallowed.
28891cf71b0Sdanielk1977do_test pragma-5.0 {
2891bdd9b57Sdrh  execsql {
29091cf71b0Sdanielk1977    pragma synchronous;
2911bdd9b57Sdrh  }
29291cf71b0Sdanielk1977} {2}
29391cf71b0Sdanielk1977do_test pragma-5.1 {
2941bdd9b57Sdrh  catchsql {
2951bdd9b57Sdrh    BEGIN;
29691cf71b0Sdanielk1977    pragma synchronous = OFF;
2971bdd9b57Sdrh  }
29891cf71b0Sdanielk1977} {1 {Safety level may not be changed inside a transaction}}
29991cf71b0Sdanielk1977do_test pragma-5.2 {
30091cf71b0Sdanielk1977  execsql {
30191cf71b0Sdanielk1977    pragma synchronous;
30291cf71b0Sdanielk1977  }
30391cf71b0Sdanielk1977} {2}
3045260f7e9Sdrhcatchsql {COMMIT;}
3055260f7e9Sdrh
3065260f7e9Sdrh# Test schema-query pragmas
3075260f7e9Sdrh#
3085260f7e9Sdrhdo_test pragma-6.1 {
309956bc92cSdrh  set res {}
31040e016e4Sdrh  execsql {SELECT * FROM sqlite_temp_master}
3115260f7e9Sdrh  foreach {idx name file} [execsql {pragma database_list}] {
3125260f7e9Sdrh    lappend res $idx $name
3135260f7e9Sdrh  }
3145260f7e9Sdrh  set res
315a71aa001Sdrh} {0 main 1 temp 2 aux}
3165260f7e9Sdrhdo_test pragma-6.2 {
3175260f7e9Sdrh  execsql {
3185260f7e9Sdrh    pragma table_info(t2)
3195260f7e9Sdrh  }
3205260f7e9Sdrh} {0 a numeric 0 {} 0 1 b numeric 0 {} 0 2 c numeric 0 {} 0}
3216bf89570Sdrhifcapable {foreignkey} {
3225260f7e9Sdrh  do_test pragma-6.3 {
3235260f7e9Sdrh    execsql {
3245260f7e9Sdrh      CREATE TABLE t3(a int references t2(b), b UNIQUE);
3255260f7e9Sdrh      pragma foreign_key_list(t3);
3265260f7e9Sdrh    }
3275260f7e9Sdrh  } {0 0 t2 a b}
3285260f7e9Sdrh  do_test pragma-6.4 {
3295260f7e9Sdrh    execsql {
3305260f7e9Sdrh      pragma index_list(t3);
3315260f7e9Sdrh    }
3325260f7e9Sdrh  } {0 sqlite_autoindex_t3_1 1}
3336bf89570Sdrh}
3346bf89570Sdrhifcapable {!foreignkey} {
3356bf89570Sdrh  execsql {CREATE TABLE t3(a,b UNIQUE)}
3366bf89570Sdrh}
3375260f7e9Sdrhdo_test pragma-6.5 {
3385260f7e9Sdrh  execsql {
3395260f7e9Sdrh    CREATE INDEX t3i1 ON t3(a,b);
3405260f7e9Sdrh    pragma index_info(t3i1);
3415260f7e9Sdrh  }
3425260f7e9Sdrh} {0 0 a 1 1 b}
3435260f7e9Sdrh
3445260f7e9Sdrh# Miscellaneous tests
3455260f7e9Sdrh#
3465260f7e9Sdrhdo_test pragma-7.1 {
3475260f7e9Sdrh  # Make sure a pragma knows to read the schema if it needs to
3485260f7e9Sdrh  db close
3495260f7e9Sdrh  sqlite3 db test.db
3505260f7e9Sdrh  execsql {
3515260f7e9Sdrh    pragma index_list(t3);
3525260f7e9Sdrh  }
3535260f7e9Sdrh} {0 t3i1 0 1 sqlite_autoindex_t3_1 1}
3545260f7e9Sdrhdo_test pragma-7.2 {
3555260f7e9Sdrh  db close
3565260f7e9Sdrh  sqlite3 db test.db
3575260f7e9Sdrh  catchsql {
3585260f7e9Sdrh    pragma encoding=bogus;
3595260f7e9Sdrh  }
3605260f7e9Sdrh} {1 {unsupported encoding: bogus}}
3615260f7e9Sdrhdo_test pragma-7.3 {
3625260f7e9Sdrh  db close
3635260f7e9Sdrh  sqlite3 db test.db
3645260f7e9Sdrh  execsql {
3655260f7e9Sdrh    pragma lock_status;
3665260f7e9Sdrh  }
3675260f7e9Sdrh} {main unlocked temp closed}
3685260f7e9Sdrh
3695260f7e9Sdrh
370*dae2495bSdanielk1977#----------------------------------------------------------------------
371*dae2495bSdanielk1977# Test cases pragma-8.* test the "PRAGMA schema_cookie" and "PRAGMA
372*dae2495bSdanielk1977# user_cookie" statements.
373*dae2495bSdanielk1977#
374*dae2495bSdanielk1977# pragma-8.1: PRAGMA schema_cookie
375*dae2495bSdanielk1977# pragma-8.2: PRAGMA user_cookie
376*dae2495bSdanielk1977#
377*dae2495bSdanielk1977
378*dae2495bSdanielk1977# First check that we can set the schema cookie and then retrieve the
379*dae2495bSdanielk1977# same value.
380*dae2495bSdanielk1977do_test pragma-8.1.1 {
381*dae2495bSdanielk1977  execsql {
382*dae2495bSdanielk1977    PRAGMA schema_cookie = 105;
383*dae2495bSdanielk1977  }
384*dae2495bSdanielk1977} {}
385*dae2495bSdanielk1977do_test pragma-8.1.2 {
386*dae2495bSdanielk1977  execsql {
387*dae2495bSdanielk1977    PRAGMA schema_cookie;
388*dae2495bSdanielk1977  }
389*dae2495bSdanielk1977} 105
390*dae2495bSdanielk1977do_test pragma-8.1.3 {
391*dae2495bSdanielk1977  execsql {
392*dae2495bSdanielk1977    PRAGMA schema_cookie = 106;
393*dae2495bSdanielk1977  }
394*dae2495bSdanielk1977} {}
395*dae2495bSdanielk1977do_test pragma-8.1.4 {
396*dae2495bSdanielk1977  execsql {
397*dae2495bSdanielk1977    PRAGMA schema_cookie;
398*dae2495bSdanielk1977  }
399*dae2495bSdanielk1977} 106
400*dae2495bSdanielk1977
401*dae2495bSdanielk1977# Check that creating a table modifies the schema-cookie (this is really
402*dae2495bSdanielk1977# to verify that the value being read is in fact the schema cookie).
403*dae2495bSdanielk1977do_test pragma-8.1.5 {
404*dae2495bSdanielk1977  execsql {
405*dae2495bSdanielk1977    CREATE TABLE t4(a, b, c);
406*dae2495bSdanielk1977    INSERT INTO t4 VALUES(1, 2, 3);
407*dae2495bSdanielk1977    SELECT * FROM t4;
408*dae2495bSdanielk1977  }
409*dae2495bSdanielk1977} {1 2 3}
410*dae2495bSdanielk1977do_test pragma-8.1.6 {
411*dae2495bSdanielk1977  execsql {
412*dae2495bSdanielk1977    PRAGMA schema_cookie;
413*dae2495bSdanielk1977  }
414*dae2495bSdanielk1977} 107
415*dae2495bSdanielk1977
416*dae2495bSdanielk1977# Now open a second connection to the database. Ensure that changing the
417*dae2495bSdanielk1977# schema-cookie using the first connection forces the second connection
418*dae2495bSdanielk1977# to reload the schema. This has to be done using the C-API test functions,
419*dae2495bSdanielk1977# because the TCL API accounts for SCHEMA_ERROR and retries the query.
420*dae2495bSdanielk1977do_test pragma-8.1.7 {
421*dae2495bSdanielk1977  set ::DB2 [sqlite3 db2 test.db]
422*dae2495bSdanielk1977  execsql {
423*dae2495bSdanielk1977    SELECT * FROM t4;
424*dae2495bSdanielk1977  } db2
425*dae2495bSdanielk1977} {1 2 3}
426*dae2495bSdanielk1977do_test pragma-8.1.8 {
427*dae2495bSdanielk1977  execsql {
428*dae2495bSdanielk1977    PRAGMA schema_cookie = 108;
429*dae2495bSdanielk1977  }
430*dae2495bSdanielk1977} {}
431*dae2495bSdanielk1977do_test pragma-8.1.9 {
432*dae2495bSdanielk1977  set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY]
433*dae2495bSdanielk1977  sqlite3_step $::STMT
434*dae2495bSdanielk1977} SQLITE_ERROR
435*dae2495bSdanielk1977do_test pragma-8.1.10 {
436*dae2495bSdanielk1977  sqlite3_finalize $::STMT
437*dae2495bSdanielk1977} SQLITE_SCHEMA
438*dae2495bSdanielk1977
439*dae2495bSdanielk1977# Make sure the schema-cookie can be manipulated in an attached database.
440*dae2495bSdanielk1977file delete -force test2.db
441*dae2495bSdanielk1977file delete -force test2.db-journal
442*dae2495bSdanielk1977do_test pragma-8.1.11 {
443*dae2495bSdanielk1977  execsql {
444*dae2495bSdanielk1977    ATTACH 'test2.db' AS aux;
445*dae2495bSdanielk1977    CREATE TABLE aux.t1(a, b, c);
446*dae2495bSdanielk1977    PRAGMA aux.schema_cookie = 205;
447*dae2495bSdanielk1977  }
448*dae2495bSdanielk1977} {}
449*dae2495bSdanielk1977do_test pragma-8.1.12 {
450*dae2495bSdanielk1977  execsql {
451*dae2495bSdanielk1977    PRAGMA aux.schema_cookie;
452*dae2495bSdanielk1977  }
453*dae2495bSdanielk1977} 205
454*dae2495bSdanielk1977do_test pragma-8.1.13 {
455*dae2495bSdanielk1977  execsql {
456*dae2495bSdanielk1977    PRAGMA schema_cookie;
457*dae2495bSdanielk1977  }
458*dae2495bSdanielk1977} 108
459*dae2495bSdanielk1977
460*dae2495bSdanielk1977# And check that modifying the schema-cookie in an attached database
461*dae2495bSdanielk1977# forces the second connection to reload the schema.
462*dae2495bSdanielk1977do_test pragma-8.1.14 {
463*dae2495bSdanielk1977  set ::DB2 [sqlite3 db2 test.db]
464*dae2495bSdanielk1977  execsql {
465*dae2495bSdanielk1977    ATTACH 'test2.db' AS aux;
466*dae2495bSdanielk1977    SELECT * FROM aux.t1;
467*dae2495bSdanielk1977  } db2
468*dae2495bSdanielk1977} {}
469*dae2495bSdanielk1977do_test pragma-8.1.15 {
470*dae2495bSdanielk1977  execsql {
471*dae2495bSdanielk1977    PRAGMA aux.schema_cookie = 206;
472*dae2495bSdanielk1977  }
473*dae2495bSdanielk1977} {}
474*dae2495bSdanielk1977do_test pragma-8.1.16 {
475*dae2495bSdanielk1977  set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY]
476*dae2495bSdanielk1977  sqlite3_step $::STMT
477*dae2495bSdanielk1977} SQLITE_ERROR
478*dae2495bSdanielk1977do_test pragma-8.1.17 {
479*dae2495bSdanielk1977  sqlite3_finalize $::STMT
480*dae2495bSdanielk1977} SQLITE_SCHEMA
481*dae2495bSdanielk1977do_test pragma-8.1.18 {
482*dae2495bSdanielk1977  db2 close
483*dae2495bSdanielk1977} {}
484*dae2495bSdanielk1977
485*dae2495bSdanielk1977# Now test that the user-cookie can be read and written (and that we aren't
486*dae2495bSdanielk1977# accidentally manipulating the schema-cookie instead).
487*dae2495bSdanielk1977do_test pragma-8.2.1 {
488*dae2495bSdanielk1977  execsql {
489*dae2495bSdanielk1977    PRAGMA user_cookie;
490*dae2495bSdanielk1977  }
491*dae2495bSdanielk1977} {0}
492*dae2495bSdanielk1977do_test pragma-8.2.2 {
493*dae2495bSdanielk1977  execsql {
494*dae2495bSdanielk1977    PRAGMA user_cookie = 2;
495*dae2495bSdanielk1977  }
496*dae2495bSdanielk1977} {}
497*dae2495bSdanielk1977do_test pragma-8.2.3 {
498*dae2495bSdanielk1977  execsql {
499*dae2495bSdanielk1977    PRAGMA user_cookie;
500*dae2495bSdanielk1977  }
501*dae2495bSdanielk1977} {2}
502*dae2495bSdanielk1977do_test pragma-8.2.4 {
503*dae2495bSdanielk1977  execsql {
504*dae2495bSdanielk1977    PRAGMA schema_cookie;
505*dae2495bSdanielk1977  }
506*dae2495bSdanielk1977} {108}
507*dae2495bSdanielk1977
508*dae2495bSdanielk1977# Check that the user-cookie in the auxilary database can be manipulated (
509*dae2495bSdanielk1977# and that we aren't accidentally manipulating the same in the main db).
510*dae2495bSdanielk1977do_test pragma-8.2.5 {
511*dae2495bSdanielk1977  execsql {
512*dae2495bSdanielk1977    PRAGMA aux.user_cookie;
513*dae2495bSdanielk1977  }
514*dae2495bSdanielk1977} {0}
515*dae2495bSdanielk1977do_test pragma-8.2.6 {
516*dae2495bSdanielk1977  execsql {
517*dae2495bSdanielk1977    PRAGMA aux.user_cookie = 3;
518*dae2495bSdanielk1977  }
519*dae2495bSdanielk1977} {}
520*dae2495bSdanielk1977do_test pragma-8.2.7 {
521*dae2495bSdanielk1977  execsql {
522*dae2495bSdanielk1977    PRAGMA aux.user_cookie;
523*dae2495bSdanielk1977  }
524*dae2495bSdanielk1977} {3}
525*dae2495bSdanielk1977do_test pragma-8.2.8 {
526*dae2495bSdanielk1977  execsql {
527*dae2495bSdanielk1977    PRAGMA main.user_cookie;
528*dae2495bSdanielk1977  }
529*dae2495bSdanielk1977} {2}
530*dae2495bSdanielk1977
531*dae2495bSdanielk1977# Now check that a ROLLBACK resets the user-cookie if it has been modified
532*dae2495bSdanielk1977# within a transaction.
533*dae2495bSdanielk1977do_test pragma-8.2.9 {
534*dae2495bSdanielk1977  execsql {
535*dae2495bSdanielk1977    BEGIN;
536*dae2495bSdanielk1977    PRAGMA aux.user_cookie = 10;
537*dae2495bSdanielk1977    PRAGMA user_cookie = 11;
538*dae2495bSdanielk1977  }
539*dae2495bSdanielk1977} {}
540*dae2495bSdanielk1977do_test pragma-8.2.10 {
541*dae2495bSdanielk1977  execsql {
542*dae2495bSdanielk1977    PRAGMA aux.user_cookie;
543*dae2495bSdanielk1977  }
544*dae2495bSdanielk1977} {10}
545*dae2495bSdanielk1977do_test pragma-8.2.11 {
546*dae2495bSdanielk1977  execsql {
547*dae2495bSdanielk1977    PRAGMA main.user_cookie;
548*dae2495bSdanielk1977  }
549*dae2495bSdanielk1977} {11}
550*dae2495bSdanielk1977do_test pragma-8.2.12 {
551*dae2495bSdanielk1977  execsql {
552*dae2495bSdanielk1977    ROLLBACK;
553*dae2495bSdanielk1977    PRAGMA aux.user_cookie;
554*dae2495bSdanielk1977  }
555*dae2495bSdanielk1977} {3}
556*dae2495bSdanielk1977do_test pragma-8.2.13 {
557*dae2495bSdanielk1977  execsql {
558*dae2495bSdanielk1977    PRAGMA main.user_cookie;
559*dae2495bSdanielk1977  }
560*dae2495bSdanielk1977} {2}
561*dae2495bSdanielk1977
562*dae2495bSdanielk1977# Try a negative value for the user-cookie
563*dae2495bSdanielk1977do_test pragma-8.2.14 {
564*dae2495bSdanielk1977  execsql {
565*dae2495bSdanielk1977    PRAGMA user_cookie = -450;
566*dae2495bSdanielk1977  }
567*dae2495bSdanielk1977} {}
568*dae2495bSdanielk1977do_test pragma-8.2.15 {
569*dae2495bSdanielk1977  execsql {
570*dae2495bSdanielk1977    PRAGMA user_cookie;
571*dae2495bSdanielk1977  }
572*dae2495bSdanielk1977} {-450}
5731bdd9b57Sdrh
574cd61c281Sdrhfinish_test
575*dae2495bSdanielk1977
576*dae2495bSdanielk1977
577