xref: /sqlite-3.40.0/test/pragma.test (revision 838cce43)
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*838cce43Sdanielk1977# $Id: pragma.test,v 1.73 2009/01/12 14:01:45 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.
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.
3459a93791Sdanielk1977# pragma-14.*: Test the page_count pragma.
358cf6c554Sdanielk1977# pragma-15.*: Test that the value set using the cache_size pragma is not
368cf6c554Sdanielk1977#              reset when the schema is reloaded.
37aebf413dSaswift# pragma-16.*: Test proxy locking
3891cf71b0Sdanielk1977#
3991cf71b0Sdanielk1977
4005a82983Sdrhifcapable !pragma {
4105a82983Sdrh  finish_test
4205a82983Sdrh  return
4305a82983Sdrh}
4405a82983Sdrh
45cd61c281Sdrh# Delete the preexisting database to avoid the special setup
46cd61c281Sdrh# that the "all.test" script does.
47cd61c281Sdrh#
48cd61c281Sdrhdb close
4925403650Sdrhfile delete test.db test.db-journal
5025403650Sdrhfile delete test3.db test3.db-journal
51dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db]
52cd61c281Sdrh
531e9daa6aSdrh
54c7b4a44cSdanielk1977ifcapable pager_pragmas {
551e9daa6aSdrhset DFLT_CACHE_SZ [db one {PRAGMA default_cache_size}]
561e9daa6aSdrhset TEMP_CACHE_SZ [db one {PRAGMA temp.default_cache_size}]
57cd61c281Sdrhdo_test pragma-1.1 {
58cd61c281Sdrh  execsql {
59cd61c281Sdrh    PRAGMA cache_size;
60cd61c281Sdrh    PRAGMA default_cache_size;
61cd61c281Sdrh    PRAGMA synchronous;
62cd61c281Sdrh  }
631e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
64cd61c281Sdrhdo_test pragma-1.2 {
65cd61c281Sdrh  execsql {
66eb43e5c7Sdrh    PRAGMA synchronous=OFF;
67cd61c281Sdrh    PRAGMA cache_size=1234;
68cd61c281Sdrh    PRAGMA cache_size;
69cd61c281Sdrh    PRAGMA default_cache_size;
70cd61c281Sdrh    PRAGMA synchronous;
71cd61c281Sdrh  }
721e9daa6aSdrh} [list 1234 $DFLT_CACHE_SZ 0]
73cd61c281Sdrhdo_test pragma-1.3 {
74cd61c281Sdrh  db close
75ef4ac8f9Sdrh  sqlite3 db test.db
76cd61c281Sdrh  execsql {
77cd61c281Sdrh    PRAGMA cache_size;
78cd61c281Sdrh    PRAGMA default_cache_size;
79cd61c281Sdrh    PRAGMA synchronous;
80cd61c281Sdrh  }
811e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
82cd61c281Sdrhdo_test pragma-1.4 {
83cd61c281Sdrh  execsql {
84cd61c281Sdrh    PRAGMA synchronous=OFF;
85cd61c281Sdrh    PRAGMA cache_size;
86cd61c281Sdrh    PRAGMA default_cache_size;
87cd61c281Sdrh    PRAGMA synchronous;
88cd61c281Sdrh  }
891e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 0]
90cd61c281Sdrhdo_test pragma-1.5 {
91cd61c281Sdrh  execsql {
92d2cb50b7Sdrh    PRAGMA cache_size=-4321;
93cd61c281Sdrh    PRAGMA cache_size;
94cd61c281Sdrh    PRAGMA default_cache_size;
95cd61c281Sdrh    PRAGMA synchronous;
96cd61c281Sdrh  }
971e9daa6aSdrh} [list 4321 $DFLT_CACHE_SZ 0]
98cd61c281Sdrhdo_test pragma-1.6 {
99cd61c281Sdrh  execsql {
100cd61c281Sdrh    PRAGMA synchronous=ON;
101cd61c281Sdrh    PRAGMA cache_size;
102cd61c281Sdrh    PRAGMA default_cache_size;
103cd61c281Sdrh    PRAGMA synchronous;
104cd61c281Sdrh  }
1051e9daa6aSdrh} [list 4321 $DFLT_CACHE_SZ 1]
106cd61c281Sdrhdo_test pragma-1.7 {
107cd61c281Sdrh  db close
108ef4ac8f9Sdrh  sqlite3 db test.db
109cd61c281Sdrh  execsql {
110cd61c281Sdrh    PRAGMA cache_size;
111cd61c281Sdrh    PRAGMA default_cache_size;
112cd61c281Sdrh    PRAGMA synchronous;
113cd61c281Sdrh  }
1141e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
115cd61c281Sdrhdo_test pragma-1.8 {
116cd61c281Sdrh  execsql {
117d2cb50b7Sdrh    PRAGMA default_cache_size=-123;
118cd61c281Sdrh    PRAGMA cache_size;
119cd61c281Sdrh    PRAGMA default_cache_size;
120cd61c281Sdrh    PRAGMA synchronous;
121cd61c281Sdrh  }
12291cf71b0Sdanielk1977} {123 123 2}
123802d69a7Sdrhdo_test pragma-1.9.1 {
124cd61c281Sdrh  db close
125dddca286Sdrh  sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
126cd61c281Sdrh  execsql {
127cd61c281Sdrh    PRAGMA cache_size;
128cd61c281Sdrh    PRAGMA default_cache_size;
129cd61c281Sdrh    PRAGMA synchronous;
130cd61c281Sdrh  }
13191cf71b0Sdanielk1977} {123 123 2}
132802d69a7Sdrhifcapable vacuum {
133802d69a7Sdrh  do_test pragma-1.9.2 {
134802d69a7Sdrh    execsql {
135802d69a7Sdrh      VACUUM;
136802d69a7Sdrh      PRAGMA cache_size;
137802d69a7Sdrh      PRAGMA default_cache_size;
138802d69a7Sdrh      PRAGMA synchronous;
139802d69a7Sdrh    }
140802d69a7Sdrh  } {123 123 2}
141802d69a7Sdrh}
14291cf71b0Sdanielk1977do_test pragma-1.10 {
1435a38705eSdrh  execsql {
1444303feedSdrh    PRAGMA synchronous=NORMAL;
1454303feedSdrh    PRAGMA cache_size;
1464303feedSdrh    PRAGMA default_cache_size;
1474303feedSdrh    PRAGMA synchronous;
1484303feedSdrh  }
14991cf71b0Sdanielk1977} {123 123 1}
15091cf71b0Sdanielk1977do_test pragma-1.11 {
1514303feedSdrh  execsql {
1524303feedSdrh    PRAGMA synchronous=FULL;
1534303feedSdrh    PRAGMA cache_size;
1544303feedSdrh    PRAGMA default_cache_size;
1554303feedSdrh    PRAGMA synchronous;
1564303feedSdrh  }
15791cf71b0Sdanielk1977} {123 123 2}
15891cf71b0Sdanielk1977do_test pragma-1.12 {
1594303feedSdrh  db close
160dddca286Sdrh  sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
1614303feedSdrh  execsql {
1624303feedSdrh    PRAGMA cache_size;
1634303feedSdrh    PRAGMA default_cache_size;
1644303feedSdrh    PRAGMA synchronous;
1654303feedSdrh  }
16691cf71b0Sdanielk1977} {123 123 2}
16791cf71b0Sdanielk1977
1685260f7e9Sdrh# Make sure the pragma handler understands numeric values in addition
1695260f7e9Sdrh# to keywords like "off" and "full".
1705260f7e9Sdrh#
1715260f7e9Sdrhdo_test pragma-1.13 {
1725260f7e9Sdrh  execsql {
1735260f7e9Sdrh    PRAGMA synchronous=0;
1745260f7e9Sdrh    PRAGMA synchronous;
1755260f7e9Sdrh  }
1765260f7e9Sdrh} {0}
1775260f7e9Sdrhdo_test pragma-1.14 {
1785260f7e9Sdrh  execsql {
1795260f7e9Sdrh    PRAGMA synchronous=2;
1805260f7e9Sdrh    PRAGMA synchronous;
1815260f7e9Sdrh  }
1825260f7e9Sdrh} {2}
183c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
1845260f7e9Sdrh
1855260f7e9Sdrh# Test turning "flag" pragmas on and off.
1865260f7e9Sdrh#
1876338c762Sdanielk1977ifcapable debug {
1886338c762Sdanielk1977  # Pragma "vdbe_listing" is only available if compiled with SQLITE_DEBUG
1896338c762Sdanielk1977  #
1905260f7e9Sdrh  do_test pragma-1.15 {
1915260f7e9Sdrh    execsql {
1925260f7e9Sdrh      PRAGMA vdbe_listing=YES;
1935260f7e9Sdrh      PRAGMA vdbe_listing;
1945260f7e9Sdrh    }
1955260f7e9Sdrh  } {1}
1965260f7e9Sdrh  do_test pragma-1.16 {
1975260f7e9Sdrh    execsql {
1985260f7e9Sdrh      PRAGMA vdbe_listing=NO;
1995260f7e9Sdrh      PRAGMA vdbe_listing;
2005260f7e9Sdrh    }
2015260f7e9Sdrh  } {0}
2026338c762Sdanielk1977}
2036338c762Sdanielk1977
2045260f7e9Sdrhdo_test pragma-1.17 {
2055260f7e9Sdrh  execsql {
2065260f7e9Sdrh    PRAGMA parser_trace=ON;
2075260f7e9Sdrh    PRAGMA parser_trace=OFF;
2085260f7e9Sdrh  }
2095260f7e9Sdrh} {}
2105260f7e9Sdrhdo_test pragma-1.18 {
2115260f7e9Sdrh  execsql {
2125260f7e9Sdrh    PRAGMA bogus = -1234;  -- Parsing of negative values
2135260f7e9Sdrh  }
2145260f7e9Sdrh} {}
2155260f7e9Sdrh
21691cf71b0Sdanielk1977# Test modifying the safety_level of an attached database.
2175a8f9374Sdanielk1977ifcapable pager_pragmas&&attach {
21891cf71b0Sdanielk1977  do_test pragma-2.1 {
21991cf71b0Sdanielk1977    file delete -force test2.db
22091cf71b0Sdanielk1977    file delete -force test2.db-journal
2214303feedSdrh    execsql {
22291cf71b0Sdanielk1977      ATTACH 'test2.db' AS aux;
2234303feedSdrh    }
22491cf71b0Sdanielk1977  } {}
22591cf71b0Sdanielk1977  do_test pragma-2.2 {
2264303feedSdrh    execsql {
22791cf71b0Sdanielk1977      pragma aux.synchronous;
2284303feedSdrh    }
22991cf71b0Sdanielk1977  } {2}
23091cf71b0Sdanielk1977  do_test pragma-2.3 {
23191cf71b0Sdanielk1977    execsql {
23291cf71b0Sdanielk1977      pragma aux.synchronous = OFF;
23391cf71b0Sdanielk1977      pragma aux.synchronous;
23491cf71b0Sdanielk1977      pragma synchronous;
23591cf71b0Sdanielk1977    }
23691cf71b0Sdanielk1977  } {0 2}
23791cf71b0Sdanielk1977  do_test pragma-2.4 {
23891cf71b0Sdanielk1977    execsql {
23991cf71b0Sdanielk1977      pragma aux.synchronous = ON;
24091cf71b0Sdanielk1977      pragma synchronous;
24191cf71b0Sdanielk1977      pragma aux.synchronous;
24291cf71b0Sdanielk1977    }
24391cf71b0Sdanielk1977  } {2 1}
244c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
2454303feedSdrh
246ed717fe3Sdrh# Construct a corrupted index and make sure the integrity_check
247ed717fe3Sdrh# pragma finds it.
248ed717fe3Sdrh#
24925d6543dSdrh# These tests won't work if the database is encrypted
25025d6543dSdrh#
251ed717fe3Sdrhdo_test pragma-3.1 {
2521e9daa6aSdrh  db close
2531e9daa6aSdrh  file delete -force test.db test.db-journal
2541e9daa6aSdrh  sqlite3 db test.db
255ed717fe3Sdrh  execsql {
2561e9daa6aSdrh    PRAGMA auto_vacuum=OFF;
257ed717fe3Sdrh    BEGIN;
258ed717fe3Sdrh    CREATE TABLE t2(a,b,c);
259ed717fe3Sdrh    CREATE INDEX i2 ON t2(a);
260ed717fe3Sdrh    INSERT INTO t2 VALUES(11,2,3);
261ed717fe3Sdrh    INSERT INTO t2 VALUES(22,3,4);
262ed717fe3Sdrh    COMMIT;
263ed717fe3Sdrh    SELECT rowid, * from t2;
264ed717fe3Sdrh  }
265ed717fe3Sdrh} {1 11 2 3 2 22 3 4}
2665a8f9374Sdanielk1977ifcapable attach {
26740e016e4Sdrh  if {![sqlite3 -has-codec] && $sqlite_options(integrityck)} {
268ed717fe3Sdrh    do_test pragma-3.2 {
269bb8a279eSdrh      db eval {SELECT rootpage FROM sqlite_master WHERE name='i2'} break
270bb8a279eSdrh      set pgsz [db eval {PRAGMA page_size}]
271bb8a279eSdrh      # overwrite the header on the rootpage of the index in order to
272bb8a279eSdrh      # make the index appear to be empty.
273bb8a279eSdrh      #
274bb8a279eSdrh      set offset [expr {$pgsz*($rootpage-1)}]
275bb8a279eSdrh      hexio_write test.db $offset 0a00000000040000000000
276bb8a279eSdrh      db close
277bb8a279eSdrh      sqlite3 db test.db
278ed717fe3Sdrh      execsql {PRAGMA integrity_check}
279bb8a279eSdrh    } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
28091cf71b0Sdanielk1977    do_test pragma-3.3 {
2811dcdbc06Sdrh      execsql {PRAGMA integrity_check=1}
2821dcdbc06Sdrh    } {{rowid 1 missing from index i2}}
2831dcdbc06Sdrh    do_test pragma-3.4 {
28491cf71b0Sdanielk1977      execsql {
2851dcdbc06Sdrh        ATTACH DATABASE 'test.db' AS t2;
2861dcdbc06Sdrh        PRAGMA integrity_check
28791cf71b0Sdanielk1977      }
288bb8a279eSdrh    } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
2891dcdbc06Sdrh    do_test pragma-3.5 {
2901dcdbc06Sdrh      execsql {
291bb8a279eSdrh        PRAGMA integrity_check=4
2921dcdbc06Sdrh      }
293bb8a279eSdrh    } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2}}
2941dcdbc06Sdrh    do_test pragma-3.6 {
2951dcdbc06Sdrh      execsql {
2961dcdbc06Sdrh        PRAGMA integrity_check=xyz
2971dcdbc06Sdrh      }
298bb8a279eSdrh    } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
2991dcdbc06Sdrh    do_test pragma-3.7 {
3001dcdbc06Sdrh      execsql {
3011dcdbc06Sdrh        PRAGMA integrity_check=0
3021dcdbc06Sdrh      }
303bb8a279eSdrh    } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
3041dcdbc06Sdrh
3051dcdbc06Sdrh    # Add additional corruption by appending unused pages to the end of
3061dcdbc06Sdrh    # the database file testerr.db
3071dcdbc06Sdrh    #
3081dcdbc06Sdrh    do_test pragma-3.8 {
3091dcdbc06Sdrh      execsql {DETACH t2}
3101dcdbc06Sdrh      file delete -force testerr.db testerr.db-journal
311e3d559adSdrh      set out [open testerr.db w]
312e3d559adSdrh      fconfigure $out -translation binary
313e3d559adSdrh      set in [open test.db r]
314e3d559adSdrh      fconfigure $in -translation binary
3151dcdbc06Sdrh      puts -nonewline $out [read $in]
3161dcdbc06Sdrh      seek $in 0
3171dcdbc06Sdrh      puts -nonewline $out [read $in]
3181dcdbc06Sdrh      close $in
3191dcdbc06Sdrh      close $out
3201dcdbc06Sdrh      execsql {REINDEX t2}
3211dcdbc06Sdrh      execsql {PRAGMA integrity_check}
3221dcdbc06Sdrh    } {ok}
32341c58b78Sdanielk1977    do_test pragma-3.8.1 {
32441c58b78Sdanielk1977      execsql {PRAGMA quick_check}
32541c58b78Sdanielk1977    } {ok}
3261dcdbc06Sdrh    do_test pragma-3.9 {
3271dcdbc06Sdrh      execsql {
3281dcdbc06Sdrh        ATTACH 'testerr.db' AS t2;
3291dcdbc06Sdrh        PRAGMA integrity_check
3301dcdbc06Sdrh      }
3311dcdbc06Sdrh    } {{*** in database t2 ***
3321dcdbc06SdrhPage 4 is never used
3331dcdbc06SdrhPage 5 is never used
334bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
3351dcdbc06Sdrh    do_test pragma-3.10 {
3361dcdbc06Sdrh      execsql {
3371dcdbc06Sdrh        PRAGMA integrity_check=1
3381dcdbc06Sdrh      }
3391dcdbc06Sdrh    } {{*** in database t2 ***
3401dcdbc06SdrhPage 4 is never used}}
3411dcdbc06Sdrh    do_test pragma-3.11 {
3421dcdbc06Sdrh      execsql {
3431dcdbc06Sdrh        PRAGMA integrity_check=5
3441dcdbc06Sdrh      }
3451dcdbc06Sdrh    } {{*** in database t2 ***
3461dcdbc06SdrhPage 4 is never used
3471dcdbc06SdrhPage 5 is never used
348bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2}}
3491dcdbc06Sdrh    do_test pragma-3.12 {
3501dcdbc06Sdrh      execsql {
3511dcdbc06Sdrh        PRAGMA integrity_check=4
3521dcdbc06Sdrh      }
3531dcdbc06Sdrh    } {{*** in database t2 ***
3541dcdbc06SdrhPage 4 is never used
3551dcdbc06SdrhPage 5 is never used
3561dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
3571dcdbc06Sdrh    do_test pragma-3.13 {
3581dcdbc06Sdrh      execsql {
3591dcdbc06Sdrh        PRAGMA integrity_check=3
3601dcdbc06Sdrh      }
3611dcdbc06Sdrh    } {{*** in database t2 ***
3621dcdbc06SdrhPage 4 is never used
3631dcdbc06SdrhPage 5 is never used
3641dcdbc06SdrhPage 6 is never used}}
3651dcdbc06Sdrh    do_test pragma-3.14 {
3661dcdbc06Sdrh      execsql {
3671dcdbc06Sdrh        PRAGMA integrity_check(2)
3681dcdbc06Sdrh      }
3691dcdbc06Sdrh    } {{*** in database t2 ***
3701dcdbc06SdrhPage 4 is never used
3711dcdbc06SdrhPage 5 is never used}}
3721dcdbc06Sdrh    do_test pragma-3.15 {
3731dcdbc06Sdrh      execsql {
3741dcdbc06Sdrh        ATTACH 'testerr.db' AS t3;
3751dcdbc06Sdrh        PRAGMA integrity_check
3761dcdbc06Sdrh      }
3771dcdbc06Sdrh    } {{*** in database t2 ***
3781dcdbc06SdrhPage 4 is never used
3791dcdbc06SdrhPage 5 is never used
380bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 ***
3811dcdbc06SdrhPage 4 is never used
3821dcdbc06SdrhPage 5 is never used
383bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
3841dcdbc06Sdrh    do_test pragma-3.16 {
3851dcdbc06Sdrh      execsql {
386bb8a279eSdrh        PRAGMA integrity_check(10)
3871dcdbc06Sdrh      }
3881dcdbc06Sdrh    } {{*** in database t2 ***
3891dcdbc06SdrhPage 4 is never used
3901dcdbc06SdrhPage 5 is never used
391bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 ***
3921dcdbc06SdrhPage 4 is never used
3931dcdbc06SdrhPage 5 is never used
3941dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
3951dcdbc06Sdrh    do_test pragma-3.17 {
3961dcdbc06Sdrh      execsql {
397bb8a279eSdrh        PRAGMA integrity_check=8
3981dcdbc06Sdrh      }
3991dcdbc06Sdrh    } {{*** in database t2 ***
4001dcdbc06SdrhPage 4 is never used
4011dcdbc06SdrhPage 5 is never used
402bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 ***
4031dcdbc06SdrhPage 4 is never used
4041dcdbc06SdrhPage 5 is never used}}
4051dcdbc06Sdrh    do_test pragma-3.18 {
4061dcdbc06Sdrh      execsql {
4071dcdbc06Sdrh        PRAGMA integrity_check=4
4081dcdbc06Sdrh      }
4091dcdbc06Sdrh    } {{*** in database t2 ***
4101dcdbc06SdrhPage 4 is never used
4111dcdbc06SdrhPage 5 is never used
4121dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
4131dcdbc06Sdrh  }
414d2cb50b7Sdrh  do_test pragma-3.19 {
415d2cb50b7Sdrh    catch {db close}
416d2cb50b7Sdrh    file delete -force test.db test.db-journal
417d2cb50b7Sdrh    sqlite3 db test.db
418d2cb50b7Sdrh    db eval {PRAGMA integrity_check}
419d2cb50b7Sdrh  } {ok}
4205a8f9374Sdanielk1977}
421d2cb50b7Sdrh#exit
42291cf71b0Sdanielk1977
42391cf71b0Sdanielk1977# Test modifying the cache_size of an attached database.
4245a8f9374Sdanielk1977ifcapable pager_pragmas&&attach {
42591cf71b0Sdanielk1977do_test pragma-4.1 {
42691cf71b0Sdanielk1977  execsql {
4271e9daa6aSdrh    ATTACH 'test2.db' AS aux;
42891cf71b0Sdanielk1977    pragma aux.cache_size;
42991cf71b0Sdanielk1977    pragma aux.default_cache_size;
43091cf71b0Sdanielk1977  }
4311e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4321bdd9b57Sdrhdo_test pragma-4.2 {
4331bdd9b57Sdrh  execsql {
43491cf71b0Sdanielk1977    pragma aux.cache_size = 50;
43591cf71b0Sdanielk1977    pragma aux.cache_size;
43691cf71b0Sdanielk1977    pragma aux.default_cache_size;
4371bdd9b57Sdrh  }
4381e9daa6aSdrh} [list 50 $DFLT_CACHE_SZ]
4391bdd9b57Sdrhdo_test pragma-4.3 {
4401bdd9b57Sdrh  execsql {
44191cf71b0Sdanielk1977    pragma aux.default_cache_size = 456;
44291cf71b0Sdanielk1977    pragma aux.cache_size;
44391cf71b0Sdanielk1977    pragma aux.default_cache_size;
4441bdd9b57Sdrh  }
44591cf71b0Sdanielk1977} {456 456}
4461bdd9b57Sdrhdo_test pragma-4.4 {
4471bdd9b57Sdrh  execsql {
44891cf71b0Sdanielk1977    pragma cache_size;
44991cf71b0Sdanielk1977    pragma default_cache_size;
4501bdd9b57Sdrh  }
4511e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4521bdd9b57Sdrhdo_test pragma-4.5 {
4531bdd9b57Sdrh  execsql {
45491cf71b0Sdanielk1977    DETACH aux;
45591cf71b0Sdanielk1977    ATTACH 'test3.db' AS aux;
45691cf71b0Sdanielk1977    pragma aux.cache_size;
45791cf71b0Sdanielk1977    pragma aux.default_cache_size;
4581bdd9b57Sdrh  }
4591e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4601bdd9b57Sdrhdo_test pragma-4.6 {
4611bdd9b57Sdrh  execsql {
46291cf71b0Sdanielk1977    DETACH aux;
46391cf71b0Sdanielk1977    ATTACH 'test2.db' AS aux;
46491cf71b0Sdanielk1977    pragma aux.cache_size;
46591cf71b0Sdanielk1977    pragma aux.default_cache_size;
4661bdd9b57Sdrh  }
46791cf71b0Sdanielk1977} {456 456}
468c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
4691bdd9b57Sdrh
47091cf71b0Sdanielk1977# Test that modifying the sync-level in the middle of a transaction is
47191cf71b0Sdanielk1977# disallowed.
472c7b4a44cSdanielk1977ifcapable pager_pragmas {
47391cf71b0Sdanielk1977do_test pragma-5.0 {
4741bdd9b57Sdrh  execsql {
47591cf71b0Sdanielk1977    pragma synchronous;
4761bdd9b57Sdrh  }
47791cf71b0Sdanielk1977} {2}
47891cf71b0Sdanielk1977do_test pragma-5.1 {
4791bdd9b57Sdrh  catchsql {
4801bdd9b57Sdrh    BEGIN;
48191cf71b0Sdanielk1977    pragma synchronous = OFF;
4821bdd9b57Sdrh  }
48391cf71b0Sdanielk1977} {1 {Safety level may not be changed inside a transaction}}
48491cf71b0Sdanielk1977do_test pragma-5.2 {
48591cf71b0Sdanielk1977  execsql {
48691cf71b0Sdanielk1977    pragma synchronous;
48791cf71b0Sdanielk1977  }
48891cf71b0Sdanielk1977} {2}
4895260f7e9Sdrhcatchsql {COMMIT;}
490c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
4915260f7e9Sdrh
4925260f7e9Sdrh# Test schema-query pragmas
4935260f7e9Sdrh#
49427188fb5Sdanielk1977ifcapable schema_pragmas {
4955a8f9374Sdanielk1977ifcapable tempdb&&attach {
4965260f7e9Sdrh  do_test pragma-6.1 {
497956bc92cSdrh    set res {}
49840e016e4Sdrh    execsql {SELECT * FROM sqlite_temp_master}
4995260f7e9Sdrh    foreach {idx name file} [execsql {pragma database_list}] {
5005260f7e9Sdrh      lappend res $idx $name
5015260f7e9Sdrh    }
5025260f7e9Sdrh    set res
503a71aa001Sdrh  } {0 main 1 temp 2 aux}
50453c0f748Sdanielk1977}
5055260f7e9Sdrhdo_test pragma-6.2 {
5065260f7e9Sdrh  execsql {
507d2cb50b7Sdrh    CREATE TABLE t2(a,b,c);
5085260f7e9Sdrh    pragma table_info(t2)
5095260f7e9Sdrh  }
510bfa8b102Sdrh} {0 a {} 0 {} 0 1 b {} 0 {} 0 2 c {} 0 {} 0}
511d2cb50b7Sdrhdo_test pragma-6.2.1 {
512d2cb50b7Sdrh  execsql {
513d2cb50b7Sdrh    pragma table_info;
514d2cb50b7Sdrh  }
515d2cb50b7Sdrh} {}
516736c7d4bSdrhdb nullvalue <<NULL>>
517417ec638Sdrhdo_test pragma-6.2.2 {
518417ec638Sdrh  execsql {
519736c7d4bSdrh    CREATE TABLE t5(
520736c7d4bSdrh      a TEXT DEFAULT CURRENT_TIMESTAMP,
521736c7d4bSdrh      b DEFAULT (5+3),
522736c7d4bSdrh      c TEXT,
523736c7d4bSdrh      d INTEGER DEFAULT NULL,
524736c7d4bSdrh      e TEXT DEFAULT ''
525736c7d4bSdrh    );
526417ec638Sdrh    PRAGMA table_info(t5);
527417ec638Sdrh  }
528736c7d4bSdrh} {0 a TEXT 0 CURRENT_TIMESTAMP 0 1 b {} 0 5+3 0 2 c TEXT 0 <<NULL>> 0 3 d INTEGER 0 NULL 0 4 e TEXT 0 '' 0}
529736c7d4bSdrhdb nullvalue {}
5306bf89570Sdrhifcapable {foreignkey} {
531d2cb50b7Sdrh  do_test pragma-6.3.1 {
5325260f7e9Sdrh    execsql {
5335260f7e9Sdrh      CREATE TABLE t3(a int references t2(b), b UNIQUE);
5345260f7e9Sdrh      pragma foreign_key_list(t3);
5355260f7e9Sdrh    }
53650af3e1dSdanielk1977  } {0 0 t2 a b RESTRICT RESTRICT NONE}
537d2cb50b7Sdrh  do_test pragma-6.3.2 {
538d2cb50b7Sdrh    execsql {
539d2cb50b7Sdrh      pragma foreign_key_list;
540d2cb50b7Sdrh    }
541d2cb50b7Sdrh  } {}
542d2cb50b7Sdrh  do_test pragma-6.3.3 {
543d2cb50b7Sdrh    execsql {
544d2cb50b7Sdrh      pragma foreign_key_list(t3_bogus);
545d2cb50b7Sdrh    }
546d2cb50b7Sdrh  } {}
547d2cb50b7Sdrh  do_test pragma-6.3.4 {
548d2cb50b7Sdrh    execsql {
549d2cb50b7Sdrh      pragma foreign_key_list(t5);
550d2cb50b7Sdrh    }
551d2cb50b7Sdrh  } {}
5525260f7e9Sdrh  do_test pragma-6.4 {
5535260f7e9Sdrh    execsql {
5545260f7e9Sdrh      pragma index_list(t3);
5555260f7e9Sdrh    }
5565260f7e9Sdrh  } {0 sqlite_autoindex_t3_1 1}
5576bf89570Sdrh}
5586bf89570Sdrhifcapable {!foreignkey} {
5596bf89570Sdrh  execsql {CREATE TABLE t3(a,b UNIQUE)}
5606bf89570Sdrh}
561d2cb50b7Sdrhdo_test pragma-6.5.1 {
5625260f7e9Sdrh  execsql {
5635260f7e9Sdrh    CREATE INDEX t3i1 ON t3(a,b);
5645260f7e9Sdrh    pragma index_info(t3i1);
5655260f7e9Sdrh  }
5665260f7e9Sdrh} {0 0 a 1 1 b}
567d2cb50b7Sdrhdo_test pragma-6.5.2 {
568d2cb50b7Sdrh  execsql {
569d2cb50b7Sdrh    pragma index_info(t3i1_bogus);
570d2cb50b7Sdrh  }
571d2cb50b7Sdrh} {}
572260d8a6aSdanielk1977
573260d8a6aSdanielk1977ifcapable tempdb {
574260d8a6aSdanielk1977  # Test for ticket #3320. When a temp table of the same name exists, make
575260d8a6aSdanielk1977  # sure the schema of the main table can still be queried using
576260d8a6aSdanielk1977  # "pragma table_info":
577260d8a6aSdanielk1977  do_test pragma-6.6.1 {
578260d8a6aSdanielk1977    execsql {
579260d8a6aSdanielk1977      CREATE TABLE trial(col_main);
580260d8a6aSdanielk1977      CREATE TEMP TABLE trial(col_temp);
581260d8a6aSdanielk1977    }
582260d8a6aSdanielk1977  } {}
583260d8a6aSdanielk1977  do_test pragma-6.6.2 {
584260d8a6aSdanielk1977    execsql {
585260d8a6aSdanielk1977      PRAGMA table_info(trial);
586260d8a6aSdanielk1977    }
587260d8a6aSdanielk1977  } {0 col_temp {} 0 {} 0}
588260d8a6aSdanielk1977  do_test pragma-6.6.3 {
589260d8a6aSdanielk1977    execsql {
590260d8a6aSdanielk1977      PRAGMA temp.table_info(trial);
591260d8a6aSdanielk1977    }
592260d8a6aSdanielk1977  } {0 col_temp {} 0 {} 0}
593260d8a6aSdanielk1977  do_test pragma-6.6.4 {
594260d8a6aSdanielk1977    execsql {
595260d8a6aSdanielk1977      PRAGMA main.table_info(trial);
596260d8a6aSdanielk1977    }
597260d8a6aSdanielk1977  } {0 col_main {} 0 {} 0}
598260d8a6aSdanielk1977}
599f96a3778Sdanielk1977
600f96a3778Sdanielk1977do_test pragma-6.7 {
601f96a3778Sdanielk1977  execsql {
602f96a3778Sdanielk1977    CREATE TABLE test_table(
603f96a3778Sdanielk1977      one INT NOT NULL DEFAULT -1,
604f96a3778Sdanielk1977      two text,
605f96a3778Sdanielk1977      three VARCHAR(45, 65) DEFAULT 'abcde',
606f96a3778Sdanielk1977      four REAL DEFAULT X'abcdef',
607f96a3778Sdanielk1977      five DEFAULT CURRENT_TIME
608f96a3778Sdanielk1977    );
609f96a3778Sdanielk1977    PRAGMA table_info(test_table);
610f96a3778Sdanielk1977  }
611f96a3778Sdanielk1977} [concat \
612f96a3778Sdanielk1977  {0 one INT 1 -1 0} \
613f96a3778Sdanielk1977  {1 two text 0 {} 0} \
614f96a3778Sdanielk1977  {2 three {VARCHAR(45, 65)} 0 'abcde' 0} \
615f96a3778Sdanielk1977  {3 four REAL 0 X'abcdef' 0} \
616f96a3778Sdanielk1977  {4 five {} 0 CURRENT_TIME 0} \
617f96a3778Sdanielk1977]
61827188fb5Sdanielk1977} ;# ifcapable schema_pragmas
6195260f7e9Sdrh# Miscellaneous tests
6205260f7e9Sdrh#
62127188fb5Sdanielk1977ifcapable schema_pragmas {
622d2cb50b7Sdrhdo_test pragma-7.1.1 {
6235260f7e9Sdrh  # Make sure a pragma knows to read the schema if it needs to
6245260f7e9Sdrh  db close
6255260f7e9Sdrh  sqlite3 db test.db
6265260f7e9Sdrh  execsql {
6275260f7e9Sdrh    pragma index_list(t3);
6285260f7e9Sdrh  }
6295260f7e9Sdrh} {0 t3i1 0 1 sqlite_autoindex_t3_1 1}
630d2cb50b7Sdrhdo_test pragma-7.1.2 {
631d2cb50b7Sdrh  execsql {
632d2cb50b7Sdrh    pragma index_list(t3_bogus);
633d2cb50b7Sdrh  }
634d2cb50b7Sdrh} {}
63527188fb5Sdanielk1977} ;# ifcapable schema_pragmas
6366c62608fSdrhifcapable {utf16} {
6375260f7e9Sdrh  do_test pragma-7.2 {
6385260f7e9Sdrh    db close
6395260f7e9Sdrh    sqlite3 db test.db
6405260f7e9Sdrh    catchsql {
6415260f7e9Sdrh      pragma encoding=bogus;
6425260f7e9Sdrh    }
6435260f7e9Sdrh  } {1 {unsupported encoding: bogus}}
6446c62608fSdrh}
64553c0f748Sdanielk1977ifcapable tempdb {
6465260f7e9Sdrh  do_test pragma-7.3 {
6475260f7e9Sdrh    db close
6485260f7e9Sdrh    sqlite3 db test.db
6495260f7e9Sdrh    execsql {
6505260f7e9Sdrh      pragma lock_status;
6515260f7e9Sdrh    }
6525260f7e9Sdrh  } {main unlocked temp closed}
65353c0f748Sdanielk1977} else {
65453c0f748Sdanielk1977  do_test pragma-7.3 {
65553c0f748Sdanielk1977    db close
65653c0f748Sdanielk1977    sqlite3 db test.db
65753c0f748Sdanielk1977    execsql {
65853c0f748Sdanielk1977      pragma lock_status;
65953c0f748Sdanielk1977    }
66053c0f748Sdanielk1977  } {main unlocked}
66153c0f748Sdanielk1977}
6625260f7e9Sdrh
6635260f7e9Sdrh
664dae2495bSdanielk1977#----------------------------------------------------------------------
665b92b70bbSdanielk1977# Test cases pragma-8.* test the "PRAGMA schema_version" and "PRAGMA
666b92b70bbSdanielk1977# user_version" statements.
667dae2495bSdanielk1977#
668b92b70bbSdanielk1977# pragma-8.1: PRAGMA schema_version
669b92b70bbSdanielk1977# pragma-8.2: PRAGMA user_version
670dae2495bSdanielk1977#
671dae2495bSdanielk1977
67211cf9fbcSdanielk1977ifcapable schema_version {
67311cf9fbcSdanielk1977
674b92b70bbSdanielk1977# First check that we can set the schema version and then retrieve the
675dae2495bSdanielk1977# same value.
676dae2495bSdanielk1977do_test pragma-8.1.1 {
677dae2495bSdanielk1977  execsql {
678b92b70bbSdanielk1977    PRAGMA schema_version = 105;
679dae2495bSdanielk1977  }
680dae2495bSdanielk1977} {}
681dae2495bSdanielk1977do_test pragma-8.1.2 {
68225403650Sdrh  execsql2 {
683b92b70bbSdanielk1977    PRAGMA schema_version;
684dae2495bSdanielk1977  }
68525403650Sdrh} {schema_version 105}
686dae2495bSdanielk1977do_test pragma-8.1.3 {
687dae2495bSdanielk1977  execsql {
688b92b70bbSdanielk1977    PRAGMA schema_version = 106;
689dae2495bSdanielk1977  }
690dae2495bSdanielk1977} {}
691dae2495bSdanielk1977do_test pragma-8.1.4 {
692dae2495bSdanielk1977  execsql {
693b92b70bbSdanielk1977    PRAGMA schema_version;
694dae2495bSdanielk1977  }
695dae2495bSdanielk1977} 106
696dae2495bSdanielk1977
697b92b70bbSdanielk1977# Check that creating a table modifies the schema-version (this is really
698b92b70bbSdanielk1977# to verify that the value being read is in fact the schema version).
699dae2495bSdanielk1977do_test pragma-8.1.5 {
700dae2495bSdanielk1977  execsql {
701dae2495bSdanielk1977    CREATE TABLE t4(a, b, c);
702dae2495bSdanielk1977    INSERT INTO t4 VALUES(1, 2, 3);
703dae2495bSdanielk1977    SELECT * FROM t4;
704dae2495bSdanielk1977  }
705dae2495bSdanielk1977} {1 2 3}
706dae2495bSdanielk1977do_test pragma-8.1.6 {
707dae2495bSdanielk1977  execsql {
708b92b70bbSdanielk1977    PRAGMA schema_version;
709dae2495bSdanielk1977  }
710dae2495bSdanielk1977} 107
711dae2495bSdanielk1977
712dae2495bSdanielk1977# Now open a second connection to the database. Ensure that changing the
713b92b70bbSdanielk1977# schema-version using the first connection forces the second connection
714dae2495bSdanielk1977# to reload the schema. This has to be done using the C-API test functions,
715dae2495bSdanielk1977# because the TCL API accounts for SCHEMA_ERROR and retries the query.
716dae2495bSdanielk1977do_test pragma-8.1.7 {
717dddca286Sdrh  sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
718dae2495bSdanielk1977  execsql {
719dae2495bSdanielk1977    SELECT * FROM t4;
720dae2495bSdanielk1977  } db2
721dae2495bSdanielk1977} {1 2 3}
722dae2495bSdanielk1977do_test pragma-8.1.8 {
723dae2495bSdanielk1977  execsql {
724b92b70bbSdanielk1977    PRAGMA schema_version = 108;
725dae2495bSdanielk1977  }
726dae2495bSdanielk1977} {}
727dae2495bSdanielk1977do_test pragma-8.1.9 {
728dae2495bSdanielk1977  set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY]
729dae2495bSdanielk1977  sqlite3_step $::STMT
730dae2495bSdanielk1977} SQLITE_ERROR
731dae2495bSdanielk1977do_test pragma-8.1.10 {
732dae2495bSdanielk1977  sqlite3_finalize $::STMT
733dae2495bSdanielk1977} SQLITE_SCHEMA
734dae2495bSdanielk1977
735b92b70bbSdanielk1977# Make sure the schema-version can be manipulated in an attached database.
736dae2495bSdanielk1977file delete -force test2.db
737dae2495bSdanielk1977file delete -force test2.db-journal
7385a8f9374Sdanielk1977ifcapable attach {
739dae2495bSdanielk1977  do_test pragma-8.1.11 {
740dae2495bSdanielk1977    execsql {
741dae2495bSdanielk1977      ATTACH 'test2.db' AS aux;
742dae2495bSdanielk1977      CREATE TABLE aux.t1(a, b, c);
743b92b70bbSdanielk1977      PRAGMA aux.schema_version = 205;
744dae2495bSdanielk1977    }
745dae2495bSdanielk1977  } {}
746dae2495bSdanielk1977  do_test pragma-8.1.12 {
747dae2495bSdanielk1977    execsql {
748b92b70bbSdanielk1977      PRAGMA aux.schema_version;
749dae2495bSdanielk1977    }
750dae2495bSdanielk1977  } 205
7515a8f9374Sdanielk1977}
752dae2495bSdanielk1977do_test pragma-8.1.13 {
753dae2495bSdanielk1977  execsql {
754b92b70bbSdanielk1977    PRAGMA schema_version;
755dae2495bSdanielk1977  }
756dae2495bSdanielk1977} 108
757dae2495bSdanielk1977
758b92b70bbSdanielk1977# And check that modifying the schema-version in an attached database
759dae2495bSdanielk1977# forces the second connection to reload the schema.
7605a8f9374Sdanielk1977ifcapable attach {
761dae2495bSdanielk1977  do_test pragma-8.1.14 {
762dddca286Sdrh    sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
763dae2495bSdanielk1977    execsql {
764dae2495bSdanielk1977      ATTACH 'test2.db' AS aux;
765dae2495bSdanielk1977      SELECT * FROM aux.t1;
766dae2495bSdanielk1977    } db2
767dae2495bSdanielk1977  } {}
768dae2495bSdanielk1977  do_test pragma-8.1.15 {
769dae2495bSdanielk1977    execsql {
770b92b70bbSdanielk1977      PRAGMA aux.schema_version = 206;
771dae2495bSdanielk1977    }
772dae2495bSdanielk1977  } {}
773dae2495bSdanielk1977  do_test pragma-8.1.16 {
774dae2495bSdanielk1977    set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY]
775dae2495bSdanielk1977    sqlite3_step $::STMT
776dae2495bSdanielk1977  } SQLITE_ERROR
777dae2495bSdanielk1977  do_test pragma-8.1.17 {
778dae2495bSdanielk1977    sqlite3_finalize $::STMT
779dae2495bSdanielk1977  } SQLITE_SCHEMA
780dae2495bSdanielk1977  do_test pragma-8.1.18 {
781dae2495bSdanielk1977    db2 close
782dae2495bSdanielk1977  } {}
7835a8f9374Sdanielk1977}
784dae2495bSdanielk1977
785b92b70bbSdanielk1977# Now test that the user-version can be read and written (and that we aren't
786b92b70bbSdanielk1977# accidentally manipulating the schema-version instead).
787dae2495bSdanielk1977do_test pragma-8.2.1 {
78825403650Sdrh  execsql2 {
789b92b70bbSdanielk1977    PRAGMA user_version;
790dae2495bSdanielk1977  }
79125403650Sdrh} {user_version 0}
792dae2495bSdanielk1977do_test pragma-8.2.2 {
793dae2495bSdanielk1977  execsql {
794b92b70bbSdanielk1977    PRAGMA user_version = 2;
795dae2495bSdanielk1977  }
796dae2495bSdanielk1977} {}
797802d69a7Sdrhdo_test pragma-8.2.3.1 {
79825403650Sdrh  execsql2 {
799b92b70bbSdanielk1977    PRAGMA user_version;
800dae2495bSdanielk1977  }
80125403650Sdrh} {user_version 2}
802802d69a7Sdrhdo_test pragma-8.2.3.2 {
803802d69a7Sdrh  db close
804802d69a7Sdrh  sqlite3 db test.db
805802d69a7Sdrh  execsql {
806802d69a7Sdrh    PRAGMA user_version;
807802d69a7Sdrh  }
808802d69a7Sdrh} {2}
809802d69a7Sdrhdo_test pragma-8.2.4.1 {
810dae2495bSdanielk1977  execsql {
811b92b70bbSdanielk1977    PRAGMA schema_version;
812dae2495bSdanielk1977  }
813dae2495bSdanielk1977} {108}
814802d69a7Sdrhifcapable vacuum {
815802d69a7Sdrh  do_test pragma-8.2.4.2 {
816802d69a7Sdrh    execsql {
817802d69a7Sdrh      VACUUM;
818802d69a7Sdrh      PRAGMA user_version;
819802d69a7Sdrh    }
820802d69a7Sdrh  } {2}
821802d69a7Sdrh  do_test pragma-8.2.4.3 {
822802d69a7Sdrh    execsql {
823802d69a7Sdrh      PRAGMA schema_version;
824802d69a7Sdrh    }
825802d69a7Sdrh  } {109}
826802d69a7Sdrh}
8275a8f9374Sdanielk1977
8285a8f9374Sdanielk1977ifcapable attach {
829802d69a7Sdrh  db eval {ATTACH 'test2.db' AS aux}
830dae2495bSdanielk1977
831b92b70bbSdanielk1977  # Check that the user-version in the auxilary database can be manipulated (
832dae2495bSdanielk1977  # and that we aren't accidentally manipulating the same in the main db).
833dae2495bSdanielk1977  do_test pragma-8.2.5 {
834dae2495bSdanielk1977    execsql {
835b92b70bbSdanielk1977      PRAGMA aux.user_version;
836dae2495bSdanielk1977    }
837dae2495bSdanielk1977  } {0}
838dae2495bSdanielk1977  do_test pragma-8.2.6 {
839dae2495bSdanielk1977    execsql {
840b92b70bbSdanielk1977      PRAGMA aux.user_version = 3;
841dae2495bSdanielk1977    }
842dae2495bSdanielk1977  } {}
843dae2495bSdanielk1977  do_test pragma-8.2.7 {
844dae2495bSdanielk1977    execsql {
845b92b70bbSdanielk1977      PRAGMA aux.user_version;
846dae2495bSdanielk1977    }
847dae2495bSdanielk1977  } {3}
848dae2495bSdanielk1977  do_test pragma-8.2.8 {
849dae2495bSdanielk1977    execsql {
850b92b70bbSdanielk1977      PRAGMA main.user_version;
851dae2495bSdanielk1977    }
852dae2495bSdanielk1977  } {2}
853dae2495bSdanielk1977
854b92b70bbSdanielk1977  # Now check that a ROLLBACK resets the user-version if it has been modified
855dae2495bSdanielk1977  # within a transaction.
856dae2495bSdanielk1977  do_test pragma-8.2.9 {
857dae2495bSdanielk1977    execsql {
858dae2495bSdanielk1977      BEGIN;
859b92b70bbSdanielk1977      PRAGMA aux.user_version = 10;
860b92b70bbSdanielk1977      PRAGMA user_version = 11;
861dae2495bSdanielk1977    }
862dae2495bSdanielk1977  } {}
863dae2495bSdanielk1977  do_test pragma-8.2.10 {
864dae2495bSdanielk1977    execsql {
865b92b70bbSdanielk1977      PRAGMA aux.user_version;
866dae2495bSdanielk1977    }
867dae2495bSdanielk1977  } {10}
868dae2495bSdanielk1977  do_test pragma-8.2.11 {
869dae2495bSdanielk1977    execsql {
870b92b70bbSdanielk1977      PRAGMA main.user_version;
871dae2495bSdanielk1977    }
872dae2495bSdanielk1977  } {11}
873dae2495bSdanielk1977  do_test pragma-8.2.12 {
874dae2495bSdanielk1977    execsql {
875dae2495bSdanielk1977      ROLLBACK;
876b92b70bbSdanielk1977      PRAGMA aux.user_version;
877dae2495bSdanielk1977    }
878dae2495bSdanielk1977  } {3}
879dae2495bSdanielk1977  do_test pragma-8.2.13 {
880dae2495bSdanielk1977    execsql {
881b92b70bbSdanielk1977      PRAGMA main.user_version;
882dae2495bSdanielk1977    }
883dae2495bSdanielk1977  } {2}
8845a8f9374Sdanielk1977}
885dae2495bSdanielk1977
886b92b70bbSdanielk1977# Try a negative value for the user-version
887dae2495bSdanielk1977do_test pragma-8.2.14 {
888dae2495bSdanielk1977  execsql {
889b92b70bbSdanielk1977    PRAGMA user_version = -450;
890dae2495bSdanielk1977  }
891dae2495bSdanielk1977} {}
892dae2495bSdanielk1977do_test pragma-8.2.15 {
893dae2495bSdanielk1977  execsql {
894b92b70bbSdanielk1977    PRAGMA user_version;
895dae2495bSdanielk1977  }
896dae2495bSdanielk1977} {-450}
897d9c847dcSdanielk1977} ; # ifcapable schema_version
898d9c847dcSdanielk1977
899d19744f3Sdrh# Check to see if TEMP_STORE is memory or disk.  Return strings
900d19744f3Sdrh# "memory" or "disk" as appropriate.
901d19744f3Sdrh#
902d19744f3Sdrhproc check_temp_store {} {
903d19744f3Sdrh  db eval {CREATE TEMP TABLE IF NOT EXISTS a(b)}
904d19744f3Sdrh  db eval {PRAGMA database_list} {
905d19744f3Sdrh    if {$name=="temp"} {
90617b90b53Sdanielk1977      set bt [btree_from_db db 1]
90717b90b53Sdanielk1977      if {[btree_ismemdb $bt]} {
908d19744f3Sdrh        return "memory"
909d19744f3Sdrh      }
91017b90b53Sdanielk1977      return "disk"
911d19744f3Sdrh    }
912d19744f3Sdrh  }
913d19744f3Sdrh  return "unknown"
914d19744f3Sdrh}
915d19744f3Sdrh
9169a09a3caStpoindex
9179a09a3caStpoindex# Test temp_store and temp_store_directory pragmas
9189a09a3caStpoindex#
919268283bcSdrhifcapable pager_pragmas {
9209a09a3caStpoindexdo_test pragma-9.1 {
9219a09a3caStpoindex  db close
9229a09a3caStpoindex  sqlite3 db test.db
9239a09a3caStpoindex  execsql {
9249a09a3caStpoindex    PRAGMA temp_store;
9259a09a3caStpoindex  }
9269a09a3caStpoindex} {0}
927d19744f3Sdrhif {$TEMP_STORE<=1} {
928d19744f3Sdrh  do_test pragma-9.1.1 {
929d19744f3Sdrh    check_temp_store
930d19744f3Sdrh  } {disk}
931d19744f3Sdrh} else {
932d19744f3Sdrh  do_test pragma-9.1.1 {
933d19744f3Sdrh    check_temp_store
934d19744f3Sdrh  } {memory}
935d19744f3Sdrh}
936d19744f3Sdrh
9379a09a3caStpoindexdo_test pragma-9.2 {
938d19744f3Sdrh  db close
939d19744f3Sdrh  sqlite3 db test.db
9409a09a3caStpoindex  execsql {
9419a09a3caStpoindex    PRAGMA temp_store=file;
9429a09a3caStpoindex    PRAGMA temp_store;
9439a09a3caStpoindex  }
9449a09a3caStpoindex} {1}
945d19744f3Sdrhif {$TEMP_STORE==3} {
946d19744f3Sdrh  # When TEMP_STORE is 3, always use memory regardless of pragma settings.
947d19744f3Sdrh  do_test pragma-9.2.1 {
948d19744f3Sdrh    check_temp_store
949d19744f3Sdrh  } {memory}
950d19744f3Sdrh} else {
951d19744f3Sdrh  do_test pragma-9.2.1 {
952d19744f3Sdrh    check_temp_store
953d19744f3Sdrh  } {disk}
954d19744f3Sdrh}
955d19744f3Sdrh
9569a09a3caStpoindexdo_test pragma-9.3 {
957d19744f3Sdrh  db close
958d19744f3Sdrh  sqlite3 db test.db
9599a09a3caStpoindex  execsql {
9609a09a3caStpoindex    PRAGMA temp_store=memory;
9619a09a3caStpoindex    PRAGMA temp_store;
9629a09a3caStpoindex  }
9639a09a3caStpoindex} {2}
964d19744f3Sdrhif {$TEMP_STORE==0} {
965d19744f3Sdrh  # When TEMP_STORE is 0, always use the disk regardless of pragma settings.
966d19744f3Sdrh  do_test pragma-9.3.1 {
967d19744f3Sdrh    check_temp_store
968d19744f3Sdrh  } {disk}
969d19744f3Sdrh} else {
970d19744f3Sdrh  do_test pragma-9.3.1 {
971d19744f3Sdrh    check_temp_store
972d19744f3Sdrh  } {memory}
973d19744f3Sdrh}
974d19744f3Sdrh
9759a09a3caStpoindexdo_test pragma-9.4 {
9769a09a3caStpoindex  execsql {
9779a09a3caStpoindex    PRAGMA temp_store_directory;
9789a09a3caStpoindex  }
9799a09a3caStpoindex} {}
98078f82d1eSdrhifcapable wsd {
9819a09a3caStpoindex  do_test pragma-9.5 {
982181ddaa1Sdanielk1977    set pwd [string map {' ''} [file nativename [pwd]]]
983268283bcSdrh    execsql "
984268283bcSdrh      PRAGMA temp_store_directory='$pwd';
9859a09a3caStpoindex    "
9869a09a3caStpoindex  } {}
9879a09a3caStpoindex  do_test pragma-9.6 {
9889a09a3caStpoindex    execsql {
9899a09a3caStpoindex      PRAGMA temp_store_directory;
9909a09a3caStpoindex    }
991181ddaa1Sdanielk1977  } [list [file nativename [pwd]]]
9929a09a3caStpoindex  do_test pragma-9.7 {
993268283bcSdrh    catchsql {
9949a09a3caStpoindex      PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR';
9959a09a3caStpoindex    }
996268283bcSdrh  } {1 {not a writable directory}}
9979a09a3caStpoindex  do_test pragma-9.8 {
9989a09a3caStpoindex    execsql {
9999a09a3caStpoindex      PRAGMA temp_store_directory='';
10009a09a3caStpoindex    }
10019a09a3caStpoindex  } {}
10021e9daa6aSdrh  if {![info exists TEMP_STORE] || $TEMP_STORE<=1} {
100353c0f748Sdanielk1977    ifcapable tempdb {
10049a09a3caStpoindex      do_test pragma-9.9 {
10059a09a3caStpoindex        execsql {
10069a09a3caStpoindex          PRAGMA temp_store_directory;
10079a09a3caStpoindex          PRAGMA temp_store=FILE;
10089a09a3caStpoindex          CREATE TEMP TABLE temp_store_directory_test(a integer);
10099a09a3caStpoindex          INSERT INTO temp_store_directory_test values (2);
10109a09a3caStpoindex          SELECT * FROM temp_store_directory_test;
10119a09a3caStpoindex        }
10129a09a3caStpoindex      } {2}
10139a09a3caStpoindex      do_test pragma-9.10 {
1014268283bcSdrh        catchsql "
1015268283bcSdrh          PRAGMA temp_store_directory='$pwd';
10169a09a3caStpoindex          SELECT * FROM temp_store_directory_test;
10179a09a3caStpoindex        "
1018268283bcSdrh      } {1 {no such table: temp_store_directory_test}}
10191e9daa6aSdrh    }
10201e9daa6aSdrh  }
102178f82d1eSdrh}
102295b289b6Sdanielk1977do_test pragma-9.11 {
102395b289b6Sdanielk1977  execsql {
102495b289b6Sdanielk1977    PRAGMA temp_store = 0;
102595b289b6Sdanielk1977    PRAGMA temp_store;
102695b289b6Sdanielk1977  }
102795b289b6Sdanielk1977} {0}
102895b289b6Sdanielk1977do_test pragma-9.12 {
102995b289b6Sdanielk1977  execsql {
103095b289b6Sdanielk1977    PRAGMA temp_store = 1;
103195b289b6Sdanielk1977    PRAGMA temp_store;
103295b289b6Sdanielk1977  }
103395b289b6Sdanielk1977} {1}
103495b289b6Sdanielk1977do_test pragma-9.13 {
103595b289b6Sdanielk1977  execsql {
103695b289b6Sdanielk1977    PRAGMA temp_store = 2;
103795b289b6Sdanielk1977    PRAGMA temp_store;
103895b289b6Sdanielk1977  }
103995b289b6Sdanielk1977} {2}
104095b289b6Sdanielk1977do_test pragma-9.14 {
104195b289b6Sdanielk1977  execsql {
104295b289b6Sdanielk1977    PRAGMA temp_store = 3;
104395b289b6Sdanielk1977    PRAGMA temp_store;
104495b289b6Sdanielk1977  }
104595b289b6Sdanielk1977} {0}
104695b289b6Sdanielk1977do_test pragma-9.15 {
104795b289b6Sdanielk1977  catchsql {
104895b289b6Sdanielk1977    BEGIN EXCLUSIVE;
104995b289b6Sdanielk1977    CREATE TEMP TABLE temp_table(t);
105095b289b6Sdanielk1977    INSERT INTO temp_table VALUES('valuable data');
105195b289b6Sdanielk1977    PRAGMA temp_store = 1;
105295b289b6Sdanielk1977  }
105395b289b6Sdanielk1977} {1 {temporary storage cannot be changed from within a transaction}}
105495b289b6Sdanielk1977do_test pragma-9.16 {
105595b289b6Sdanielk1977  execsql {
105695b289b6Sdanielk1977    SELECT * FROM temp_table;
105795b289b6Sdanielk1977    COMMIT;
105895b289b6Sdanielk1977  }
105995b289b6Sdanielk1977} {{valuable data}}
1060983e2309Sdanielk1977
1061983e2309Sdanielk1977do_test pragma-9.17 {
1062983e2309Sdanielk1977  execsql {
1063983e2309Sdanielk1977    INSERT INTO temp_table VALUES('valuable data II');
1064983e2309Sdanielk1977    SELECT * FROM temp_table;
1065983e2309Sdanielk1977  }
1066983e2309Sdanielk1977} {{valuable data} {valuable data II}}
1067983e2309Sdanielk1977
1068983e2309Sdanielk1977do_test pragma-9.18 {
1069983e2309Sdanielk1977  set rc [catch {
1070983e2309Sdanielk1977    db eval {SELECT t FROM temp_table} {
1071983e2309Sdanielk1977      execsql {pragma temp_store = 1}
1072983e2309Sdanielk1977    }
1073983e2309Sdanielk1977  } msg]
1074983e2309Sdanielk1977  list $rc $msg
1075983e2309Sdanielk1977} {1 {temporary storage cannot be changed from within a transaction}}
1076983e2309Sdanielk1977
1077268283bcSdrh} ;# ifcapable pager_pragmas
10789a09a3caStpoindex
1079cc6bd383Sdanielk1977ifcapable trigger {
1080cc6bd383Sdanielk1977
1081cc6bd383Sdanielk1977do_test pragma-10.0 {
1082cc6bd383Sdanielk1977  catchsql {
1083cc6bd383Sdanielk1977    DROP TABLE main.t1;
1084cc6bd383Sdanielk1977  }
1085cc6bd383Sdanielk1977  execsql {
1086cc6bd383Sdanielk1977    PRAGMA count_changes = 1;
1087cc6bd383Sdanielk1977
1088cc6bd383Sdanielk1977    CREATE TABLE t1(a PRIMARY KEY);
1089cc6bd383Sdanielk1977    CREATE TABLE t1_mirror(a);
1090cc6bd383Sdanielk1977    CREATE TABLE t1_mirror2(a);
1091cc6bd383Sdanielk1977    CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN
1092cc6bd383Sdanielk1977      INSERT INTO t1_mirror VALUES(new.a);
1093cc6bd383Sdanielk1977    END;
1094cc6bd383Sdanielk1977    CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN
1095cc6bd383Sdanielk1977      INSERT INTO t1_mirror2 VALUES(new.a);
1096cc6bd383Sdanielk1977    END;
1097cc6bd383Sdanielk1977    CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN
1098cc6bd383Sdanielk1977      UPDATE t1_mirror SET a = new.a WHERE a = old.a;
1099cc6bd383Sdanielk1977    END;
1100cc6bd383Sdanielk1977    CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN
1101cc6bd383Sdanielk1977      UPDATE t1_mirror2 SET a = new.a WHERE a = old.a;
1102cc6bd383Sdanielk1977    END;
1103cc6bd383Sdanielk1977    CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN
1104cc6bd383Sdanielk1977      DELETE FROM t1_mirror WHERE a = old.a;
1105cc6bd383Sdanielk1977    END;
1106cc6bd383Sdanielk1977    CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN
1107cc6bd383Sdanielk1977      DELETE FROM t1_mirror2 WHERE a = old.a;
1108cc6bd383Sdanielk1977    END;
1109cc6bd383Sdanielk1977  }
1110cc6bd383Sdanielk1977} {}
1111cc6bd383Sdanielk1977
1112cc6bd383Sdanielk1977do_test pragma-10.1 {
1113cc6bd383Sdanielk1977  execsql {
1114cc6bd383Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,10));
1115cc6bd383Sdanielk1977  }
1116cc6bd383Sdanielk1977} {1}
1117cc6bd383Sdanielk1977do_test pragma-10.2 {
1118cc6bd383Sdanielk1977  execsql {
1119cc6bd383Sdanielk1977    UPDATE t1 SET a = randstr(10,10);
1120cc6bd383Sdanielk1977  }
1121cc6bd383Sdanielk1977} {1}
1122cc6bd383Sdanielk1977do_test pragma-10.3 {
1123cc6bd383Sdanielk1977  execsql {
1124cc6bd383Sdanielk1977    DELETE FROM t1;
1125cc6bd383Sdanielk1977  }
1126cc6bd383Sdanielk1977} {1}
1127cc6bd383Sdanielk1977
1128cc6bd383Sdanielk1977} ;# ifcapable trigger
1129cc6bd383Sdanielk1977
113048af65aeSdanielk1977ifcapable schema_pragmas {
113148af65aeSdanielk1977  do_test pragma-11.1 {
113248af65aeSdanielk1977    execsql2 {
113348af65aeSdanielk1977      pragma collation_list;
113448af65aeSdanielk1977    }
11359b5adfa2Sdrh  } {seq 0 name NOCASE seq 1 name RTRIM seq 2 name BINARY}
113648af65aeSdanielk1977  do_test pragma-11.2 {
113748af65aeSdanielk1977    db collate New_Collation blah...
113848af65aeSdanielk1977    execsql {
113948af65aeSdanielk1977      pragma collation_list;
114048af65aeSdanielk1977    }
11419b5adfa2Sdrh  } {0 New_Collation 1 NOCASE 2 RTRIM 3 BINARY}
114248af65aeSdanielk1977}
114348af65aeSdanielk1977
1144ddfb2f03Sdanielk1977ifcapable schema_pragmas&&tempdb {
1145ddfb2f03Sdanielk1977  do_test pragma-12.1 {
1146ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1147ddfb2f03Sdanielk1977    execsql {
1148ddfb2f03Sdanielk1977      PRAGMA temp.table_info('abc');
1149ddfb2f03Sdanielk1977    } db2
1150ddfb2f03Sdanielk1977  } {}
1151ddfb2f03Sdanielk1977  db2 close
1152ddfb2f03Sdanielk1977
1153ddfb2f03Sdanielk1977  do_test pragma-12.2 {
1154ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1155ddfb2f03Sdanielk1977    execsql {
1156ddfb2f03Sdanielk1977      PRAGMA temp.default_cache_size = 200;
1157ddfb2f03Sdanielk1977      PRAGMA temp.default_cache_size;
1158ddfb2f03Sdanielk1977    } db2
1159ddfb2f03Sdanielk1977  } {200}
1160ddfb2f03Sdanielk1977  db2 close
1161ddfb2f03Sdanielk1977
1162ddfb2f03Sdanielk1977  do_test pragma-12.3 {
1163ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1164ddfb2f03Sdanielk1977    execsql {
1165ddfb2f03Sdanielk1977      PRAGMA temp.cache_size = 400;
1166ddfb2f03Sdanielk1977      PRAGMA temp.cache_size;
1167ddfb2f03Sdanielk1977    } db2
1168ddfb2f03Sdanielk1977  } {400}
1169ddfb2f03Sdanielk1977  db2 close
1170ddfb2f03Sdanielk1977}
1171ddfb2f03Sdanielk1977
11724b2688abSdanielk1977ifcapable bloblit {
11734b2688abSdanielk1977
117405a82983Sdrhdo_test pragma-13.1 {
117505a82983Sdrh  execsql {
117605a82983Sdrh    DROP TABLE IF EXISTS t4;
117705a82983Sdrh    PRAGMA vdbe_trace=on;
117805a82983Sdrh    PRAGMA vdbe_listing=on;
117905a82983Sdrh    PRAGMA sql_trace=on;
118005a82983Sdrh    CREATE TABLE t4(a INTEGER PRIMARY KEY,b);
118105a82983Sdrh    INSERT INTO t4(b) VALUES(x'0123456789abcdef0123456789abcdef0123456789');
118205a82983Sdrh    INSERT INTO t4(b) VALUES(randstr(30,30));
118305a82983Sdrh    INSERT INTO t4(b) VALUES(1.23456);
118405a82983Sdrh    INSERT INTO t4(b) VALUES(NULL);
118505a82983Sdrh    INSERT INTO t4(b) VALUES(0);
118605a82983Sdrh    INSERT INTO t4(b) SELECT b||b||b||b FROM t4;
118705a82983Sdrh    SELECT * FROM t4;
118805a82983Sdrh  }
118905a82983Sdrh  execsql {
119005a82983Sdrh    PRAGMA vdbe_trace=off;
119105a82983Sdrh    PRAGMA vdbe_listing=off;
119205a82983Sdrh    PRAGMA sql_trace=off;
119305a82983Sdrh  }
119405a82983Sdrh} {}
119505a82983Sdrh
11964b2688abSdanielk1977} ;# ifcapable bloblit
11974b2688abSdanielk1977
119859a93791Sdanielk1977ifcapable pager_pragmas {
119959a93791Sdanielk1977  db close
120059a93791Sdanielk1977  file delete -force test.db
120159a93791Sdanielk1977  sqlite3 db test.db
120259a93791Sdanielk1977
120359a93791Sdanielk1977  do_test pragma-14.1 {
120459a93791Sdanielk1977    execsql { pragma auto_vacuum = 0 }
120559a93791Sdanielk1977    execsql { pragma page_count }
120659a93791Sdanielk1977  } {0}
120759a93791Sdanielk1977
120859a93791Sdanielk1977  do_test pragma-14.2 {
120959a93791Sdanielk1977    execsql {
121059a93791Sdanielk1977      CREATE TABLE abc(a, b, c);
121159a93791Sdanielk1977      PRAGMA page_count;
121259a93791Sdanielk1977    }
121359a93791Sdanielk1977  } {2}
121459a93791Sdanielk1977
121559a93791Sdanielk1977  do_test pragma-14.3 {
121659a93791Sdanielk1977    execsql {
121759a93791Sdanielk1977      BEGIN;
121859a93791Sdanielk1977      CREATE TABLE def(a, b, c);
121959a93791Sdanielk1977      PRAGMA page_count;
122059a93791Sdanielk1977    }
122159a93791Sdanielk1977  } {3}
122259a93791Sdanielk1977
122359a93791Sdanielk1977  do_test pragma-14.4 {
122459a93791Sdanielk1977    set page_size [db one {pragma page_size}]
122559a93791Sdanielk1977    expr [file size test.db] / $page_size
122659a93791Sdanielk1977  } {2}
122759a93791Sdanielk1977
122859a93791Sdanielk1977  do_test pragma-14.5 {
122959a93791Sdanielk1977    execsql {
123059a93791Sdanielk1977      ROLLBACK;
123159a93791Sdanielk1977      PRAGMA page_count;
123259a93791Sdanielk1977    }
123359a93791Sdanielk1977  } {2}
123459a93791Sdanielk1977
123559a93791Sdanielk1977  do_test pragma-14.6 {
123659a93791Sdanielk1977    file delete -force test2.db
123759a93791Sdanielk1977    sqlite3 db2 test2.db
123859a93791Sdanielk1977    execsql {
123959a93791Sdanielk1977      PRAGMA auto_vacuum = 0;
124059a93791Sdanielk1977      CREATE TABLE t1(a, b, c);
124159a93791Sdanielk1977      CREATE TABLE t2(a, b, c);
124259a93791Sdanielk1977      CREATE TABLE t3(a, b, c);
124359a93791Sdanielk1977      CREATE TABLE t4(a, b, c);
124459a93791Sdanielk1977    } db2
124559a93791Sdanielk1977    db2 close
124659a93791Sdanielk1977    execsql {
124759a93791Sdanielk1977      ATTACH 'test2.db' AS aux;
124859a93791Sdanielk1977      PRAGMA aux.page_count;
124959a93791Sdanielk1977    }
125059a93791Sdanielk1977  } {5}
125159a93791Sdanielk1977}
125259a93791Sdanielk1977
12538cf6c554Sdanielk1977# Test that the value set using the cache_size pragma is not reset when the
12548cf6c554Sdanielk1977# schema is reloaded.
12558cf6c554Sdanielk1977#
12568cf6c554Sdanielk1977ifcapable pager_pragmas {
12578cf6c554Sdanielk1977  db close
12588cf6c554Sdanielk1977  sqlite3 db test.db
12598cf6c554Sdanielk1977  do_test pragma-15.1 {
12608cf6c554Sdanielk1977    execsql {
12618cf6c554Sdanielk1977      PRAGMA cache_size=59;
12628cf6c554Sdanielk1977      PRAGMA cache_size;
12638cf6c554Sdanielk1977    }
12648cf6c554Sdanielk1977  } {59}
12658cf6c554Sdanielk1977  do_test pragma-15.2 {
12668cf6c554Sdanielk1977    sqlite3 db2 test.db
12678cf6c554Sdanielk1977    execsql {
12688cf6c554Sdanielk1977      CREATE TABLE newtable(a, b, c);
12698cf6c554Sdanielk1977    } db2
12708cf6c554Sdanielk1977    db2 close
12718cf6c554Sdanielk1977  } {}
12728cf6c554Sdanielk1977  do_test pragma-15.3 {
12738cf6c554Sdanielk1977    # Evaluating this statement will cause the schema to be reloaded (because
12748cf6c554Sdanielk1977    # the schema was changed by another connection in pragma-15.2). At one
12758cf6c554Sdanielk1977    # point there was a bug that reset the cache_size to its default value
12768cf6c554Sdanielk1977    # when this happened.
12778cf6c554Sdanielk1977    execsql { SELECT * FROM sqlite_master }
12788cf6c554Sdanielk1977    execsql { PRAGMA cache_size }
12798cf6c554Sdanielk1977  } {59}
12808cf6c554Sdanielk1977}
12818cf6c554Sdanielk1977
12825558a8a6Sdanielk1977# Reset the sqlite3_temp_directory variable for the next run of tests:
12835558a8a6Sdanielk1977sqlite3 dbX :memory:
12845558a8a6Sdanielk1977dbX eval {PRAGMA temp_store_directory = ""}
12855558a8a6Sdanielk1977dbX close
12865558a8a6Sdanielk1977
1287*838cce43Sdanielk1977ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
1288aebf413dSaswift  set sqlite_hostid_num 1
1289aebf413dSaswift
1290aebf413dSaswift  set using_proxy 0
1291aebf413dSaswift  foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
1292aebf413dSaswift    set using_proxy $value
1293aebf413dSaswift  }
1294aebf413dSaswift
1295aebf413dSaswift  # Test the lock_proxy_file pragmas.
1296aebf413dSaswift  #
1297aebf413dSaswift  db close
1298aebf413dSaswift  set env(SQLITE_FORCE_PROXY_LOCKING) "0"
1299aebf413dSaswift
1300aebf413dSaswift  sqlite3 db test.db
1301aebf413dSaswift  do_test pragma-16.1 {
1302aebf413dSaswift    execsql {
1303aebf413dSaswift      PRAGMA lock_proxy_file="mylittleproxy";
1304aebf413dSaswift      select * from sqlite_master;
1305aebf413dSaswift    }
1306aebf413dSaswift    execsql {
1307aebf413dSaswift      PRAGMA lock_proxy_file;
1308aebf413dSaswift    }
1309aebf413dSaswift  } {mylittleproxy}
1310aebf413dSaswift
1311aebf413dSaswift  do_test pragma-16.2 {
1312aebf413dSaswift    sqlite3 db2 test.db
1313aebf413dSaswift    execsql {
1314aebf413dSaswift      PRAGMA lock_proxy_file="mylittleproxy";
1315aebf413dSaswift    } db2
1316aebf413dSaswift  } {}
1317aebf413dSaswift
1318aebf413dSaswift  db2 close
1319aebf413dSaswift  do_test pragma-16.2.1 {
1320aebf413dSaswift    sqlite3 db2 test.db
1321aebf413dSaswift    execsql {
1322aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1323aebf413dSaswift      select * from sqlite_master;
1324aebf413dSaswift    } db2
1325aebf413dSaswift    execsql {
1326aebf413dSaswift      PRAGMA lock_proxy_file;
1327aebf413dSaswift    } db2
1328aebf413dSaswift  } {mylittleproxy}
1329aebf413dSaswift
1330aebf413dSaswift  db2 close
1331aebf413dSaswift  do_test pragma-16.3 {
1332aebf413dSaswift    sqlite3 db2 test.db
1333aebf413dSaswift    execsql {
1334aebf413dSaswift      PRAGMA lock_proxy_file="myotherproxy";
1335aebf413dSaswift    } db2
1336aebf413dSaswift    catchsql {
1337aebf413dSaswift      select * from sqlite_master;
1338aebf413dSaswift    } db2
1339aebf413dSaswift  } {1 {database is locked}}
1340aebf413dSaswift
1341aebf413dSaswift  do_test pragma-16.4 {
1342aebf413dSaswift    db2 close
1343aebf413dSaswift    db close
1344aebf413dSaswift    sqlite3 db2 test.db
1345aebf413dSaswift    execsql {
1346aebf413dSaswift      PRAGMA lock_proxy_file="myoriginalproxy";
1347aebf413dSaswift      PRAGMA lock_proxy_file="myotherproxy";
1348aebf413dSaswift      PRAGMA lock_proxy_file;
1349aebf413dSaswift    } db2
1350aebf413dSaswift  } {myotherproxy}
1351aebf413dSaswift
1352aebf413dSaswift  db2 close
1353aebf413dSaswift  set env(SQLITE_FORCE_PROXY_LOCKING) "1"
1354aebf413dSaswift  do_test pragma-16.5 {
1355aebf413dSaswift    sqlite3 db2 test.db
1356aebf413dSaswift    execsql {
1357aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1358aebf413dSaswift      PRAGMA lock_proxy_file;
1359aebf413dSaswift    } db2
1360aebf413dSaswift  } {myotherproxy}
1361aebf413dSaswift
1362aebf413dSaswift  do_test pragma-16.6 {
1363aebf413dSaswift    db2 close
1364aebf413dSaswift    sqlite3 db2 test2.db
1365aebf413dSaswift    set lockpath [execsql {
1366aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1367aebf413dSaswift      PRAGMA lock_proxy_file;
1368aebf413dSaswift    } db2]
1369aebf413dSaswift    string match "*test2.db:auto:" $lockpath
1370aebf413dSaswift  } {1}
1371aebf413dSaswift
1372aebf413dSaswift  set sqlite_hostid_num 2
1373aebf413dSaswift  do_test pragma-16.7 {
1374aebf413dSaswift    sqlite3 db test2.db
1375aebf413dSaswift    execsql {
1376aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1377aebf413dSaswift    }
1378aebf413dSaswift    catchsql {
1379aebf413dSaswift      select * from sqlite_master;
1380aebf413dSaswift    }
1381aebf413dSaswift  } {1 {database is locked}}
1382aebf413dSaswift  db close
1383aebf413dSaswift
1384aebf413dSaswift  do_test pragma-16.8 {
1385aebf413dSaswift    sqlite3 db test2.db
1386aebf413dSaswift    catchsql {
1387aebf413dSaswift      select * from sqlite_master;
1388aebf413dSaswift    }
1389aebf413dSaswift  } {1 {database is locked}}
1390aebf413dSaswift
1391aebf413dSaswift  db2 close
1392aebf413dSaswift  do_test pragma-16.8.1 {
1393aebf413dSaswift    execsql {
1394aebf413dSaswift      PRAGMA lock_proxy_file="yetanotherproxy";
1395aebf413dSaswift      PRAGMA lock_proxy_file;
1396aebf413dSaswift    }
1397aebf413dSaswift  } {yetanotherproxy}
1398aebf413dSaswift  do_test pragma-16.8.2 {
1399aebf413dSaswift    execsql {
1400aebf413dSaswift      create table mine(x);
1401aebf413dSaswift    }
1402aebf413dSaswift  } {}
1403aebf413dSaswift
1404aebf413dSaswift  db close
1405aebf413dSaswift  do_test pragma-16.9 {
1406aebf413dSaswift    sqlite3 db proxytest.db
1407aebf413dSaswift    set lockpath2 [execsql {
1408aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1409aebf413dSaswift      PRAGMA lock_proxy_file;
1410aebf413dSaswift    } db]
1411aebf413dSaswift    string match "*proxytest.db:auto:" $lockpath2
1412aebf413dSaswift  } {1}
1413aebf413dSaswift
1414aebf413dSaswift  set env(SQLITE_FORCE_PROXY_LOCKING) $using_proxy
1415aebf413dSaswift  set sqlite_hostid_num 0
1416aebf413dSaswift}
1417d2cb50b7Sdrh
1418d2cb50b7Sdrh# Parsing of auto_vacuum settings.
1419d2cb50b7Sdrh#
1420d2cb50b7Sdrhforeach {autovac_setting val} {
1421d2cb50b7Sdrh  0 0
1422d2cb50b7Sdrh  1 1
1423d2cb50b7Sdrh  2 2
1424d2cb50b7Sdrh  3 0
1425d2cb50b7Sdrh  -1 0
1426d2cb50b7Sdrh  none 0
1427d2cb50b7Sdrh  NONE 0
1428d2cb50b7Sdrh  NoNe 0
1429d2cb50b7Sdrh  full 1
1430d2cb50b7Sdrh  FULL 1
1431d2cb50b7Sdrh  incremental 2
1432d2cb50b7Sdrh  INCREMENTAL 2
1433d2cb50b7Sdrh  -1234 0
1434d2cb50b7Sdrh  1234 0
1435d2cb50b7Sdrh} {
1436d2cb50b7Sdrh  do_test pragma-17.1.$autovac_setting {
1437d2cb50b7Sdrh    catch {db close}
1438d2cb50b7Sdrh    sqlite3 db :memory:
1439d2cb50b7Sdrh    execsql "
1440d2cb50b7Sdrh      PRAGMA auto_vacuum=$::autovac_setting;
1441d2cb50b7Sdrh      PRAGMA auto_vacuum;
1442d2cb50b7Sdrh    "
1443d2cb50b7Sdrh  } $val
1444d2cb50b7Sdrh}
1445d2cb50b7Sdrh
1446d2cb50b7Sdrh# Parsing of temp_store settings.
1447d2cb50b7Sdrh#
1448d2cb50b7Sdrhforeach {temp_setting val} {
1449d2cb50b7Sdrh  0 0
1450d2cb50b7Sdrh  1 1
1451d2cb50b7Sdrh  2 2
1452d2cb50b7Sdrh  3 0
1453d2cb50b7Sdrh  -1 0
1454d2cb50b7Sdrh  file 1
1455d2cb50b7Sdrh  FILE 1
1456d2cb50b7Sdrh  fIlE 1
1457d2cb50b7Sdrh  memory 2
1458d2cb50b7Sdrh  MEMORY 2
1459d2cb50b7Sdrh  MeMoRy 2
1460d2cb50b7Sdrh} {
1461d2cb50b7Sdrh  do_test pragma-18.1.$temp_setting {
1462d2cb50b7Sdrh    catch {db close}
1463d2cb50b7Sdrh    sqlite3 db :memory:
1464d2cb50b7Sdrh    execsql "
1465d2cb50b7Sdrh      PRAGMA temp_store=$::temp_setting;
1466d2cb50b7Sdrh      PRAGMA temp_store=$::temp_setting;
1467d2cb50b7Sdrh      PRAGMA temp_store;
1468d2cb50b7Sdrh    "
1469d2cb50b7Sdrh  } $val
1470d2cb50b7Sdrh}
1471d2cb50b7Sdrh
1472cd61c281Sdrhfinish_test
1473