xref: /sqlite-3.40.0/test/pragma.test (revision dd3cd977)
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#
15838cce43Sdanielk1977# $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
320*dd3cd977Sdrh      hexio_write testerr.db 28 00000000
3211dcdbc06Sdrh      execsql {REINDEX t2}
3221dcdbc06Sdrh      execsql {PRAGMA integrity_check}
3231dcdbc06Sdrh    } {ok}
32441c58b78Sdanielk1977    do_test pragma-3.8.1 {
32541c58b78Sdanielk1977      execsql {PRAGMA quick_check}
32641c58b78Sdanielk1977    } {ok}
3271dcdbc06Sdrh    do_test pragma-3.9 {
3281dcdbc06Sdrh      execsql {
3291dcdbc06Sdrh        ATTACH 'testerr.db' AS t2;
3301dcdbc06Sdrh        PRAGMA integrity_check
3311dcdbc06Sdrh      }
3321dcdbc06Sdrh    } {{*** in database t2 ***
3331dcdbc06SdrhPage 4 is never used
3341dcdbc06SdrhPage 5 is never used
335bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
3361dcdbc06Sdrh    do_test pragma-3.10 {
3371dcdbc06Sdrh      execsql {
3381dcdbc06Sdrh        PRAGMA integrity_check=1
3391dcdbc06Sdrh      }
3401dcdbc06Sdrh    } {{*** in database t2 ***
3411dcdbc06SdrhPage 4 is never used}}
3421dcdbc06Sdrh    do_test pragma-3.11 {
3431dcdbc06Sdrh      execsql {
3441dcdbc06Sdrh        PRAGMA integrity_check=5
3451dcdbc06Sdrh      }
3461dcdbc06Sdrh    } {{*** in database t2 ***
3471dcdbc06SdrhPage 4 is never used
3481dcdbc06SdrhPage 5 is never used
349bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2}}
3501dcdbc06Sdrh    do_test pragma-3.12 {
3511dcdbc06Sdrh      execsql {
3521dcdbc06Sdrh        PRAGMA integrity_check=4
3531dcdbc06Sdrh      }
3541dcdbc06Sdrh    } {{*** in database t2 ***
3551dcdbc06SdrhPage 4 is never used
3561dcdbc06SdrhPage 5 is never used
3571dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
3581dcdbc06Sdrh    do_test pragma-3.13 {
3591dcdbc06Sdrh      execsql {
3601dcdbc06Sdrh        PRAGMA integrity_check=3
3611dcdbc06Sdrh      }
3621dcdbc06Sdrh    } {{*** in database t2 ***
3631dcdbc06SdrhPage 4 is never used
3641dcdbc06SdrhPage 5 is never used
3651dcdbc06SdrhPage 6 is never used}}
3661dcdbc06Sdrh    do_test pragma-3.14 {
3671dcdbc06Sdrh      execsql {
3681dcdbc06Sdrh        PRAGMA integrity_check(2)
3691dcdbc06Sdrh      }
3701dcdbc06Sdrh    } {{*** in database t2 ***
3711dcdbc06SdrhPage 4 is never used
3721dcdbc06SdrhPage 5 is never used}}
3731dcdbc06Sdrh    do_test pragma-3.15 {
3741dcdbc06Sdrh      execsql {
3751dcdbc06Sdrh        ATTACH 'testerr.db' AS t3;
3761dcdbc06Sdrh        PRAGMA integrity_check
3771dcdbc06Sdrh      }
3781dcdbc06Sdrh    } {{*** in database t2 ***
3791dcdbc06SdrhPage 4 is never used
3801dcdbc06SdrhPage 5 is never used
381bb8a279eSdrhPage 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 ***
3821dcdbc06SdrhPage 4 is never used
3831dcdbc06SdrhPage 5 is never used
384bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
3851dcdbc06Sdrh    do_test pragma-3.16 {
3861dcdbc06Sdrh      execsql {
387bb8a279eSdrh        PRAGMA integrity_check(10)
3881dcdbc06Sdrh      }
3891dcdbc06Sdrh    } {{*** in database t2 ***
3901dcdbc06SdrhPage 4 is never used
3911dcdbc06SdrhPage 5 is never used
392bb8a279eSdrhPage 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 ***
3931dcdbc06SdrhPage 4 is never used
3941dcdbc06SdrhPage 5 is never used
3951dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
3961dcdbc06Sdrh    do_test pragma-3.17 {
3971dcdbc06Sdrh      execsql {
398bb8a279eSdrh        PRAGMA integrity_check=8
3991dcdbc06Sdrh      }
4001dcdbc06Sdrh    } {{*** in database t2 ***
4011dcdbc06SdrhPage 4 is never used
4021dcdbc06SdrhPage 5 is never used
403bb8a279eSdrhPage 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 ***
4041dcdbc06SdrhPage 4 is never used
4051dcdbc06SdrhPage 5 is never used}}
4061dcdbc06Sdrh    do_test pragma-3.18 {
4071dcdbc06Sdrh      execsql {
4081dcdbc06Sdrh        PRAGMA integrity_check=4
4091dcdbc06Sdrh      }
4101dcdbc06Sdrh    } {{*** in database t2 ***
4111dcdbc06SdrhPage 4 is never used
4121dcdbc06SdrhPage 5 is never used
4131dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
4141dcdbc06Sdrh  }
415d2cb50b7Sdrh  do_test pragma-3.19 {
416d2cb50b7Sdrh    catch {db close}
417d2cb50b7Sdrh    file delete -force test.db test.db-journal
418d2cb50b7Sdrh    sqlite3 db test.db
419d2cb50b7Sdrh    db eval {PRAGMA integrity_check}
420d2cb50b7Sdrh  } {ok}
4215a8f9374Sdanielk1977}
422d2cb50b7Sdrh#exit
42391cf71b0Sdanielk1977
42491cf71b0Sdanielk1977# Test modifying the cache_size of an attached database.
4255a8f9374Sdanielk1977ifcapable pager_pragmas&&attach {
42691cf71b0Sdanielk1977do_test pragma-4.1 {
42791cf71b0Sdanielk1977  execsql {
4281e9daa6aSdrh    ATTACH 'test2.db' AS aux;
42991cf71b0Sdanielk1977    pragma aux.cache_size;
43091cf71b0Sdanielk1977    pragma aux.default_cache_size;
43191cf71b0Sdanielk1977  }
4321e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4331bdd9b57Sdrhdo_test pragma-4.2 {
4341bdd9b57Sdrh  execsql {
43591cf71b0Sdanielk1977    pragma aux.cache_size = 50;
43691cf71b0Sdanielk1977    pragma aux.cache_size;
43791cf71b0Sdanielk1977    pragma aux.default_cache_size;
4381bdd9b57Sdrh  }
4391e9daa6aSdrh} [list 50 $DFLT_CACHE_SZ]
4401bdd9b57Sdrhdo_test pragma-4.3 {
4411bdd9b57Sdrh  execsql {
44291cf71b0Sdanielk1977    pragma aux.default_cache_size = 456;
44391cf71b0Sdanielk1977    pragma aux.cache_size;
44491cf71b0Sdanielk1977    pragma aux.default_cache_size;
4451bdd9b57Sdrh  }
44691cf71b0Sdanielk1977} {456 456}
4471bdd9b57Sdrhdo_test pragma-4.4 {
4481bdd9b57Sdrh  execsql {
44991cf71b0Sdanielk1977    pragma cache_size;
45091cf71b0Sdanielk1977    pragma default_cache_size;
4511bdd9b57Sdrh  }
4521e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4531bdd9b57Sdrhdo_test pragma-4.5 {
4541bdd9b57Sdrh  execsql {
45591cf71b0Sdanielk1977    DETACH aux;
45691cf71b0Sdanielk1977    ATTACH 'test3.db' AS aux;
45791cf71b0Sdanielk1977    pragma aux.cache_size;
45891cf71b0Sdanielk1977    pragma aux.default_cache_size;
4591bdd9b57Sdrh  }
4601e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4611bdd9b57Sdrhdo_test pragma-4.6 {
4621bdd9b57Sdrh  execsql {
46391cf71b0Sdanielk1977    DETACH aux;
46491cf71b0Sdanielk1977    ATTACH 'test2.db' AS aux;
46591cf71b0Sdanielk1977    pragma aux.cache_size;
46691cf71b0Sdanielk1977    pragma aux.default_cache_size;
4671bdd9b57Sdrh  }
46891cf71b0Sdanielk1977} {456 456}
469c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
4701bdd9b57Sdrh
47191cf71b0Sdanielk1977# Test that modifying the sync-level in the middle of a transaction is
47291cf71b0Sdanielk1977# disallowed.
473c7b4a44cSdanielk1977ifcapable pager_pragmas {
47491cf71b0Sdanielk1977do_test pragma-5.0 {
4751bdd9b57Sdrh  execsql {
47691cf71b0Sdanielk1977    pragma synchronous;
4771bdd9b57Sdrh  }
47891cf71b0Sdanielk1977} {2}
47991cf71b0Sdanielk1977do_test pragma-5.1 {
4801bdd9b57Sdrh  catchsql {
4811bdd9b57Sdrh    BEGIN;
48291cf71b0Sdanielk1977    pragma synchronous = OFF;
4831bdd9b57Sdrh  }
48491cf71b0Sdanielk1977} {1 {Safety level may not be changed inside a transaction}}
48591cf71b0Sdanielk1977do_test pragma-5.2 {
48691cf71b0Sdanielk1977  execsql {
48791cf71b0Sdanielk1977    pragma synchronous;
48891cf71b0Sdanielk1977  }
48991cf71b0Sdanielk1977} {2}
4905260f7e9Sdrhcatchsql {COMMIT;}
491c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
4925260f7e9Sdrh
4935260f7e9Sdrh# Test schema-query pragmas
4945260f7e9Sdrh#
49527188fb5Sdanielk1977ifcapable schema_pragmas {
4965a8f9374Sdanielk1977ifcapable tempdb&&attach {
4975260f7e9Sdrh  do_test pragma-6.1 {
498956bc92cSdrh    set res {}
49940e016e4Sdrh    execsql {SELECT * FROM sqlite_temp_master}
5005260f7e9Sdrh    foreach {idx name file} [execsql {pragma database_list}] {
5015260f7e9Sdrh      lappend res $idx $name
5025260f7e9Sdrh    }
5035260f7e9Sdrh    set res
504a71aa001Sdrh  } {0 main 1 temp 2 aux}
50553c0f748Sdanielk1977}
5065260f7e9Sdrhdo_test pragma-6.2 {
5075260f7e9Sdrh  execsql {
508d2cb50b7Sdrh    CREATE TABLE t2(a,b,c);
5095260f7e9Sdrh    pragma table_info(t2)
5105260f7e9Sdrh  }
511bfa8b102Sdrh} {0 a {} 0 {} 0 1 b {} 0 {} 0 2 c {} 0 {} 0}
512d2cb50b7Sdrhdo_test pragma-6.2.1 {
513d2cb50b7Sdrh  execsql {
514d2cb50b7Sdrh    pragma table_info;
515d2cb50b7Sdrh  }
516d2cb50b7Sdrh} {}
517736c7d4bSdrhdb nullvalue <<NULL>>
518417ec638Sdrhdo_test pragma-6.2.2 {
519417ec638Sdrh  execsql {
520736c7d4bSdrh    CREATE TABLE t5(
521736c7d4bSdrh      a TEXT DEFAULT CURRENT_TIMESTAMP,
522736c7d4bSdrh      b DEFAULT (5+3),
523736c7d4bSdrh      c TEXT,
524736c7d4bSdrh      d INTEGER DEFAULT NULL,
525736c7d4bSdrh      e TEXT DEFAULT ''
526736c7d4bSdrh    );
527417ec638Sdrh    PRAGMA table_info(t5);
528417ec638Sdrh  }
529736c7d4bSdrh} {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}
530736c7d4bSdrhdb nullvalue {}
5316bf89570Sdrhifcapable {foreignkey} {
532d2cb50b7Sdrh  do_test pragma-6.3.1 {
5335260f7e9Sdrh    execsql {
5345260f7e9Sdrh      CREATE TABLE t3(a int references t2(b), b UNIQUE);
5355260f7e9Sdrh      pragma foreign_key_list(t3);
5365260f7e9Sdrh    }
5371da40a38Sdan  } {0 0 t2 a b {NO ACTION} {NO ACTION} NONE}
538d2cb50b7Sdrh  do_test pragma-6.3.2 {
539d2cb50b7Sdrh    execsql {
540d2cb50b7Sdrh      pragma foreign_key_list;
541d2cb50b7Sdrh    }
542d2cb50b7Sdrh  } {}
543d2cb50b7Sdrh  do_test pragma-6.3.3 {
544d2cb50b7Sdrh    execsql {
545d2cb50b7Sdrh      pragma foreign_key_list(t3_bogus);
546d2cb50b7Sdrh    }
547d2cb50b7Sdrh  } {}
548d2cb50b7Sdrh  do_test pragma-6.3.4 {
549d2cb50b7Sdrh    execsql {
550d2cb50b7Sdrh      pragma foreign_key_list(t5);
551d2cb50b7Sdrh    }
552d2cb50b7Sdrh  } {}
5535260f7e9Sdrh  do_test pragma-6.4 {
5545260f7e9Sdrh    execsql {
5555260f7e9Sdrh      pragma index_list(t3);
5565260f7e9Sdrh    }
5575260f7e9Sdrh  } {0 sqlite_autoindex_t3_1 1}
5586bf89570Sdrh}
5596bf89570Sdrhifcapable {!foreignkey} {
5606bf89570Sdrh  execsql {CREATE TABLE t3(a,b UNIQUE)}
5616bf89570Sdrh}
562d2cb50b7Sdrhdo_test pragma-6.5.1 {
5635260f7e9Sdrh  execsql {
5645260f7e9Sdrh    CREATE INDEX t3i1 ON t3(a,b);
5655260f7e9Sdrh    pragma index_info(t3i1);
5665260f7e9Sdrh  }
5675260f7e9Sdrh} {0 0 a 1 1 b}
568d2cb50b7Sdrhdo_test pragma-6.5.2 {
569d2cb50b7Sdrh  execsql {
570d2cb50b7Sdrh    pragma index_info(t3i1_bogus);
571d2cb50b7Sdrh  }
572d2cb50b7Sdrh} {}
573260d8a6aSdanielk1977
574260d8a6aSdanielk1977ifcapable tempdb {
575260d8a6aSdanielk1977  # Test for ticket #3320. When a temp table of the same name exists, make
576260d8a6aSdanielk1977  # sure the schema of the main table can still be queried using
577260d8a6aSdanielk1977  # "pragma table_info":
578260d8a6aSdanielk1977  do_test pragma-6.6.1 {
579260d8a6aSdanielk1977    execsql {
580260d8a6aSdanielk1977      CREATE TABLE trial(col_main);
581260d8a6aSdanielk1977      CREATE TEMP TABLE trial(col_temp);
582260d8a6aSdanielk1977    }
583260d8a6aSdanielk1977  } {}
584260d8a6aSdanielk1977  do_test pragma-6.6.2 {
585260d8a6aSdanielk1977    execsql {
586260d8a6aSdanielk1977      PRAGMA table_info(trial);
587260d8a6aSdanielk1977    }
588260d8a6aSdanielk1977  } {0 col_temp {} 0 {} 0}
589260d8a6aSdanielk1977  do_test pragma-6.6.3 {
590260d8a6aSdanielk1977    execsql {
591260d8a6aSdanielk1977      PRAGMA temp.table_info(trial);
592260d8a6aSdanielk1977    }
593260d8a6aSdanielk1977  } {0 col_temp {} 0 {} 0}
594260d8a6aSdanielk1977  do_test pragma-6.6.4 {
595260d8a6aSdanielk1977    execsql {
596260d8a6aSdanielk1977      PRAGMA main.table_info(trial);
597260d8a6aSdanielk1977    }
598260d8a6aSdanielk1977  } {0 col_main {} 0 {} 0}
599260d8a6aSdanielk1977}
600f96a3778Sdanielk1977
601f96a3778Sdanielk1977do_test pragma-6.7 {
602f96a3778Sdanielk1977  execsql {
603f96a3778Sdanielk1977    CREATE TABLE test_table(
604f96a3778Sdanielk1977      one INT NOT NULL DEFAULT -1,
605f96a3778Sdanielk1977      two text,
606f96a3778Sdanielk1977      three VARCHAR(45, 65) DEFAULT 'abcde',
607f96a3778Sdanielk1977      four REAL DEFAULT X'abcdef',
608f96a3778Sdanielk1977      five DEFAULT CURRENT_TIME
609f96a3778Sdanielk1977    );
610f96a3778Sdanielk1977    PRAGMA table_info(test_table);
611f96a3778Sdanielk1977  }
612f96a3778Sdanielk1977} [concat \
613f96a3778Sdanielk1977  {0 one INT 1 -1 0} \
614f96a3778Sdanielk1977  {1 two text 0 {} 0} \
615f96a3778Sdanielk1977  {2 three {VARCHAR(45, 65)} 0 'abcde' 0} \
616f96a3778Sdanielk1977  {3 four REAL 0 X'abcdef' 0} \
617f96a3778Sdanielk1977  {4 five {} 0 CURRENT_TIME 0} \
618f96a3778Sdanielk1977]
61927188fb5Sdanielk1977} ;# ifcapable schema_pragmas
6205260f7e9Sdrh# Miscellaneous tests
6215260f7e9Sdrh#
62227188fb5Sdanielk1977ifcapable schema_pragmas {
623d2cb50b7Sdrhdo_test pragma-7.1.1 {
6245260f7e9Sdrh  # Make sure a pragma knows to read the schema if it needs to
6255260f7e9Sdrh  db close
6265260f7e9Sdrh  sqlite3 db test.db
6275260f7e9Sdrh  execsql {
6285260f7e9Sdrh    pragma index_list(t3);
6295260f7e9Sdrh  }
6305260f7e9Sdrh} {0 t3i1 0 1 sqlite_autoindex_t3_1 1}
631d2cb50b7Sdrhdo_test pragma-7.1.2 {
632d2cb50b7Sdrh  execsql {
633d2cb50b7Sdrh    pragma index_list(t3_bogus);
634d2cb50b7Sdrh  }
635d2cb50b7Sdrh} {}
63627188fb5Sdanielk1977} ;# ifcapable schema_pragmas
6376c62608fSdrhifcapable {utf16} {
6385260f7e9Sdrh  do_test pragma-7.2 {
6395260f7e9Sdrh    db close
6405260f7e9Sdrh    sqlite3 db test.db
6415260f7e9Sdrh    catchsql {
6425260f7e9Sdrh      pragma encoding=bogus;
6435260f7e9Sdrh    }
6445260f7e9Sdrh  } {1 {unsupported encoding: bogus}}
6456c62608fSdrh}
64653c0f748Sdanielk1977ifcapable tempdb {
6475260f7e9Sdrh  do_test pragma-7.3 {
6485260f7e9Sdrh    db close
6495260f7e9Sdrh    sqlite3 db test.db
6505260f7e9Sdrh    execsql {
6515260f7e9Sdrh      pragma lock_status;
6525260f7e9Sdrh    }
6535260f7e9Sdrh  } {main unlocked temp closed}
65453c0f748Sdanielk1977} else {
65553c0f748Sdanielk1977  do_test pragma-7.3 {
65653c0f748Sdanielk1977    db close
65753c0f748Sdanielk1977    sqlite3 db test.db
65853c0f748Sdanielk1977    execsql {
65953c0f748Sdanielk1977      pragma lock_status;
66053c0f748Sdanielk1977    }
66153c0f748Sdanielk1977  } {main unlocked}
66253c0f748Sdanielk1977}
6635260f7e9Sdrh
6645260f7e9Sdrh
665dae2495bSdanielk1977#----------------------------------------------------------------------
666b92b70bbSdanielk1977# Test cases pragma-8.* test the "PRAGMA schema_version" and "PRAGMA
667b92b70bbSdanielk1977# user_version" statements.
668dae2495bSdanielk1977#
669b92b70bbSdanielk1977# pragma-8.1: PRAGMA schema_version
670b92b70bbSdanielk1977# pragma-8.2: PRAGMA user_version
671dae2495bSdanielk1977#
672dae2495bSdanielk1977
67311cf9fbcSdanielk1977ifcapable schema_version {
67411cf9fbcSdanielk1977
675b92b70bbSdanielk1977# First check that we can set the schema version and then retrieve the
676dae2495bSdanielk1977# same value.
677dae2495bSdanielk1977do_test pragma-8.1.1 {
678dae2495bSdanielk1977  execsql {
679b92b70bbSdanielk1977    PRAGMA schema_version = 105;
680dae2495bSdanielk1977  }
681dae2495bSdanielk1977} {}
682dae2495bSdanielk1977do_test pragma-8.1.2 {
68325403650Sdrh  execsql2 {
684b92b70bbSdanielk1977    PRAGMA schema_version;
685dae2495bSdanielk1977  }
68625403650Sdrh} {schema_version 105}
687dae2495bSdanielk1977do_test pragma-8.1.3 {
688dae2495bSdanielk1977  execsql {
689b92b70bbSdanielk1977    PRAGMA schema_version = 106;
690dae2495bSdanielk1977  }
691dae2495bSdanielk1977} {}
692dae2495bSdanielk1977do_test pragma-8.1.4 {
693dae2495bSdanielk1977  execsql {
694b92b70bbSdanielk1977    PRAGMA schema_version;
695dae2495bSdanielk1977  }
696dae2495bSdanielk1977} 106
697dae2495bSdanielk1977
698b92b70bbSdanielk1977# Check that creating a table modifies the schema-version (this is really
699b92b70bbSdanielk1977# to verify that the value being read is in fact the schema version).
700dae2495bSdanielk1977do_test pragma-8.1.5 {
701dae2495bSdanielk1977  execsql {
702dae2495bSdanielk1977    CREATE TABLE t4(a, b, c);
703dae2495bSdanielk1977    INSERT INTO t4 VALUES(1, 2, 3);
704dae2495bSdanielk1977    SELECT * FROM t4;
705dae2495bSdanielk1977  }
706dae2495bSdanielk1977} {1 2 3}
707dae2495bSdanielk1977do_test pragma-8.1.6 {
708dae2495bSdanielk1977  execsql {
709b92b70bbSdanielk1977    PRAGMA schema_version;
710dae2495bSdanielk1977  }
711dae2495bSdanielk1977} 107
712dae2495bSdanielk1977
713dae2495bSdanielk1977# Now open a second connection to the database. Ensure that changing the
714b92b70bbSdanielk1977# schema-version using the first connection forces the second connection
715dae2495bSdanielk1977# to reload the schema. This has to be done using the C-API test functions,
716dae2495bSdanielk1977# because the TCL API accounts for SCHEMA_ERROR and retries the query.
717dae2495bSdanielk1977do_test pragma-8.1.7 {
718dddca286Sdrh  sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
719dae2495bSdanielk1977  execsql {
720dae2495bSdanielk1977    SELECT * FROM t4;
721dae2495bSdanielk1977  } db2
722dae2495bSdanielk1977} {1 2 3}
723dae2495bSdanielk1977do_test pragma-8.1.8 {
724dae2495bSdanielk1977  execsql {
725b92b70bbSdanielk1977    PRAGMA schema_version = 108;
726dae2495bSdanielk1977  }
727dae2495bSdanielk1977} {}
728dae2495bSdanielk1977do_test pragma-8.1.9 {
729dae2495bSdanielk1977  set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY]
730dae2495bSdanielk1977  sqlite3_step $::STMT
731dae2495bSdanielk1977} SQLITE_ERROR
732dae2495bSdanielk1977do_test pragma-8.1.10 {
733dae2495bSdanielk1977  sqlite3_finalize $::STMT
734dae2495bSdanielk1977} SQLITE_SCHEMA
735dae2495bSdanielk1977
736b92b70bbSdanielk1977# Make sure the schema-version can be manipulated in an attached database.
737dae2495bSdanielk1977file delete -force test2.db
738dae2495bSdanielk1977file delete -force test2.db-journal
7395a8f9374Sdanielk1977ifcapable attach {
740dae2495bSdanielk1977  do_test pragma-8.1.11 {
741dae2495bSdanielk1977    execsql {
742dae2495bSdanielk1977      ATTACH 'test2.db' AS aux;
743dae2495bSdanielk1977      CREATE TABLE aux.t1(a, b, c);
744b92b70bbSdanielk1977      PRAGMA aux.schema_version = 205;
745dae2495bSdanielk1977    }
746dae2495bSdanielk1977  } {}
747dae2495bSdanielk1977  do_test pragma-8.1.12 {
748dae2495bSdanielk1977    execsql {
749b92b70bbSdanielk1977      PRAGMA aux.schema_version;
750dae2495bSdanielk1977    }
751dae2495bSdanielk1977  } 205
7525a8f9374Sdanielk1977}
753dae2495bSdanielk1977do_test pragma-8.1.13 {
754dae2495bSdanielk1977  execsql {
755b92b70bbSdanielk1977    PRAGMA schema_version;
756dae2495bSdanielk1977  }
757dae2495bSdanielk1977} 108
758dae2495bSdanielk1977
759b92b70bbSdanielk1977# And check that modifying the schema-version in an attached database
760dae2495bSdanielk1977# forces the second connection to reload the schema.
7615a8f9374Sdanielk1977ifcapable attach {
762dae2495bSdanielk1977  do_test pragma-8.1.14 {
763dddca286Sdrh    sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
764dae2495bSdanielk1977    execsql {
765dae2495bSdanielk1977      ATTACH 'test2.db' AS aux;
766dae2495bSdanielk1977      SELECT * FROM aux.t1;
767dae2495bSdanielk1977    } db2
768dae2495bSdanielk1977  } {}
769dae2495bSdanielk1977  do_test pragma-8.1.15 {
770dae2495bSdanielk1977    execsql {
771b92b70bbSdanielk1977      PRAGMA aux.schema_version = 206;
772dae2495bSdanielk1977    }
773dae2495bSdanielk1977  } {}
774dae2495bSdanielk1977  do_test pragma-8.1.16 {
775dae2495bSdanielk1977    set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY]
776dae2495bSdanielk1977    sqlite3_step $::STMT
777dae2495bSdanielk1977  } SQLITE_ERROR
778dae2495bSdanielk1977  do_test pragma-8.1.17 {
779dae2495bSdanielk1977    sqlite3_finalize $::STMT
780dae2495bSdanielk1977  } SQLITE_SCHEMA
781dae2495bSdanielk1977  do_test pragma-8.1.18 {
782dae2495bSdanielk1977    db2 close
783dae2495bSdanielk1977  } {}
7845a8f9374Sdanielk1977}
785dae2495bSdanielk1977
786b92b70bbSdanielk1977# Now test that the user-version can be read and written (and that we aren't
787b92b70bbSdanielk1977# accidentally manipulating the schema-version instead).
788dae2495bSdanielk1977do_test pragma-8.2.1 {
78925403650Sdrh  execsql2 {
790b92b70bbSdanielk1977    PRAGMA user_version;
791dae2495bSdanielk1977  }
79225403650Sdrh} {user_version 0}
793dae2495bSdanielk1977do_test pragma-8.2.2 {
794dae2495bSdanielk1977  execsql {
795b92b70bbSdanielk1977    PRAGMA user_version = 2;
796dae2495bSdanielk1977  }
797dae2495bSdanielk1977} {}
798802d69a7Sdrhdo_test pragma-8.2.3.1 {
79925403650Sdrh  execsql2 {
800b92b70bbSdanielk1977    PRAGMA user_version;
801dae2495bSdanielk1977  }
80225403650Sdrh} {user_version 2}
803802d69a7Sdrhdo_test pragma-8.2.3.2 {
804802d69a7Sdrh  db close
805802d69a7Sdrh  sqlite3 db test.db
806802d69a7Sdrh  execsql {
807802d69a7Sdrh    PRAGMA user_version;
808802d69a7Sdrh  }
809802d69a7Sdrh} {2}
810802d69a7Sdrhdo_test pragma-8.2.4.1 {
811dae2495bSdanielk1977  execsql {
812b92b70bbSdanielk1977    PRAGMA schema_version;
813dae2495bSdanielk1977  }
814dae2495bSdanielk1977} {108}
815802d69a7Sdrhifcapable vacuum {
816802d69a7Sdrh  do_test pragma-8.2.4.2 {
817802d69a7Sdrh    execsql {
818802d69a7Sdrh      VACUUM;
819802d69a7Sdrh      PRAGMA user_version;
820802d69a7Sdrh    }
821802d69a7Sdrh  } {2}
822802d69a7Sdrh  do_test pragma-8.2.4.3 {
823802d69a7Sdrh    execsql {
824802d69a7Sdrh      PRAGMA schema_version;
825802d69a7Sdrh    }
826802d69a7Sdrh  } {109}
827802d69a7Sdrh}
8285a8f9374Sdanielk1977
8295a8f9374Sdanielk1977ifcapable attach {
830802d69a7Sdrh  db eval {ATTACH 'test2.db' AS aux}
831dae2495bSdanielk1977
832b92b70bbSdanielk1977  # Check that the user-version in the auxilary database can be manipulated (
833dae2495bSdanielk1977  # and that we aren't accidentally manipulating the same in the main db).
834dae2495bSdanielk1977  do_test pragma-8.2.5 {
835dae2495bSdanielk1977    execsql {
836b92b70bbSdanielk1977      PRAGMA aux.user_version;
837dae2495bSdanielk1977    }
838dae2495bSdanielk1977  } {0}
839dae2495bSdanielk1977  do_test pragma-8.2.6 {
840dae2495bSdanielk1977    execsql {
841b92b70bbSdanielk1977      PRAGMA aux.user_version = 3;
842dae2495bSdanielk1977    }
843dae2495bSdanielk1977  } {}
844dae2495bSdanielk1977  do_test pragma-8.2.7 {
845dae2495bSdanielk1977    execsql {
846b92b70bbSdanielk1977      PRAGMA aux.user_version;
847dae2495bSdanielk1977    }
848dae2495bSdanielk1977  } {3}
849dae2495bSdanielk1977  do_test pragma-8.2.8 {
850dae2495bSdanielk1977    execsql {
851b92b70bbSdanielk1977      PRAGMA main.user_version;
852dae2495bSdanielk1977    }
853dae2495bSdanielk1977  } {2}
854dae2495bSdanielk1977
855b92b70bbSdanielk1977  # Now check that a ROLLBACK resets the user-version if it has been modified
856dae2495bSdanielk1977  # within a transaction.
857dae2495bSdanielk1977  do_test pragma-8.2.9 {
858dae2495bSdanielk1977    execsql {
859dae2495bSdanielk1977      BEGIN;
860b92b70bbSdanielk1977      PRAGMA aux.user_version = 10;
861b92b70bbSdanielk1977      PRAGMA user_version = 11;
862dae2495bSdanielk1977    }
863dae2495bSdanielk1977  } {}
864dae2495bSdanielk1977  do_test pragma-8.2.10 {
865dae2495bSdanielk1977    execsql {
866b92b70bbSdanielk1977      PRAGMA aux.user_version;
867dae2495bSdanielk1977    }
868dae2495bSdanielk1977  } {10}
869dae2495bSdanielk1977  do_test pragma-8.2.11 {
870dae2495bSdanielk1977    execsql {
871b92b70bbSdanielk1977      PRAGMA main.user_version;
872dae2495bSdanielk1977    }
873dae2495bSdanielk1977  } {11}
874dae2495bSdanielk1977  do_test pragma-8.2.12 {
875dae2495bSdanielk1977    execsql {
876dae2495bSdanielk1977      ROLLBACK;
877b92b70bbSdanielk1977      PRAGMA aux.user_version;
878dae2495bSdanielk1977    }
879dae2495bSdanielk1977  } {3}
880dae2495bSdanielk1977  do_test pragma-8.2.13 {
881dae2495bSdanielk1977    execsql {
882b92b70bbSdanielk1977      PRAGMA main.user_version;
883dae2495bSdanielk1977    }
884dae2495bSdanielk1977  } {2}
8855a8f9374Sdanielk1977}
886dae2495bSdanielk1977
887b92b70bbSdanielk1977# Try a negative value for the user-version
888dae2495bSdanielk1977do_test pragma-8.2.14 {
889dae2495bSdanielk1977  execsql {
890b92b70bbSdanielk1977    PRAGMA user_version = -450;
891dae2495bSdanielk1977  }
892dae2495bSdanielk1977} {}
893dae2495bSdanielk1977do_test pragma-8.2.15 {
894dae2495bSdanielk1977  execsql {
895b92b70bbSdanielk1977    PRAGMA user_version;
896dae2495bSdanielk1977  }
897dae2495bSdanielk1977} {-450}
898d9c847dcSdanielk1977} ; # ifcapable schema_version
899d9c847dcSdanielk1977
900d19744f3Sdrh# Check to see if TEMP_STORE is memory or disk.  Return strings
901d19744f3Sdrh# "memory" or "disk" as appropriate.
902d19744f3Sdrh#
903d19744f3Sdrhproc check_temp_store {} {
904d19744f3Sdrh  db eval {CREATE TEMP TABLE IF NOT EXISTS a(b)}
905d19744f3Sdrh  db eval {PRAGMA database_list} {
906d19744f3Sdrh    if {$name=="temp"} {
90717b90b53Sdanielk1977      set bt [btree_from_db db 1]
90817b90b53Sdanielk1977      if {[btree_ismemdb $bt]} {
909d19744f3Sdrh        return "memory"
910d19744f3Sdrh      }
91117b90b53Sdanielk1977      return "disk"
912d19744f3Sdrh    }
913d19744f3Sdrh  }
914d19744f3Sdrh  return "unknown"
915d19744f3Sdrh}
916d19744f3Sdrh
9179a09a3caStpoindex
9189a09a3caStpoindex# Test temp_store and temp_store_directory pragmas
9199a09a3caStpoindex#
920268283bcSdrhifcapable pager_pragmas {
9219a09a3caStpoindexdo_test pragma-9.1 {
9229a09a3caStpoindex  db close
9239a09a3caStpoindex  sqlite3 db test.db
9249a09a3caStpoindex  execsql {
9259a09a3caStpoindex    PRAGMA temp_store;
9269a09a3caStpoindex  }
9279a09a3caStpoindex} {0}
928d19744f3Sdrhif {$TEMP_STORE<=1} {
929d19744f3Sdrh  do_test pragma-9.1.1 {
930d19744f3Sdrh    check_temp_store
931d19744f3Sdrh  } {disk}
932d19744f3Sdrh} else {
933d19744f3Sdrh  do_test pragma-9.1.1 {
934d19744f3Sdrh    check_temp_store
935d19744f3Sdrh  } {memory}
936d19744f3Sdrh}
937d19744f3Sdrh
9389a09a3caStpoindexdo_test pragma-9.2 {
939d19744f3Sdrh  db close
940d19744f3Sdrh  sqlite3 db test.db
9419a09a3caStpoindex  execsql {
9429a09a3caStpoindex    PRAGMA temp_store=file;
9439a09a3caStpoindex    PRAGMA temp_store;
9449a09a3caStpoindex  }
9459a09a3caStpoindex} {1}
946d19744f3Sdrhif {$TEMP_STORE==3} {
947d19744f3Sdrh  # When TEMP_STORE is 3, always use memory regardless of pragma settings.
948d19744f3Sdrh  do_test pragma-9.2.1 {
949d19744f3Sdrh    check_temp_store
950d19744f3Sdrh  } {memory}
951d19744f3Sdrh} else {
952d19744f3Sdrh  do_test pragma-9.2.1 {
953d19744f3Sdrh    check_temp_store
954d19744f3Sdrh  } {disk}
955d19744f3Sdrh}
956d19744f3Sdrh
9579a09a3caStpoindexdo_test pragma-9.3 {
958d19744f3Sdrh  db close
959d19744f3Sdrh  sqlite3 db test.db
9609a09a3caStpoindex  execsql {
9619a09a3caStpoindex    PRAGMA temp_store=memory;
9629a09a3caStpoindex    PRAGMA temp_store;
9639a09a3caStpoindex  }
9649a09a3caStpoindex} {2}
965d19744f3Sdrhif {$TEMP_STORE==0} {
966d19744f3Sdrh  # When TEMP_STORE is 0, always use the disk regardless of pragma settings.
967d19744f3Sdrh  do_test pragma-9.3.1 {
968d19744f3Sdrh    check_temp_store
969d19744f3Sdrh  } {disk}
970d19744f3Sdrh} else {
971d19744f3Sdrh  do_test pragma-9.3.1 {
972d19744f3Sdrh    check_temp_store
973d19744f3Sdrh  } {memory}
974d19744f3Sdrh}
975d19744f3Sdrh
9769a09a3caStpoindexdo_test pragma-9.4 {
9779a09a3caStpoindex  execsql {
9789a09a3caStpoindex    PRAGMA temp_store_directory;
9799a09a3caStpoindex  }
9809a09a3caStpoindex} {}
98178f82d1eSdrhifcapable wsd {
9829a09a3caStpoindex  do_test pragma-9.5 {
983181ddaa1Sdanielk1977    set pwd [string map {' ''} [file nativename [pwd]]]
984268283bcSdrh    execsql "
985268283bcSdrh      PRAGMA temp_store_directory='$pwd';
9869a09a3caStpoindex    "
9879a09a3caStpoindex  } {}
9889a09a3caStpoindex  do_test pragma-9.6 {
9899a09a3caStpoindex    execsql {
9909a09a3caStpoindex      PRAGMA temp_store_directory;
9919a09a3caStpoindex    }
992181ddaa1Sdanielk1977  } [list [file nativename [pwd]]]
9939a09a3caStpoindex  do_test pragma-9.7 {
994268283bcSdrh    catchsql {
9959a09a3caStpoindex      PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR';
9969a09a3caStpoindex    }
997268283bcSdrh  } {1 {not a writable directory}}
9989a09a3caStpoindex  do_test pragma-9.8 {
9999a09a3caStpoindex    execsql {
10009a09a3caStpoindex      PRAGMA temp_store_directory='';
10019a09a3caStpoindex    }
10029a09a3caStpoindex  } {}
10031e9daa6aSdrh  if {![info exists TEMP_STORE] || $TEMP_STORE<=1} {
100453c0f748Sdanielk1977    ifcapable tempdb {
10059a09a3caStpoindex      do_test pragma-9.9 {
10069a09a3caStpoindex        execsql {
10079a09a3caStpoindex          PRAGMA temp_store_directory;
10089a09a3caStpoindex          PRAGMA temp_store=FILE;
10099a09a3caStpoindex          CREATE TEMP TABLE temp_store_directory_test(a integer);
10109a09a3caStpoindex          INSERT INTO temp_store_directory_test values (2);
10119a09a3caStpoindex          SELECT * FROM temp_store_directory_test;
10129a09a3caStpoindex        }
10139a09a3caStpoindex      } {2}
10149a09a3caStpoindex      do_test pragma-9.10 {
1015268283bcSdrh        catchsql "
1016268283bcSdrh          PRAGMA temp_store_directory='$pwd';
10179a09a3caStpoindex          SELECT * FROM temp_store_directory_test;
10189a09a3caStpoindex        "
1019268283bcSdrh      } {1 {no such table: temp_store_directory_test}}
10201e9daa6aSdrh    }
10211e9daa6aSdrh  }
102278f82d1eSdrh}
102395b289b6Sdanielk1977do_test pragma-9.11 {
102495b289b6Sdanielk1977  execsql {
102595b289b6Sdanielk1977    PRAGMA temp_store = 0;
102695b289b6Sdanielk1977    PRAGMA temp_store;
102795b289b6Sdanielk1977  }
102895b289b6Sdanielk1977} {0}
102995b289b6Sdanielk1977do_test pragma-9.12 {
103095b289b6Sdanielk1977  execsql {
103195b289b6Sdanielk1977    PRAGMA temp_store = 1;
103295b289b6Sdanielk1977    PRAGMA temp_store;
103395b289b6Sdanielk1977  }
103495b289b6Sdanielk1977} {1}
103595b289b6Sdanielk1977do_test pragma-9.13 {
103695b289b6Sdanielk1977  execsql {
103795b289b6Sdanielk1977    PRAGMA temp_store = 2;
103895b289b6Sdanielk1977    PRAGMA temp_store;
103995b289b6Sdanielk1977  }
104095b289b6Sdanielk1977} {2}
104195b289b6Sdanielk1977do_test pragma-9.14 {
104295b289b6Sdanielk1977  execsql {
104395b289b6Sdanielk1977    PRAGMA temp_store = 3;
104495b289b6Sdanielk1977    PRAGMA temp_store;
104595b289b6Sdanielk1977  }
104695b289b6Sdanielk1977} {0}
104795b289b6Sdanielk1977do_test pragma-9.15 {
104895b289b6Sdanielk1977  catchsql {
104995b289b6Sdanielk1977    BEGIN EXCLUSIVE;
105095b289b6Sdanielk1977    CREATE TEMP TABLE temp_table(t);
105195b289b6Sdanielk1977    INSERT INTO temp_table VALUES('valuable data');
105295b289b6Sdanielk1977    PRAGMA temp_store = 1;
105395b289b6Sdanielk1977  }
105495b289b6Sdanielk1977} {1 {temporary storage cannot be changed from within a transaction}}
105595b289b6Sdanielk1977do_test pragma-9.16 {
105695b289b6Sdanielk1977  execsql {
105795b289b6Sdanielk1977    SELECT * FROM temp_table;
105895b289b6Sdanielk1977    COMMIT;
105995b289b6Sdanielk1977  }
106095b289b6Sdanielk1977} {{valuable data}}
1061983e2309Sdanielk1977
1062983e2309Sdanielk1977do_test pragma-9.17 {
1063983e2309Sdanielk1977  execsql {
1064983e2309Sdanielk1977    INSERT INTO temp_table VALUES('valuable data II');
1065983e2309Sdanielk1977    SELECT * FROM temp_table;
1066983e2309Sdanielk1977  }
1067983e2309Sdanielk1977} {{valuable data} {valuable data II}}
1068983e2309Sdanielk1977
1069983e2309Sdanielk1977do_test pragma-9.18 {
1070983e2309Sdanielk1977  set rc [catch {
1071983e2309Sdanielk1977    db eval {SELECT t FROM temp_table} {
1072983e2309Sdanielk1977      execsql {pragma temp_store = 1}
1073983e2309Sdanielk1977    }
1074983e2309Sdanielk1977  } msg]
1075983e2309Sdanielk1977  list $rc $msg
1076983e2309Sdanielk1977} {1 {temporary storage cannot be changed from within a transaction}}
1077983e2309Sdanielk1977
1078268283bcSdrh} ;# ifcapable pager_pragmas
10799a09a3caStpoindex
1080cc6bd383Sdanielk1977ifcapable trigger {
1081cc6bd383Sdanielk1977
1082cc6bd383Sdanielk1977do_test pragma-10.0 {
1083cc6bd383Sdanielk1977  catchsql {
1084cc6bd383Sdanielk1977    DROP TABLE main.t1;
1085cc6bd383Sdanielk1977  }
1086cc6bd383Sdanielk1977  execsql {
1087cc6bd383Sdanielk1977    PRAGMA count_changes = 1;
1088cc6bd383Sdanielk1977
1089cc6bd383Sdanielk1977    CREATE TABLE t1(a PRIMARY KEY);
1090cc6bd383Sdanielk1977    CREATE TABLE t1_mirror(a);
1091cc6bd383Sdanielk1977    CREATE TABLE t1_mirror2(a);
1092cc6bd383Sdanielk1977    CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN
1093cc6bd383Sdanielk1977      INSERT INTO t1_mirror VALUES(new.a);
1094cc6bd383Sdanielk1977    END;
1095cc6bd383Sdanielk1977    CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN
1096cc6bd383Sdanielk1977      INSERT INTO t1_mirror2 VALUES(new.a);
1097cc6bd383Sdanielk1977    END;
1098cc6bd383Sdanielk1977    CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN
1099cc6bd383Sdanielk1977      UPDATE t1_mirror SET a = new.a WHERE a = old.a;
1100cc6bd383Sdanielk1977    END;
1101cc6bd383Sdanielk1977    CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN
1102cc6bd383Sdanielk1977      UPDATE t1_mirror2 SET a = new.a WHERE a = old.a;
1103cc6bd383Sdanielk1977    END;
1104cc6bd383Sdanielk1977    CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN
1105cc6bd383Sdanielk1977      DELETE FROM t1_mirror WHERE a = old.a;
1106cc6bd383Sdanielk1977    END;
1107cc6bd383Sdanielk1977    CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN
1108cc6bd383Sdanielk1977      DELETE FROM t1_mirror2 WHERE a = old.a;
1109cc6bd383Sdanielk1977    END;
1110cc6bd383Sdanielk1977  }
1111cc6bd383Sdanielk1977} {}
1112cc6bd383Sdanielk1977
1113cc6bd383Sdanielk1977do_test pragma-10.1 {
1114cc6bd383Sdanielk1977  execsql {
1115cc6bd383Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,10));
1116cc6bd383Sdanielk1977  }
1117cc6bd383Sdanielk1977} {1}
1118cc6bd383Sdanielk1977do_test pragma-10.2 {
1119cc6bd383Sdanielk1977  execsql {
1120cc6bd383Sdanielk1977    UPDATE t1 SET a = randstr(10,10);
1121cc6bd383Sdanielk1977  }
1122cc6bd383Sdanielk1977} {1}
1123cc6bd383Sdanielk1977do_test pragma-10.3 {
1124cc6bd383Sdanielk1977  execsql {
1125cc6bd383Sdanielk1977    DELETE FROM t1;
1126cc6bd383Sdanielk1977  }
1127cc6bd383Sdanielk1977} {1}
1128cc6bd383Sdanielk1977
1129cc6bd383Sdanielk1977} ;# ifcapable trigger
1130cc6bd383Sdanielk1977
113148af65aeSdanielk1977ifcapable schema_pragmas {
113248af65aeSdanielk1977  do_test pragma-11.1 {
113348af65aeSdanielk1977    execsql2 {
113448af65aeSdanielk1977      pragma collation_list;
113548af65aeSdanielk1977    }
11369b5adfa2Sdrh  } {seq 0 name NOCASE seq 1 name RTRIM seq 2 name BINARY}
113748af65aeSdanielk1977  do_test pragma-11.2 {
113848af65aeSdanielk1977    db collate New_Collation blah...
113948af65aeSdanielk1977    execsql {
114048af65aeSdanielk1977      pragma collation_list;
114148af65aeSdanielk1977    }
11429b5adfa2Sdrh  } {0 New_Collation 1 NOCASE 2 RTRIM 3 BINARY}
114348af65aeSdanielk1977}
114448af65aeSdanielk1977
1145ddfb2f03Sdanielk1977ifcapable schema_pragmas&&tempdb {
1146ddfb2f03Sdanielk1977  do_test pragma-12.1 {
1147ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1148ddfb2f03Sdanielk1977    execsql {
1149ddfb2f03Sdanielk1977      PRAGMA temp.table_info('abc');
1150ddfb2f03Sdanielk1977    } db2
1151ddfb2f03Sdanielk1977  } {}
1152ddfb2f03Sdanielk1977  db2 close
1153ddfb2f03Sdanielk1977
1154ddfb2f03Sdanielk1977  do_test pragma-12.2 {
1155ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1156ddfb2f03Sdanielk1977    execsql {
1157ddfb2f03Sdanielk1977      PRAGMA temp.default_cache_size = 200;
1158ddfb2f03Sdanielk1977      PRAGMA temp.default_cache_size;
1159ddfb2f03Sdanielk1977    } db2
1160ddfb2f03Sdanielk1977  } {200}
1161ddfb2f03Sdanielk1977  db2 close
1162ddfb2f03Sdanielk1977
1163ddfb2f03Sdanielk1977  do_test pragma-12.3 {
1164ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1165ddfb2f03Sdanielk1977    execsql {
1166ddfb2f03Sdanielk1977      PRAGMA temp.cache_size = 400;
1167ddfb2f03Sdanielk1977      PRAGMA temp.cache_size;
1168ddfb2f03Sdanielk1977    } db2
1169ddfb2f03Sdanielk1977  } {400}
1170ddfb2f03Sdanielk1977  db2 close
1171ddfb2f03Sdanielk1977}
1172ddfb2f03Sdanielk1977
11734b2688abSdanielk1977ifcapable bloblit {
11744b2688abSdanielk1977
117505a82983Sdrhdo_test pragma-13.1 {
117605a82983Sdrh  execsql {
117705a82983Sdrh    DROP TABLE IF EXISTS t4;
117805a82983Sdrh    PRAGMA vdbe_trace=on;
117905a82983Sdrh    PRAGMA vdbe_listing=on;
118005a82983Sdrh    PRAGMA sql_trace=on;
118105a82983Sdrh    CREATE TABLE t4(a INTEGER PRIMARY KEY,b);
118205a82983Sdrh    INSERT INTO t4(b) VALUES(x'0123456789abcdef0123456789abcdef0123456789');
118305a82983Sdrh    INSERT INTO t4(b) VALUES(randstr(30,30));
118405a82983Sdrh    INSERT INTO t4(b) VALUES(1.23456);
118505a82983Sdrh    INSERT INTO t4(b) VALUES(NULL);
118605a82983Sdrh    INSERT INTO t4(b) VALUES(0);
118705a82983Sdrh    INSERT INTO t4(b) SELECT b||b||b||b FROM t4;
118805a82983Sdrh    SELECT * FROM t4;
118905a82983Sdrh  }
119005a82983Sdrh  execsql {
119105a82983Sdrh    PRAGMA vdbe_trace=off;
119205a82983Sdrh    PRAGMA vdbe_listing=off;
119305a82983Sdrh    PRAGMA sql_trace=off;
119405a82983Sdrh  }
119505a82983Sdrh} {}
119605a82983Sdrh
11974b2688abSdanielk1977} ;# ifcapable bloblit
11984b2688abSdanielk1977
119959a93791Sdanielk1977ifcapable pager_pragmas {
120059a93791Sdanielk1977  db close
120159a93791Sdanielk1977  file delete -force test.db
120259a93791Sdanielk1977  sqlite3 db test.db
120359a93791Sdanielk1977
120459a93791Sdanielk1977  do_test pragma-14.1 {
120559a93791Sdanielk1977    execsql { pragma auto_vacuum = 0 }
120659a93791Sdanielk1977    execsql { pragma page_count }
120759a93791Sdanielk1977  } {0}
120859a93791Sdanielk1977
120959a93791Sdanielk1977  do_test pragma-14.2 {
121059a93791Sdanielk1977    execsql {
121159a93791Sdanielk1977      CREATE TABLE abc(a, b, c);
121259a93791Sdanielk1977      PRAGMA page_count;
121359a93791Sdanielk1977    }
121459a93791Sdanielk1977  } {2}
121559a93791Sdanielk1977
121659a93791Sdanielk1977  do_test pragma-14.3 {
121759a93791Sdanielk1977    execsql {
121859a93791Sdanielk1977      BEGIN;
121959a93791Sdanielk1977      CREATE TABLE def(a, b, c);
122059a93791Sdanielk1977      PRAGMA page_count;
122159a93791Sdanielk1977    }
122259a93791Sdanielk1977  } {3}
122359a93791Sdanielk1977
122459a93791Sdanielk1977  do_test pragma-14.4 {
122559a93791Sdanielk1977    set page_size [db one {pragma page_size}]
122659a93791Sdanielk1977    expr [file size test.db] / $page_size
122759a93791Sdanielk1977  } {2}
122859a93791Sdanielk1977
122959a93791Sdanielk1977  do_test pragma-14.5 {
123059a93791Sdanielk1977    execsql {
123159a93791Sdanielk1977      ROLLBACK;
123259a93791Sdanielk1977      PRAGMA page_count;
123359a93791Sdanielk1977    }
123459a93791Sdanielk1977  } {2}
123559a93791Sdanielk1977
123659a93791Sdanielk1977  do_test pragma-14.6 {
123759a93791Sdanielk1977    file delete -force test2.db
123859a93791Sdanielk1977    sqlite3 db2 test2.db
123959a93791Sdanielk1977    execsql {
124059a93791Sdanielk1977      PRAGMA auto_vacuum = 0;
124159a93791Sdanielk1977      CREATE TABLE t1(a, b, c);
124259a93791Sdanielk1977      CREATE TABLE t2(a, b, c);
124359a93791Sdanielk1977      CREATE TABLE t3(a, b, c);
124459a93791Sdanielk1977      CREATE TABLE t4(a, b, c);
124559a93791Sdanielk1977    } db2
124659a93791Sdanielk1977    db2 close
124759a93791Sdanielk1977    execsql {
124859a93791Sdanielk1977      ATTACH 'test2.db' AS aux;
124959a93791Sdanielk1977      PRAGMA aux.page_count;
125059a93791Sdanielk1977    }
125159a93791Sdanielk1977  } {5}
125259a93791Sdanielk1977}
125359a93791Sdanielk1977
12548cf6c554Sdanielk1977# Test that the value set using the cache_size pragma is not reset when the
12558cf6c554Sdanielk1977# schema is reloaded.
12568cf6c554Sdanielk1977#
12578cf6c554Sdanielk1977ifcapable pager_pragmas {
12588cf6c554Sdanielk1977  db close
12598cf6c554Sdanielk1977  sqlite3 db test.db
12608cf6c554Sdanielk1977  do_test pragma-15.1 {
12618cf6c554Sdanielk1977    execsql {
12628cf6c554Sdanielk1977      PRAGMA cache_size=59;
12638cf6c554Sdanielk1977      PRAGMA cache_size;
12648cf6c554Sdanielk1977    }
12658cf6c554Sdanielk1977  } {59}
12668cf6c554Sdanielk1977  do_test pragma-15.2 {
12678cf6c554Sdanielk1977    sqlite3 db2 test.db
12688cf6c554Sdanielk1977    execsql {
12698cf6c554Sdanielk1977      CREATE TABLE newtable(a, b, c);
12708cf6c554Sdanielk1977    } db2
12718cf6c554Sdanielk1977    db2 close
12728cf6c554Sdanielk1977  } {}
12738cf6c554Sdanielk1977  do_test pragma-15.3 {
12748cf6c554Sdanielk1977    # Evaluating this statement will cause the schema to be reloaded (because
12758cf6c554Sdanielk1977    # the schema was changed by another connection in pragma-15.2). At one
12768cf6c554Sdanielk1977    # point there was a bug that reset the cache_size to its default value
12778cf6c554Sdanielk1977    # when this happened.
12788cf6c554Sdanielk1977    execsql { SELECT * FROM sqlite_master }
12798cf6c554Sdanielk1977    execsql { PRAGMA cache_size }
12808cf6c554Sdanielk1977  } {59}
12818cf6c554Sdanielk1977}
12828cf6c554Sdanielk1977
12835558a8a6Sdanielk1977# Reset the sqlite3_temp_directory variable for the next run of tests:
12845558a8a6Sdanielk1977sqlite3 dbX :memory:
12855558a8a6Sdanielk1977dbX eval {PRAGMA temp_store_directory = ""}
12865558a8a6Sdanielk1977dbX close
12875558a8a6Sdanielk1977
1288838cce43Sdanielk1977ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
1289aebf413dSaswift  set sqlite_hostid_num 1
1290aebf413dSaswift
1291aebf413dSaswift  set using_proxy 0
1292aebf413dSaswift  foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
1293aebf413dSaswift    set using_proxy $value
1294aebf413dSaswift  }
1295aebf413dSaswift
1296aebf413dSaswift  # Test the lock_proxy_file pragmas.
1297aebf413dSaswift  #
1298aebf413dSaswift  db close
1299aebf413dSaswift  set env(SQLITE_FORCE_PROXY_LOCKING) "0"
1300aebf413dSaswift
1301aebf413dSaswift  sqlite3 db test.db
1302aebf413dSaswift  do_test pragma-16.1 {
1303aebf413dSaswift    execsql {
1304aebf413dSaswift      PRAGMA lock_proxy_file="mylittleproxy";
1305aebf413dSaswift      select * from sqlite_master;
1306aebf413dSaswift    }
1307aebf413dSaswift    execsql {
1308aebf413dSaswift      PRAGMA lock_proxy_file;
1309aebf413dSaswift    }
1310aebf413dSaswift  } {mylittleproxy}
1311aebf413dSaswift
1312aebf413dSaswift  do_test pragma-16.2 {
1313aebf413dSaswift    sqlite3 db2 test.db
1314aebf413dSaswift    execsql {
1315aebf413dSaswift      PRAGMA lock_proxy_file="mylittleproxy";
1316aebf413dSaswift    } db2
1317aebf413dSaswift  } {}
1318aebf413dSaswift
1319aebf413dSaswift  db2 close
1320aebf413dSaswift  do_test pragma-16.2.1 {
1321aebf413dSaswift    sqlite3 db2 test.db
1322aebf413dSaswift    execsql {
1323aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1324aebf413dSaswift      select * from sqlite_master;
1325aebf413dSaswift    } db2
1326aebf413dSaswift    execsql {
1327aebf413dSaswift      PRAGMA lock_proxy_file;
1328aebf413dSaswift    } db2
1329aebf413dSaswift  } {mylittleproxy}
1330aebf413dSaswift
1331aebf413dSaswift  db2 close
1332aebf413dSaswift  do_test pragma-16.3 {
1333aebf413dSaswift    sqlite3 db2 test.db
1334aebf413dSaswift    execsql {
1335aebf413dSaswift      PRAGMA lock_proxy_file="myotherproxy";
1336aebf413dSaswift    } db2
1337aebf413dSaswift    catchsql {
1338aebf413dSaswift      select * from sqlite_master;
1339aebf413dSaswift    } db2
1340aebf413dSaswift  } {1 {database is locked}}
1341aebf413dSaswift
1342aebf413dSaswift  do_test pragma-16.4 {
1343aebf413dSaswift    db2 close
1344aebf413dSaswift    db close
1345aebf413dSaswift    sqlite3 db2 test.db
1346aebf413dSaswift    execsql {
1347aebf413dSaswift      PRAGMA lock_proxy_file="myoriginalproxy";
1348aebf413dSaswift      PRAGMA lock_proxy_file="myotherproxy";
1349aebf413dSaswift      PRAGMA lock_proxy_file;
1350aebf413dSaswift    } db2
1351aebf413dSaswift  } {myotherproxy}
1352aebf413dSaswift
1353aebf413dSaswift  db2 close
1354aebf413dSaswift  set env(SQLITE_FORCE_PROXY_LOCKING) "1"
1355aebf413dSaswift  do_test pragma-16.5 {
1356aebf413dSaswift    sqlite3 db2 test.db
1357aebf413dSaswift    execsql {
1358aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1359aebf413dSaswift      PRAGMA lock_proxy_file;
1360aebf413dSaswift    } db2
1361aebf413dSaswift  } {myotherproxy}
1362aebf413dSaswift
1363aebf413dSaswift  do_test pragma-16.6 {
1364aebf413dSaswift    db2 close
1365aebf413dSaswift    sqlite3 db2 test2.db
1366aebf413dSaswift    set lockpath [execsql {
1367aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1368aebf413dSaswift      PRAGMA lock_proxy_file;
1369aebf413dSaswift    } db2]
1370aebf413dSaswift    string match "*test2.db:auto:" $lockpath
1371aebf413dSaswift  } {1}
1372aebf413dSaswift
1373aebf413dSaswift  set sqlite_hostid_num 2
1374aebf413dSaswift  do_test pragma-16.7 {
1375aebf413dSaswift    sqlite3 db test2.db
1376aebf413dSaswift    execsql {
1377aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1378aebf413dSaswift    }
1379aebf413dSaswift    catchsql {
1380aebf413dSaswift      select * from sqlite_master;
1381aebf413dSaswift    }
1382aebf413dSaswift  } {1 {database is locked}}
1383aebf413dSaswift  db close
1384aebf413dSaswift
1385aebf413dSaswift  do_test pragma-16.8 {
1386aebf413dSaswift    sqlite3 db test2.db
1387aebf413dSaswift    catchsql {
1388aebf413dSaswift      select * from sqlite_master;
1389aebf413dSaswift    }
1390aebf413dSaswift  } {1 {database is locked}}
1391aebf413dSaswift
1392aebf413dSaswift  db2 close
1393aebf413dSaswift  do_test pragma-16.8.1 {
1394aebf413dSaswift    execsql {
1395aebf413dSaswift      PRAGMA lock_proxy_file="yetanotherproxy";
1396aebf413dSaswift      PRAGMA lock_proxy_file;
1397aebf413dSaswift    }
1398aebf413dSaswift  } {yetanotherproxy}
1399aebf413dSaswift  do_test pragma-16.8.2 {
1400aebf413dSaswift    execsql {
1401aebf413dSaswift      create table mine(x);
1402aebf413dSaswift    }
1403aebf413dSaswift  } {}
1404aebf413dSaswift
1405aebf413dSaswift  db close
1406aebf413dSaswift  do_test pragma-16.9 {
1407aebf413dSaswift    sqlite3 db proxytest.db
1408aebf413dSaswift    set lockpath2 [execsql {
1409aebf413dSaswift      PRAGMA lock_proxy_file=":auto:";
1410aebf413dSaswift      PRAGMA lock_proxy_file;
1411aebf413dSaswift    } db]
1412aebf413dSaswift    string match "*proxytest.db:auto:" $lockpath2
1413aebf413dSaswift  } {1}
1414aebf413dSaswift
1415aebf413dSaswift  set env(SQLITE_FORCE_PROXY_LOCKING) $using_proxy
1416aebf413dSaswift  set sqlite_hostid_num 0
1417aebf413dSaswift}
1418d2cb50b7Sdrh
1419d2cb50b7Sdrh# Parsing of auto_vacuum settings.
1420d2cb50b7Sdrh#
1421d2cb50b7Sdrhforeach {autovac_setting val} {
1422d2cb50b7Sdrh  0 0
1423d2cb50b7Sdrh  1 1
1424d2cb50b7Sdrh  2 2
1425d2cb50b7Sdrh  3 0
1426d2cb50b7Sdrh  -1 0
1427d2cb50b7Sdrh  none 0
1428d2cb50b7Sdrh  NONE 0
1429d2cb50b7Sdrh  NoNe 0
1430d2cb50b7Sdrh  full 1
1431d2cb50b7Sdrh  FULL 1
1432d2cb50b7Sdrh  incremental 2
1433d2cb50b7Sdrh  INCREMENTAL 2
1434d2cb50b7Sdrh  -1234 0
1435d2cb50b7Sdrh  1234 0
1436d2cb50b7Sdrh} {
1437d2cb50b7Sdrh  do_test pragma-17.1.$autovac_setting {
1438d2cb50b7Sdrh    catch {db close}
1439d2cb50b7Sdrh    sqlite3 db :memory:
1440d2cb50b7Sdrh    execsql "
1441d2cb50b7Sdrh      PRAGMA auto_vacuum=$::autovac_setting;
1442d2cb50b7Sdrh      PRAGMA auto_vacuum;
1443d2cb50b7Sdrh    "
1444d2cb50b7Sdrh  } $val
1445d2cb50b7Sdrh}
1446d2cb50b7Sdrh
1447d2cb50b7Sdrh# Parsing of temp_store settings.
1448d2cb50b7Sdrh#
1449d2cb50b7Sdrhforeach {temp_setting val} {
1450d2cb50b7Sdrh  0 0
1451d2cb50b7Sdrh  1 1
1452d2cb50b7Sdrh  2 2
1453d2cb50b7Sdrh  3 0
1454d2cb50b7Sdrh  -1 0
1455d2cb50b7Sdrh  file 1
1456d2cb50b7Sdrh  FILE 1
1457d2cb50b7Sdrh  fIlE 1
1458d2cb50b7Sdrh  memory 2
1459d2cb50b7Sdrh  MEMORY 2
1460d2cb50b7Sdrh  MeMoRy 2
1461d2cb50b7Sdrh} {
1462d2cb50b7Sdrh  do_test pragma-18.1.$temp_setting {
1463d2cb50b7Sdrh    catch {db close}
1464d2cb50b7Sdrh    sqlite3 db :memory:
1465d2cb50b7Sdrh    execsql "
1466d2cb50b7Sdrh      PRAGMA temp_store=$::temp_setting;
1467d2cb50b7Sdrh      PRAGMA temp_store=$::temp_setting;
1468d2cb50b7Sdrh      PRAGMA temp_store;
1469d2cb50b7Sdrh    "
1470d2cb50b7Sdrh  } $val
1471d2cb50b7Sdrh}
1472d2cb50b7Sdrh
1473cd61c281Sdrhfinish_test
1474