xref: /sqlite-3.40.0/test/pragma.test (revision 181ddaa1)
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*181ddaa1Sdanielk1977# $Id: pragma.test,v 1.67 2008/09/16 15:50:12 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.
3791cf71b0Sdanielk1977#
3891cf71b0Sdanielk1977
3905a82983Sdrhifcapable !pragma {
4005a82983Sdrh  finish_test
4105a82983Sdrh  return
4205a82983Sdrh}
4305a82983Sdrh
44cd61c281Sdrh# Delete the preexisting database to avoid the special setup
45cd61c281Sdrh# that the "all.test" script does.
46cd61c281Sdrh#
47cd61c281Sdrhdb close
4825403650Sdrhfile delete test.db test.db-journal
4925403650Sdrhfile delete test3.db test3.db-journal
50dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db]
51cd61c281Sdrh
521e9daa6aSdrh
53c7b4a44cSdanielk1977ifcapable pager_pragmas {
541e9daa6aSdrhset DFLT_CACHE_SZ [db one {PRAGMA default_cache_size}]
551e9daa6aSdrhset TEMP_CACHE_SZ [db one {PRAGMA temp.default_cache_size}]
56cd61c281Sdrhdo_test pragma-1.1 {
57cd61c281Sdrh  execsql {
58cd61c281Sdrh    PRAGMA cache_size;
59cd61c281Sdrh    PRAGMA default_cache_size;
60cd61c281Sdrh    PRAGMA synchronous;
61cd61c281Sdrh  }
621e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
63cd61c281Sdrhdo_test pragma-1.2 {
64cd61c281Sdrh  execsql {
65eb43e5c7Sdrh    PRAGMA synchronous=OFF;
66cd61c281Sdrh    PRAGMA cache_size=1234;
67cd61c281Sdrh    PRAGMA cache_size;
68cd61c281Sdrh    PRAGMA default_cache_size;
69cd61c281Sdrh    PRAGMA synchronous;
70cd61c281Sdrh  }
711e9daa6aSdrh} [list 1234 $DFLT_CACHE_SZ 0]
72cd61c281Sdrhdo_test pragma-1.3 {
73cd61c281Sdrh  db close
74ef4ac8f9Sdrh  sqlite3 db test.db
75cd61c281Sdrh  execsql {
76cd61c281Sdrh    PRAGMA cache_size;
77cd61c281Sdrh    PRAGMA default_cache_size;
78cd61c281Sdrh    PRAGMA synchronous;
79cd61c281Sdrh  }
801e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
81cd61c281Sdrhdo_test pragma-1.4 {
82cd61c281Sdrh  execsql {
83cd61c281Sdrh    PRAGMA synchronous=OFF;
84cd61c281Sdrh    PRAGMA cache_size;
85cd61c281Sdrh    PRAGMA default_cache_size;
86cd61c281Sdrh    PRAGMA synchronous;
87cd61c281Sdrh  }
881e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 0]
89cd61c281Sdrhdo_test pragma-1.5 {
90cd61c281Sdrh  execsql {
91cd61c281Sdrh    PRAGMA cache_size=4321;
92cd61c281Sdrh    PRAGMA cache_size;
93cd61c281Sdrh    PRAGMA default_cache_size;
94cd61c281Sdrh    PRAGMA synchronous;
95cd61c281Sdrh  }
961e9daa6aSdrh} [list 4321 $DFLT_CACHE_SZ 0]
97cd61c281Sdrhdo_test pragma-1.6 {
98cd61c281Sdrh  execsql {
99cd61c281Sdrh    PRAGMA synchronous=ON;
100cd61c281Sdrh    PRAGMA cache_size;
101cd61c281Sdrh    PRAGMA default_cache_size;
102cd61c281Sdrh    PRAGMA synchronous;
103cd61c281Sdrh  }
1041e9daa6aSdrh} [list 4321 $DFLT_CACHE_SZ 1]
105cd61c281Sdrhdo_test pragma-1.7 {
106cd61c281Sdrh  db close
107ef4ac8f9Sdrh  sqlite3 db test.db
108cd61c281Sdrh  execsql {
109cd61c281Sdrh    PRAGMA cache_size;
110cd61c281Sdrh    PRAGMA default_cache_size;
111cd61c281Sdrh    PRAGMA synchronous;
112cd61c281Sdrh  }
1131e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
114cd61c281Sdrhdo_test pragma-1.8 {
115cd61c281Sdrh  execsql {
116cd61c281Sdrh    PRAGMA default_cache_size=123;
117cd61c281Sdrh    PRAGMA cache_size;
118cd61c281Sdrh    PRAGMA default_cache_size;
119cd61c281Sdrh    PRAGMA synchronous;
120cd61c281Sdrh  }
12191cf71b0Sdanielk1977} {123 123 2}
122802d69a7Sdrhdo_test pragma-1.9.1 {
123cd61c281Sdrh  db close
124dddca286Sdrh  sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
125cd61c281Sdrh  execsql {
126cd61c281Sdrh    PRAGMA cache_size;
127cd61c281Sdrh    PRAGMA default_cache_size;
128cd61c281Sdrh    PRAGMA synchronous;
129cd61c281Sdrh  }
13091cf71b0Sdanielk1977} {123 123 2}
131802d69a7Sdrhifcapable vacuum {
132802d69a7Sdrh  do_test pragma-1.9.2 {
133802d69a7Sdrh    execsql {
134802d69a7Sdrh      VACUUM;
135802d69a7Sdrh      PRAGMA cache_size;
136802d69a7Sdrh      PRAGMA default_cache_size;
137802d69a7Sdrh      PRAGMA synchronous;
138802d69a7Sdrh    }
139802d69a7Sdrh  } {123 123 2}
140802d69a7Sdrh}
14191cf71b0Sdanielk1977do_test pragma-1.10 {
1425a38705eSdrh  execsql {
1434303feedSdrh    PRAGMA synchronous=NORMAL;
1444303feedSdrh    PRAGMA cache_size;
1454303feedSdrh    PRAGMA default_cache_size;
1464303feedSdrh    PRAGMA synchronous;
1474303feedSdrh  }
14891cf71b0Sdanielk1977} {123 123 1}
14991cf71b0Sdanielk1977do_test pragma-1.11 {
1504303feedSdrh  execsql {
1514303feedSdrh    PRAGMA synchronous=FULL;
1524303feedSdrh    PRAGMA cache_size;
1534303feedSdrh    PRAGMA default_cache_size;
1544303feedSdrh    PRAGMA synchronous;
1554303feedSdrh  }
15691cf71b0Sdanielk1977} {123 123 2}
15791cf71b0Sdanielk1977do_test pragma-1.12 {
1584303feedSdrh  db close
159dddca286Sdrh  sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
1604303feedSdrh  execsql {
1614303feedSdrh    PRAGMA cache_size;
1624303feedSdrh    PRAGMA default_cache_size;
1634303feedSdrh    PRAGMA synchronous;
1644303feedSdrh  }
16591cf71b0Sdanielk1977} {123 123 2}
16691cf71b0Sdanielk1977
1675260f7e9Sdrh# Make sure the pragma handler understands numeric values in addition
1685260f7e9Sdrh# to keywords like "off" and "full".
1695260f7e9Sdrh#
1705260f7e9Sdrhdo_test pragma-1.13 {
1715260f7e9Sdrh  execsql {
1725260f7e9Sdrh    PRAGMA synchronous=0;
1735260f7e9Sdrh    PRAGMA synchronous;
1745260f7e9Sdrh  }
1755260f7e9Sdrh} {0}
1765260f7e9Sdrhdo_test pragma-1.14 {
1775260f7e9Sdrh  execsql {
1785260f7e9Sdrh    PRAGMA synchronous=2;
1795260f7e9Sdrh    PRAGMA synchronous;
1805260f7e9Sdrh  }
1815260f7e9Sdrh} {2}
182c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
1835260f7e9Sdrh
1845260f7e9Sdrh# Test turning "flag" pragmas on and off.
1855260f7e9Sdrh#
1866338c762Sdanielk1977ifcapable debug {
1876338c762Sdanielk1977  # Pragma "vdbe_listing" is only available if compiled with SQLITE_DEBUG
1886338c762Sdanielk1977  #
1895260f7e9Sdrh  do_test pragma-1.15 {
1905260f7e9Sdrh    execsql {
1915260f7e9Sdrh      PRAGMA vdbe_listing=YES;
1925260f7e9Sdrh      PRAGMA vdbe_listing;
1935260f7e9Sdrh    }
1945260f7e9Sdrh  } {1}
1955260f7e9Sdrh  do_test pragma-1.16 {
1965260f7e9Sdrh    execsql {
1975260f7e9Sdrh      PRAGMA vdbe_listing=NO;
1985260f7e9Sdrh      PRAGMA vdbe_listing;
1995260f7e9Sdrh    }
2005260f7e9Sdrh  } {0}
2016338c762Sdanielk1977}
2026338c762Sdanielk1977
2035260f7e9Sdrhdo_test pragma-1.17 {
2045260f7e9Sdrh  execsql {
2055260f7e9Sdrh    PRAGMA parser_trace=ON;
2065260f7e9Sdrh    PRAGMA parser_trace=OFF;
2075260f7e9Sdrh  }
2085260f7e9Sdrh} {}
2095260f7e9Sdrhdo_test pragma-1.18 {
2105260f7e9Sdrh  execsql {
2115260f7e9Sdrh    PRAGMA bogus = -1234;  -- Parsing of negative values
2125260f7e9Sdrh  }
2135260f7e9Sdrh} {}
2145260f7e9Sdrh
21591cf71b0Sdanielk1977# Test modifying the safety_level of an attached database.
2165a8f9374Sdanielk1977ifcapable pager_pragmas&&attach {
21791cf71b0Sdanielk1977  do_test pragma-2.1 {
21891cf71b0Sdanielk1977    file delete -force test2.db
21991cf71b0Sdanielk1977    file delete -force test2.db-journal
2204303feedSdrh    execsql {
22191cf71b0Sdanielk1977      ATTACH 'test2.db' AS aux;
2224303feedSdrh    }
22391cf71b0Sdanielk1977  } {}
22491cf71b0Sdanielk1977  do_test pragma-2.2 {
2254303feedSdrh    execsql {
22691cf71b0Sdanielk1977      pragma aux.synchronous;
2274303feedSdrh    }
22891cf71b0Sdanielk1977  } {2}
22991cf71b0Sdanielk1977  do_test pragma-2.3 {
23091cf71b0Sdanielk1977    execsql {
23191cf71b0Sdanielk1977      pragma aux.synchronous = OFF;
23291cf71b0Sdanielk1977      pragma aux.synchronous;
23391cf71b0Sdanielk1977      pragma synchronous;
23491cf71b0Sdanielk1977    }
23591cf71b0Sdanielk1977  } {0 2}
23691cf71b0Sdanielk1977  do_test pragma-2.4 {
23791cf71b0Sdanielk1977    execsql {
23891cf71b0Sdanielk1977      pragma aux.synchronous = ON;
23991cf71b0Sdanielk1977      pragma synchronous;
24091cf71b0Sdanielk1977      pragma aux.synchronous;
24191cf71b0Sdanielk1977    }
24291cf71b0Sdanielk1977  } {2 1}
243c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
2444303feedSdrh
245ed717fe3Sdrh# Construct a corrupted index and make sure the integrity_check
246ed717fe3Sdrh# pragma finds it.
247ed717fe3Sdrh#
24825d6543dSdrh# These tests won't work if the database is encrypted
24925d6543dSdrh#
250ed717fe3Sdrhdo_test pragma-3.1 {
2511e9daa6aSdrh  db close
2521e9daa6aSdrh  file delete -force test.db test.db-journal
2531e9daa6aSdrh  sqlite3 db test.db
254ed717fe3Sdrh  execsql {
2551e9daa6aSdrh    PRAGMA auto_vacuum=OFF;
256ed717fe3Sdrh    BEGIN;
257ed717fe3Sdrh    CREATE TABLE t2(a,b,c);
258ed717fe3Sdrh    CREATE INDEX i2 ON t2(a);
259ed717fe3Sdrh    INSERT INTO t2 VALUES(11,2,3);
260ed717fe3Sdrh    INSERT INTO t2 VALUES(22,3,4);
261ed717fe3Sdrh    COMMIT;
262ed717fe3Sdrh    SELECT rowid, * from t2;
263ed717fe3Sdrh  }
264ed717fe3Sdrh} {1 11 2 3 2 22 3 4}
2655a8f9374Sdanielk1977ifcapable attach {
26640e016e4Sdrh  if {![sqlite3 -has-codec] && $sqlite_options(integrityck)} {
267ed717fe3Sdrh    do_test pragma-3.2 {
268bb8a279eSdrh      db eval {SELECT rootpage FROM sqlite_master WHERE name='i2'} break
269bb8a279eSdrh      set pgsz [db eval {PRAGMA page_size}]
270bb8a279eSdrh      # overwrite the header on the rootpage of the index in order to
271bb8a279eSdrh      # make the index appear to be empty.
272bb8a279eSdrh      #
273bb8a279eSdrh      set offset [expr {$pgsz*($rootpage-1)}]
274bb8a279eSdrh      hexio_write test.db $offset 0a00000000040000000000
275bb8a279eSdrh      db close
276bb8a279eSdrh      sqlite3 db test.db
277ed717fe3Sdrh      execsql {PRAGMA integrity_check}
278bb8a279eSdrh    } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
27991cf71b0Sdanielk1977    do_test pragma-3.3 {
2801dcdbc06Sdrh      execsql {PRAGMA integrity_check=1}
2811dcdbc06Sdrh    } {{rowid 1 missing from index i2}}
2821dcdbc06Sdrh    do_test pragma-3.4 {
28391cf71b0Sdanielk1977      execsql {
2841dcdbc06Sdrh        ATTACH DATABASE 'test.db' AS t2;
2851dcdbc06Sdrh        PRAGMA integrity_check
28691cf71b0Sdanielk1977      }
287bb8a279eSdrh    } {{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}}
2881dcdbc06Sdrh    do_test pragma-3.5 {
2891dcdbc06Sdrh      execsql {
290bb8a279eSdrh        PRAGMA integrity_check=4
2911dcdbc06Sdrh      }
292bb8a279eSdrh    } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2}}
2931dcdbc06Sdrh    do_test pragma-3.6 {
2941dcdbc06Sdrh      execsql {
2951dcdbc06Sdrh        PRAGMA integrity_check=xyz
2961dcdbc06Sdrh      }
297bb8a279eSdrh    } {{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}}
2981dcdbc06Sdrh    do_test pragma-3.7 {
2991dcdbc06Sdrh      execsql {
3001dcdbc06Sdrh        PRAGMA integrity_check=0
3011dcdbc06Sdrh      }
302bb8a279eSdrh    } {{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}}
3031dcdbc06Sdrh
3041dcdbc06Sdrh    # Add additional corruption by appending unused pages to the end of
3051dcdbc06Sdrh    # the database file testerr.db
3061dcdbc06Sdrh    #
3071dcdbc06Sdrh    do_test pragma-3.8 {
3081dcdbc06Sdrh      execsql {DETACH t2}
3091dcdbc06Sdrh      file delete -force testerr.db testerr.db-journal
310e3d559adSdrh      set out [open testerr.db w]
311e3d559adSdrh      fconfigure $out -translation binary
312e3d559adSdrh      set in [open test.db r]
313e3d559adSdrh      fconfigure $in -translation binary
3141dcdbc06Sdrh      puts -nonewline $out [read $in]
3151dcdbc06Sdrh      seek $in 0
3161dcdbc06Sdrh      puts -nonewline $out [read $in]
3171dcdbc06Sdrh      close $in
3181dcdbc06Sdrh      close $out
3191dcdbc06Sdrh      execsql {REINDEX t2}
3201dcdbc06Sdrh      execsql {PRAGMA integrity_check}
3211dcdbc06Sdrh    } {ok}
32241c58b78Sdanielk1977    do_test pragma-3.8.1 {
32341c58b78Sdanielk1977      execsql {PRAGMA quick_check}
32441c58b78Sdanielk1977    } {ok}
3251dcdbc06Sdrh    do_test pragma-3.9 {
3261dcdbc06Sdrh      execsql {
3271dcdbc06Sdrh        ATTACH 'testerr.db' AS t2;
3281dcdbc06Sdrh        PRAGMA integrity_check
3291dcdbc06Sdrh      }
3301dcdbc06Sdrh    } {{*** in database t2 ***
3311dcdbc06SdrhPage 4 is never used
3321dcdbc06SdrhPage 5 is never used
333bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
3341dcdbc06Sdrh    do_test pragma-3.10 {
3351dcdbc06Sdrh      execsql {
3361dcdbc06Sdrh        PRAGMA integrity_check=1
3371dcdbc06Sdrh      }
3381dcdbc06Sdrh    } {{*** in database t2 ***
3391dcdbc06SdrhPage 4 is never used}}
3401dcdbc06Sdrh    do_test pragma-3.11 {
3411dcdbc06Sdrh      execsql {
3421dcdbc06Sdrh        PRAGMA integrity_check=5
3431dcdbc06Sdrh      }
3441dcdbc06Sdrh    } {{*** in database t2 ***
3451dcdbc06SdrhPage 4 is never used
3461dcdbc06SdrhPage 5 is never used
347bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2}}
3481dcdbc06Sdrh    do_test pragma-3.12 {
3491dcdbc06Sdrh      execsql {
3501dcdbc06Sdrh        PRAGMA integrity_check=4
3511dcdbc06Sdrh      }
3521dcdbc06Sdrh    } {{*** in database t2 ***
3531dcdbc06SdrhPage 4 is never used
3541dcdbc06SdrhPage 5 is never used
3551dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
3561dcdbc06Sdrh    do_test pragma-3.13 {
3571dcdbc06Sdrh      execsql {
3581dcdbc06Sdrh        PRAGMA integrity_check=3
3591dcdbc06Sdrh      }
3601dcdbc06Sdrh    } {{*** in database t2 ***
3611dcdbc06SdrhPage 4 is never used
3621dcdbc06SdrhPage 5 is never used
3631dcdbc06SdrhPage 6 is never used}}
3641dcdbc06Sdrh    do_test pragma-3.14 {
3651dcdbc06Sdrh      execsql {
3661dcdbc06Sdrh        PRAGMA integrity_check(2)
3671dcdbc06Sdrh      }
3681dcdbc06Sdrh    } {{*** in database t2 ***
3691dcdbc06SdrhPage 4 is never used
3701dcdbc06SdrhPage 5 is never used}}
3711dcdbc06Sdrh    do_test pragma-3.15 {
3721dcdbc06Sdrh      execsql {
3731dcdbc06Sdrh        ATTACH 'testerr.db' AS t3;
3741dcdbc06Sdrh        PRAGMA integrity_check
3751dcdbc06Sdrh      }
3761dcdbc06Sdrh    } {{*** in database t2 ***
3771dcdbc06SdrhPage 4 is never used
3781dcdbc06SdrhPage 5 is never used
379bb8a279eSdrhPage 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 ***
3801dcdbc06SdrhPage 4 is never used
3811dcdbc06SdrhPage 5 is never used
382bb8a279eSdrhPage 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
3831dcdbc06Sdrh    do_test pragma-3.16 {
3841dcdbc06Sdrh      execsql {
385bb8a279eSdrh        PRAGMA integrity_check(10)
3861dcdbc06Sdrh      }
3871dcdbc06Sdrh    } {{*** in database t2 ***
3881dcdbc06SdrhPage 4 is never used
3891dcdbc06SdrhPage 5 is never used
390bb8a279eSdrhPage 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 ***
3911dcdbc06SdrhPage 4 is never used
3921dcdbc06SdrhPage 5 is never used
3931dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
3941dcdbc06Sdrh    do_test pragma-3.17 {
3951dcdbc06Sdrh      execsql {
396bb8a279eSdrh        PRAGMA integrity_check=8
3971dcdbc06Sdrh      }
3981dcdbc06Sdrh    } {{*** in database t2 ***
3991dcdbc06SdrhPage 4 is never used
4001dcdbc06SdrhPage 5 is never used
401bb8a279eSdrhPage 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 ***
4021dcdbc06SdrhPage 4 is never used
4031dcdbc06SdrhPage 5 is never used}}
4041dcdbc06Sdrh    do_test pragma-3.18 {
4051dcdbc06Sdrh      execsql {
4061dcdbc06Sdrh        PRAGMA integrity_check=4
4071dcdbc06Sdrh      }
4081dcdbc06Sdrh    } {{*** in database t2 ***
4091dcdbc06SdrhPage 4 is never used
4101dcdbc06SdrhPage 5 is never used
4111dcdbc06SdrhPage 6 is never used} {rowid 1 missing from index i2}}
4121dcdbc06Sdrh  }
4131dcdbc06Sdrh  do_test pragma-3.99 {
4141dcdbc06Sdrh    catchsql {DETACH t3}
4151dcdbc06Sdrh    catchsql {DETACH t2}
41690ddb123Sdrh    file delete -force testerr.db testerr.db-journal
41705a6f4acSdrh    catchsql {DROP INDEX i2}
4181dcdbc06Sdrh  } {0 {}}
4195a8f9374Sdanielk1977}
42091cf71b0Sdanielk1977
42191cf71b0Sdanielk1977# Test modifying the cache_size of an attached database.
4225a8f9374Sdanielk1977ifcapable pager_pragmas&&attach {
42391cf71b0Sdanielk1977do_test pragma-4.1 {
42491cf71b0Sdanielk1977  execsql {
4251e9daa6aSdrh    ATTACH 'test2.db' AS aux;
42691cf71b0Sdanielk1977    pragma aux.cache_size;
42791cf71b0Sdanielk1977    pragma aux.default_cache_size;
42891cf71b0Sdanielk1977  }
4291e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4301bdd9b57Sdrhdo_test pragma-4.2 {
4311bdd9b57Sdrh  execsql {
43291cf71b0Sdanielk1977    pragma aux.cache_size = 50;
43391cf71b0Sdanielk1977    pragma aux.cache_size;
43491cf71b0Sdanielk1977    pragma aux.default_cache_size;
4351bdd9b57Sdrh  }
4361e9daa6aSdrh} [list 50 $DFLT_CACHE_SZ]
4371bdd9b57Sdrhdo_test pragma-4.3 {
4381bdd9b57Sdrh  execsql {
43991cf71b0Sdanielk1977    pragma aux.default_cache_size = 456;
44091cf71b0Sdanielk1977    pragma aux.cache_size;
44191cf71b0Sdanielk1977    pragma aux.default_cache_size;
4421bdd9b57Sdrh  }
44391cf71b0Sdanielk1977} {456 456}
4441bdd9b57Sdrhdo_test pragma-4.4 {
4451bdd9b57Sdrh  execsql {
44691cf71b0Sdanielk1977    pragma cache_size;
44791cf71b0Sdanielk1977    pragma default_cache_size;
4481bdd9b57Sdrh  }
4491e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4501bdd9b57Sdrhdo_test pragma-4.5 {
4511bdd9b57Sdrh  execsql {
45291cf71b0Sdanielk1977    DETACH aux;
45391cf71b0Sdanielk1977    ATTACH 'test3.db' AS aux;
45491cf71b0Sdanielk1977    pragma aux.cache_size;
45591cf71b0Sdanielk1977    pragma aux.default_cache_size;
4561bdd9b57Sdrh  }
4571e9daa6aSdrh} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
4581bdd9b57Sdrhdo_test pragma-4.6 {
4591bdd9b57Sdrh  execsql {
46091cf71b0Sdanielk1977    DETACH aux;
46191cf71b0Sdanielk1977    ATTACH 'test2.db' AS aux;
46291cf71b0Sdanielk1977    pragma aux.cache_size;
46391cf71b0Sdanielk1977    pragma aux.default_cache_size;
4641bdd9b57Sdrh  }
46591cf71b0Sdanielk1977} {456 456}
466c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
4671bdd9b57Sdrh
46891cf71b0Sdanielk1977# Test that modifying the sync-level in the middle of a transaction is
46991cf71b0Sdanielk1977# disallowed.
470c7b4a44cSdanielk1977ifcapable pager_pragmas {
47191cf71b0Sdanielk1977do_test pragma-5.0 {
4721bdd9b57Sdrh  execsql {
47391cf71b0Sdanielk1977    pragma synchronous;
4741bdd9b57Sdrh  }
47591cf71b0Sdanielk1977} {2}
47691cf71b0Sdanielk1977do_test pragma-5.1 {
4771bdd9b57Sdrh  catchsql {
4781bdd9b57Sdrh    BEGIN;
47991cf71b0Sdanielk1977    pragma synchronous = OFF;
4801bdd9b57Sdrh  }
48191cf71b0Sdanielk1977} {1 {Safety level may not be changed inside a transaction}}
48291cf71b0Sdanielk1977do_test pragma-5.2 {
48391cf71b0Sdanielk1977  execsql {
48491cf71b0Sdanielk1977    pragma synchronous;
48591cf71b0Sdanielk1977  }
48691cf71b0Sdanielk1977} {2}
4875260f7e9Sdrhcatchsql {COMMIT;}
488c7b4a44cSdanielk1977} ;# ifcapable pager_pragmas
4895260f7e9Sdrh
4905260f7e9Sdrh# Test schema-query pragmas
4915260f7e9Sdrh#
49227188fb5Sdanielk1977ifcapable schema_pragmas {
4935a8f9374Sdanielk1977ifcapable tempdb&&attach {
4945260f7e9Sdrh  do_test pragma-6.1 {
495956bc92cSdrh    set res {}
49640e016e4Sdrh    execsql {SELECT * FROM sqlite_temp_master}
4975260f7e9Sdrh    foreach {idx name file} [execsql {pragma database_list}] {
4985260f7e9Sdrh      lappend res $idx $name
4995260f7e9Sdrh    }
5005260f7e9Sdrh    set res
501a71aa001Sdrh  } {0 main 1 temp 2 aux}
50253c0f748Sdanielk1977}
5035260f7e9Sdrhdo_test pragma-6.2 {
5045260f7e9Sdrh  execsql {
5055260f7e9Sdrh    pragma table_info(t2)
5065260f7e9Sdrh  }
507bfa8b102Sdrh} {0 a {} 0 {} 0 1 b {} 0 {} 0 2 c {} 0 {} 0}
508736c7d4bSdrhdb nullvalue <<NULL>>
509417ec638Sdrhdo_test pragma-6.2.2 {
510417ec638Sdrh  execsql {
511736c7d4bSdrh    CREATE TABLE t5(
512736c7d4bSdrh      a TEXT DEFAULT CURRENT_TIMESTAMP,
513736c7d4bSdrh      b DEFAULT (5+3),
514736c7d4bSdrh      c TEXT,
515736c7d4bSdrh      d INTEGER DEFAULT NULL,
516736c7d4bSdrh      e TEXT DEFAULT ''
517736c7d4bSdrh    );
518417ec638Sdrh    PRAGMA table_info(t5);
519417ec638Sdrh  }
520736c7d4bSdrh} {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}
521736c7d4bSdrhdb nullvalue {}
5226bf89570Sdrhifcapable {foreignkey} {
5235260f7e9Sdrh  do_test pragma-6.3 {
5245260f7e9Sdrh    execsql {
5255260f7e9Sdrh      CREATE TABLE t3(a int references t2(b), b UNIQUE);
5265260f7e9Sdrh      pragma foreign_key_list(t3);
5275260f7e9Sdrh    }
5285260f7e9Sdrh  } {0 0 t2 a b}
5295260f7e9Sdrh  do_test pragma-6.4 {
5305260f7e9Sdrh    execsql {
5315260f7e9Sdrh      pragma index_list(t3);
5325260f7e9Sdrh    }
5335260f7e9Sdrh  } {0 sqlite_autoindex_t3_1 1}
5346bf89570Sdrh}
5356bf89570Sdrhifcapable {!foreignkey} {
5366bf89570Sdrh  execsql {CREATE TABLE t3(a,b UNIQUE)}
5376bf89570Sdrh}
5385260f7e9Sdrhdo_test pragma-6.5 {
5395260f7e9Sdrh  execsql {
5405260f7e9Sdrh    CREATE INDEX t3i1 ON t3(a,b);
5415260f7e9Sdrh    pragma index_info(t3i1);
5425260f7e9Sdrh  }
5435260f7e9Sdrh} {0 0 a 1 1 b}
544260d8a6aSdanielk1977
545260d8a6aSdanielk1977ifcapable tempdb {
546260d8a6aSdanielk1977  # Test for ticket #3320. When a temp table of the same name exists, make
547260d8a6aSdanielk1977  # sure the schema of the main table can still be queried using
548260d8a6aSdanielk1977  # "pragma table_info":
549260d8a6aSdanielk1977  do_test pragma-6.6.1 {
550260d8a6aSdanielk1977    execsql {
551260d8a6aSdanielk1977      CREATE TABLE trial(col_main);
552260d8a6aSdanielk1977      CREATE TEMP TABLE trial(col_temp);
553260d8a6aSdanielk1977    }
554260d8a6aSdanielk1977  } {}
555260d8a6aSdanielk1977  do_test pragma-6.6.2 {
556260d8a6aSdanielk1977    execsql {
557260d8a6aSdanielk1977      PRAGMA table_info(trial);
558260d8a6aSdanielk1977    }
559260d8a6aSdanielk1977  } {0 col_temp {} 0 {} 0}
560260d8a6aSdanielk1977  do_test pragma-6.6.3 {
561260d8a6aSdanielk1977    execsql {
562260d8a6aSdanielk1977      PRAGMA temp.table_info(trial);
563260d8a6aSdanielk1977    }
564260d8a6aSdanielk1977  } {0 col_temp {} 0 {} 0}
565260d8a6aSdanielk1977  do_test pragma-6.6.4 {
566260d8a6aSdanielk1977    execsql {
567260d8a6aSdanielk1977      PRAGMA main.table_info(trial);
568260d8a6aSdanielk1977    }
569260d8a6aSdanielk1977  } {0 col_main {} 0 {} 0}
570260d8a6aSdanielk1977}
57127188fb5Sdanielk1977} ;# ifcapable schema_pragmas
5725260f7e9Sdrh# Miscellaneous tests
5735260f7e9Sdrh#
57427188fb5Sdanielk1977ifcapable schema_pragmas {
5755260f7e9Sdrhdo_test pragma-7.1 {
5765260f7e9Sdrh  # Make sure a pragma knows to read the schema if it needs to
5775260f7e9Sdrh  db close
5785260f7e9Sdrh  sqlite3 db test.db
5795260f7e9Sdrh  execsql {
5805260f7e9Sdrh    pragma index_list(t3);
5815260f7e9Sdrh  }
5825260f7e9Sdrh} {0 t3i1 0 1 sqlite_autoindex_t3_1 1}
58327188fb5Sdanielk1977} ;# ifcapable schema_pragmas
5846c62608fSdrhifcapable {utf16} {
5855260f7e9Sdrh  do_test pragma-7.2 {
5865260f7e9Sdrh    db close
5875260f7e9Sdrh    sqlite3 db test.db
5885260f7e9Sdrh    catchsql {
5895260f7e9Sdrh      pragma encoding=bogus;
5905260f7e9Sdrh    }
5915260f7e9Sdrh  } {1 {unsupported encoding: bogus}}
5926c62608fSdrh}
59353c0f748Sdanielk1977ifcapable tempdb {
5945260f7e9Sdrh  do_test pragma-7.3 {
5955260f7e9Sdrh    db close
5965260f7e9Sdrh    sqlite3 db test.db
5975260f7e9Sdrh    execsql {
5985260f7e9Sdrh      pragma lock_status;
5995260f7e9Sdrh    }
6005260f7e9Sdrh  } {main unlocked temp closed}
60153c0f748Sdanielk1977} else {
60253c0f748Sdanielk1977  do_test pragma-7.3 {
60353c0f748Sdanielk1977    db close
60453c0f748Sdanielk1977    sqlite3 db test.db
60553c0f748Sdanielk1977    execsql {
60653c0f748Sdanielk1977      pragma lock_status;
60753c0f748Sdanielk1977    }
60853c0f748Sdanielk1977  } {main unlocked}
60953c0f748Sdanielk1977}
6105260f7e9Sdrh
6115260f7e9Sdrh
612dae2495bSdanielk1977#----------------------------------------------------------------------
613b92b70bbSdanielk1977# Test cases pragma-8.* test the "PRAGMA schema_version" and "PRAGMA
614b92b70bbSdanielk1977# user_version" statements.
615dae2495bSdanielk1977#
616b92b70bbSdanielk1977# pragma-8.1: PRAGMA schema_version
617b92b70bbSdanielk1977# pragma-8.2: PRAGMA user_version
618dae2495bSdanielk1977#
619dae2495bSdanielk1977
62011cf9fbcSdanielk1977ifcapable schema_version {
62111cf9fbcSdanielk1977
622b92b70bbSdanielk1977# First check that we can set the schema version and then retrieve the
623dae2495bSdanielk1977# same value.
624dae2495bSdanielk1977do_test pragma-8.1.1 {
625dae2495bSdanielk1977  execsql {
626b92b70bbSdanielk1977    PRAGMA schema_version = 105;
627dae2495bSdanielk1977  }
628dae2495bSdanielk1977} {}
629dae2495bSdanielk1977do_test pragma-8.1.2 {
63025403650Sdrh  execsql2 {
631b92b70bbSdanielk1977    PRAGMA schema_version;
632dae2495bSdanielk1977  }
63325403650Sdrh} {schema_version 105}
634dae2495bSdanielk1977do_test pragma-8.1.3 {
635dae2495bSdanielk1977  execsql {
636b92b70bbSdanielk1977    PRAGMA schema_version = 106;
637dae2495bSdanielk1977  }
638dae2495bSdanielk1977} {}
639dae2495bSdanielk1977do_test pragma-8.1.4 {
640dae2495bSdanielk1977  execsql {
641b92b70bbSdanielk1977    PRAGMA schema_version;
642dae2495bSdanielk1977  }
643dae2495bSdanielk1977} 106
644dae2495bSdanielk1977
645b92b70bbSdanielk1977# Check that creating a table modifies the schema-version (this is really
646b92b70bbSdanielk1977# to verify that the value being read is in fact the schema version).
647dae2495bSdanielk1977do_test pragma-8.1.5 {
648dae2495bSdanielk1977  execsql {
649dae2495bSdanielk1977    CREATE TABLE t4(a, b, c);
650dae2495bSdanielk1977    INSERT INTO t4 VALUES(1, 2, 3);
651dae2495bSdanielk1977    SELECT * FROM t4;
652dae2495bSdanielk1977  }
653dae2495bSdanielk1977} {1 2 3}
654dae2495bSdanielk1977do_test pragma-8.1.6 {
655dae2495bSdanielk1977  execsql {
656b92b70bbSdanielk1977    PRAGMA schema_version;
657dae2495bSdanielk1977  }
658dae2495bSdanielk1977} 107
659dae2495bSdanielk1977
660dae2495bSdanielk1977# Now open a second connection to the database. Ensure that changing the
661b92b70bbSdanielk1977# schema-version using the first connection forces the second connection
662dae2495bSdanielk1977# to reload the schema. This has to be done using the C-API test functions,
663dae2495bSdanielk1977# because the TCL API accounts for SCHEMA_ERROR and retries the query.
664dae2495bSdanielk1977do_test pragma-8.1.7 {
665dddca286Sdrh  sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
666dae2495bSdanielk1977  execsql {
667dae2495bSdanielk1977    SELECT * FROM t4;
668dae2495bSdanielk1977  } db2
669dae2495bSdanielk1977} {1 2 3}
670dae2495bSdanielk1977do_test pragma-8.1.8 {
671dae2495bSdanielk1977  execsql {
672b92b70bbSdanielk1977    PRAGMA schema_version = 108;
673dae2495bSdanielk1977  }
674dae2495bSdanielk1977} {}
675dae2495bSdanielk1977do_test pragma-8.1.9 {
676dae2495bSdanielk1977  set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY]
677dae2495bSdanielk1977  sqlite3_step $::STMT
678dae2495bSdanielk1977} SQLITE_ERROR
679dae2495bSdanielk1977do_test pragma-8.1.10 {
680dae2495bSdanielk1977  sqlite3_finalize $::STMT
681dae2495bSdanielk1977} SQLITE_SCHEMA
682dae2495bSdanielk1977
683b92b70bbSdanielk1977# Make sure the schema-version can be manipulated in an attached database.
684dae2495bSdanielk1977file delete -force test2.db
685dae2495bSdanielk1977file delete -force test2.db-journal
6865a8f9374Sdanielk1977ifcapable attach {
687dae2495bSdanielk1977  do_test pragma-8.1.11 {
688dae2495bSdanielk1977    execsql {
689dae2495bSdanielk1977      ATTACH 'test2.db' AS aux;
690dae2495bSdanielk1977      CREATE TABLE aux.t1(a, b, c);
691b92b70bbSdanielk1977      PRAGMA aux.schema_version = 205;
692dae2495bSdanielk1977    }
693dae2495bSdanielk1977  } {}
694dae2495bSdanielk1977  do_test pragma-8.1.12 {
695dae2495bSdanielk1977    execsql {
696b92b70bbSdanielk1977      PRAGMA aux.schema_version;
697dae2495bSdanielk1977    }
698dae2495bSdanielk1977  } 205
6995a8f9374Sdanielk1977}
700dae2495bSdanielk1977do_test pragma-8.1.13 {
701dae2495bSdanielk1977  execsql {
702b92b70bbSdanielk1977    PRAGMA schema_version;
703dae2495bSdanielk1977  }
704dae2495bSdanielk1977} 108
705dae2495bSdanielk1977
706b92b70bbSdanielk1977# And check that modifying the schema-version in an attached database
707dae2495bSdanielk1977# forces the second connection to reload the schema.
7085a8f9374Sdanielk1977ifcapable attach {
709dae2495bSdanielk1977  do_test pragma-8.1.14 {
710dddca286Sdrh    sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
711dae2495bSdanielk1977    execsql {
712dae2495bSdanielk1977      ATTACH 'test2.db' AS aux;
713dae2495bSdanielk1977      SELECT * FROM aux.t1;
714dae2495bSdanielk1977    } db2
715dae2495bSdanielk1977  } {}
716dae2495bSdanielk1977  do_test pragma-8.1.15 {
717dae2495bSdanielk1977    execsql {
718b92b70bbSdanielk1977      PRAGMA aux.schema_version = 206;
719dae2495bSdanielk1977    }
720dae2495bSdanielk1977  } {}
721dae2495bSdanielk1977  do_test pragma-8.1.16 {
722dae2495bSdanielk1977    set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY]
723dae2495bSdanielk1977    sqlite3_step $::STMT
724dae2495bSdanielk1977  } SQLITE_ERROR
725dae2495bSdanielk1977  do_test pragma-8.1.17 {
726dae2495bSdanielk1977    sqlite3_finalize $::STMT
727dae2495bSdanielk1977  } SQLITE_SCHEMA
728dae2495bSdanielk1977  do_test pragma-8.1.18 {
729dae2495bSdanielk1977    db2 close
730dae2495bSdanielk1977  } {}
7315a8f9374Sdanielk1977}
732dae2495bSdanielk1977
733b92b70bbSdanielk1977# Now test that the user-version can be read and written (and that we aren't
734b92b70bbSdanielk1977# accidentally manipulating the schema-version instead).
735dae2495bSdanielk1977do_test pragma-8.2.1 {
73625403650Sdrh  execsql2 {
737b92b70bbSdanielk1977    PRAGMA user_version;
738dae2495bSdanielk1977  }
73925403650Sdrh} {user_version 0}
740dae2495bSdanielk1977do_test pragma-8.2.2 {
741dae2495bSdanielk1977  execsql {
742b92b70bbSdanielk1977    PRAGMA user_version = 2;
743dae2495bSdanielk1977  }
744dae2495bSdanielk1977} {}
745802d69a7Sdrhdo_test pragma-8.2.3.1 {
74625403650Sdrh  execsql2 {
747b92b70bbSdanielk1977    PRAGMA user_version;
748dae2495bSdanielk1977  }
74925403650Sdrh} {user_version 2}
750802d69a7Sdrhdo_test pragma-8.2.3.2 {
751802d69a7Sdrh  db close
752802d69a7Sdrh  sqlite3 db test.db
753802d69a7Sdrh  execsql {
754802d69a7Sdrh    PRAGMA user_version;
755802d69a7Sdrh  }
756802d69a7Sdrh} {2}
757802d69a7Sdrhdo_test pragma-8.2.4.1 {
758dae2495bSdanielk1977  execsql {
759b92b70bbSdanielk1977    PRAGMA schema_version;
760dae2495bSdanielk1977  }
761dae2495bSdanielk1977} {108}
762802d69a7Sdrhifcapable vacuum {
763802d69a7Sdrh  do_test pragma-8.2.4.2 {
764802d69a7Sdrh    execsql {
765802d69a7Sdrh      VACUUM;
766802d69a7Sdrh      PRAGMA user_version;
767802d69a7Sdrh    }
768802d69a7Sdrh  } {2}
769802d69a7Sdrh  do_test pragma-8.2.4.3 {
770802d69a7Sdrh    execsql {
771802d69a7Sdrh      PRAGMA schema_version;
772802d69a7Sdrh    }
773802d69a7Sdrh  } {109}
774802d69a7Sdrh}
7755a8f9374Sdanielk1977
7765a8f9374Sdanielk1977ifcapable attach {
777802d69a7Sdrh  db eval {ATTACH 'test2.db' AS aux}
778dae2495bSdanielk1977
779b92b70bbSdanielk1977  # Check that the user-version in the auxilary database can be manipulated (
780dae2495bSdanielk1977  # and that we aren't accidentally manipulating the same in the main db).
781dae2495bSdanielk1977  do_test pragma-8.2.5 {
782dae2495bSdanielk1977    execsql {
783b92b70bbSdanielk1977      PRAGMA aux.user_version;
784dae2495bSdanielk1977    }
785dae2495bSdanielk1977  } {0}
786dae2495bSdanielk1977  do_test pragma-8.2.6 {
787dae2495bSdanielk1977    execsql {
788b92b70bbSdanielk1977      PRAGMA aux.user_version = 3;
789dae2495bSdanielk1977    }
790dae2495bSdanielk1977  } {}
791dae2495bSdanielk1977  do_test pragma-8.2.7 {
792dae2495bSdanielk1977    execsql {
793b92b70bbSdanielk1977      PRAGMA aux.user_version;
794dae2495bSdanielk1977    }
795dae2495bSdanielk1977  } {3}
796dae2495bSdanielk1977  do_test pragma-8.2.8 {
797dae2495bSdanielk1977    execsql {
798b92b70bbSdanielk1977      PRAGMA main.user_version;
799dae2495bSdanielk1977    }
800dae2495bSdanielk1977  } {2}
801dae2495bSdanielk1977
802b92b70bbSdanielk1977  # Now check that a ROLLBACK resets the user-version if it has been modified
803dae2495bSdanielk1977  # within a transaction.
804dae2495bSdanielk1977  do_test pragma-8.2.9 {
805dae2495bSdanielk1977    execsql {
806dae2495bSdanielk1977      BEGIN;
807b92b70bbSdanielk1977      PRAGMA aux.user_version = 10;
808b92b70bbSdanielk1977      PRAGMA user_version = 11;
809dae2495bSdanielk1977    }
810dae2495bSdanielk1977  } {}
811dae2495bSdanielk1977  do_test pragma-8.2.10 {
812dae2495bSdanielk1977    execsql {
813b92b70bbSdanielk1977      PRAGMA aux.user_version;
814dae2495bSdanielk1977    }
815dae2495bSdanielk1977  } {10}
816dae2495bSdanielk1977  do_test pragma-8.2.11 {
817dae2495bSdanielk1977    execsql {
818b92b70bbSdanielk1977      PRAGMA main.user_version;
819dae2495bSdanielk1977    }
820dae2495bSdanielk1977  } {11}
821dae2495bSdanielk1977  do_test pragma-8.2.12 {
822dae2495bSdanielk1977    execsql {
823dae2495bSdanielk1977      ROLLBACK;
824b92b70bbSdanielk1977      PRAGMA aux.user_version;
825dae2495bSdanielk1977    }
826dae2495bSdanielk1977  } {3}
827dae2495bSdanielk1977  do_test pragma-8.2.13 {
828dae2495bSdanielk1977    execsql {
829b92b70bbSdanielk1977      PRAGMA main.user_version;
830dae2495bSdanielk1977    }
831dae2495bSdanielk1977  } {2}
8325a8f9374Sdanielk1977}
833dae2495bSdanielk1977
834b92b70bbSdanielk1977# Try a negative value for the user-version
835dae2495bSdanielk1977do_test pragma-8.2.14 {
836dae2495bSdanielk1977  execsql {
837b92b70bbSdanielk1977    PRAGMA user_version = -450;
838dae2495bSdanielk1977  }
839dae2495bSdanielk1977} {}
840dae2495bSdanielk1977do_test pragma-8.2.15 {
841dae2495bSdanielk1977  execsql {
842b92b70bbSdanielk1977    PRAGMA user_version;
843dae2495bSdanielk1977  }
844dae2495bSdanielk1977} {-450}
845d9c847dcSdanielk1977} ; # ifcapable schema_version
846d9c847dcSdanielk1977
847d19744f3Sdrh# Check to see if TEMP_STORE is memory or disk.  Return strings
848d19744f3Sdrh# "memory" or "disk" as appropriate.
849d19744f3Sdrh#
850d19744f3Sdrhproc check_temp_store {} {
851d19744f3Sdrh  db eval {CREATE TEMP TABLE IF NOT EXISTS a(b)}
852d19744f3Sdrh  db eval {PRAGMA database_list} {
853d19744f3Sdrh    if {$name=="temp"} {
85417b90b53Sdanielk1977      set bt [btree_from_db db 1]
85517b90b53Sdanielk1977      if {[btree_ismemdb $bt]} {
856d19744f3Sdrh        return "memory"
857d19744f3Sdrh      }
85817b90b53Sdanielk1977      return "disk"
859d19744f3Sdrh    }
860d19744f3Sdrh  }
861d19744f3Sdrh  return "unknown"
862d19744f3Sdrh}
863d19744f3Sdrh
8649a09a3caStpoindex
8659a09a3caStpoindex# Test temp_store and temp_store_directory pragmas
8669a09a3caStpoindex#
867268283bcSdrhifcapable pager_pragmas {
8689a09a3caStpoindexdo_test pragma-9.1 {
8699a09a3caStpoindex  db close
8709a09a3caStpoindex  sqlite3 db test.db
8719a09a3caStpoindex  execsql {
8729a09a3caStpoindex    PRAGMA temp_store;
8739a09a3caStpoindex  }
8749a09a3caStpoindex} {0}
875d19744f3Sdrhif {$TEMP_STORE<=1} {
876d19744f3Sdrh  do_test pragma-9.1.1 {
877d19744f3Sdrh    check_temp_store
878d19744f3Sdrh  } {disk}
879d19744f3Sdrh} else {
880d19744f3Sdrh  do_test pragma-9.1.1 {
881d19744f3Sdrh    check_temp_store
882d19744f3Sdrh  } {memory}
883d19744f3Sdrh}
884d19744f3Sdrh
8859a09a3caStpoindexdo_test pragma-9.2 {
886d19744f3Sdrh  db close
887d19744f3Sdrh  sqlite3 db test.db
8889a09a3caStpoindex  execsql {
8899a09a3caStpoindex    PRAGMA temp_store=file;
8909a09a3caStpoindex    PRAGMA temp_store;
8919a09a3caStpoindex  }
8929a09a3caStpoindex} {1}
893d19744f3Sdrhif {$TEMP_STORE==3} {
894d19744f3Sdrh  # When TEMP_STORE is 3, always use memory regardless of pragma settings.
895d19744f3Sdrh  do_test pragma-9.2.1 {
896d19744f3Sdrh    check_temp_store
897d19744f3Sdrh  } {memory}
898d19744f3Sdrh} else {
899d19744f3Sdrh  do_test pragma-9.2.1 {
900d19744f3Sdrh    check_temp_store
901d19744f3Sdrh  } {disk}
902d19744f3Sdrh}
903d19744f3Sdrh
9049a09a3caStpoindexdo_test pragma-9.3 {
905d19744f3Sdrh  db close
906d19744f3Sdrh  sqlite3 db test.db
9079a09a3caStpoindex  execsql {
9089a09a3caStpoindex    PRAGMA temp_store=memory;
9099a09a3caStpoindex    PRAGMA temp_store;
9109a09a3caStpoindex  }
9119a09a3caStpoindex} {2}
912d19744f3Sdrhif {$TEMP_STORE==0} {
913d19744f3Sdrh  # When TEMP_STORE is 0, always use the disk regardless of pragma settings.
914d19744f3Sdrh  do_test pragma-9.3.1 {
915d19744f3Sdrh    check_temp_store
916d19744f3Sdrh  } {disk}
917d19744f3Sdrh} else {
918d19744f3Sdrh  do_test pragma-9.3.1 {
919d19744f3Sdrh    check_temp_store
920d19744f3Sdrh  } {memory}
921d19744f3Sdrh}
922d19744f3Sdrh
9239a09a3caStpoindexdo_test pragma-9.4 {
9249a09a3caStpoindex  execsql {
9259a09a3caStpoindex    PRAGMA temp_store_directory;
9269a09a3caStpoindex  }
9279a09a3caStpoindex} {}
92878f82d1eSdrhifcapable wsd {
9299a09a3caStpoindex  do_test pragma-9.5 {
930*181ddaa1Sdanielk1977    set pwd [string map {' ''} [file nativename [pwd]]]
931268283bcSdrh    execsql "
932268283bcSdrh      PRAGMA temp_store_directory='$pwd';
9339a09a3caStpoindex    "
9349a09a3caStpoindex  } {}
9359a09a3caStpoindex  do_test pragma-9.6 {
9369a09a3caStpoindex    execsql {
9379a09a3caStpoindex      PRAGMA temp_store_directory;
9389a09a3caStpoindex    }
939*181ddaa1Sdanielk1977  } [list [file nativename [pwd]]]
9409a09a3caStpoindex  do_test pragma-9.7 {
941268283bcSdrh    catchsql {
9429a09a3caStpoindex      PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR';
9439a09a3caStpoindex    }
944268283bcSdrh  } {1 {not a writable directory}}
9459a09a3caStpoindex  do_test pragma-9.8 {
9469a09a3caStpoindex    execsql {
9479a09a3caStpoindex      PRAGMA temp_store_directory='';
9489a09a3caStpoindex    }
9499a09a3caStpoindex  } {}
9501e9daa6aSdrh  if {![info exists TEMP_STORE] || $TEMP_STORE<=1} {
95153c0f748Sdanielk1977    ifcapable tempdb {
9529a09a3caStpoindex      do_test pragma-9.9 {
9539a09a3caStpoindex        execsql {
9549a09a3caStpoindex          PRAGMA temp_store_directory;
9559a09a3caStpoindex          PRAGMA temp_store=FILE;
9569a09a3caStpoindex          CREATE TEMP TABLE temp_store_directory_test(a integer);
9579a09a3caStpoindex          INSERT INTO temp_store_directory_test values (2);
9589a09a3caStpoindex          SELECT * FROM temp_store_directory_test;
9599a09a3caStpoindex        }
9609a09a3caStpoindex      } {2}
9619a09a3caStpoindex      do_test pragma-9.10 {
962268283bcSdrh        catchsql "
963268283bcSdrh          PRAGMA temp_store_directory='$pwd';
9649a09a3caStpoindex          SELECT * FROM temp_store_directory_test;
9659a09a3caStpoindex        "
966268283bcSdrh      } {1 {no such table: temp_store_directory_test}}
9671e9daa6aSdrh    }
9681e9daa6aSdrh  }
96978f82d1eSdrh}
97095b289b6Sdanielk1977do_test pragma-9.11 {
97195b289b6Sdanielk1977  execsql {
97295b289b6Sdanielk1977    PRAGMA temp_store = 0;
97395b289b6Sdanielk1977    PRAGMA temp_store;
97495b289b6Sdanielk1977  }
97595b289b6Sdanielk1977} {0}
97695b289b6Sdanielk1977do_test pragma-9.12 {
97795b289b6Sdanielk1977  execsql {
97895b289b6Sdanielk1977    PRAGMA temp_store = 1;
97995b289b6Sdanielk1977    PRAGMA temp_store;
98095b289b6Sdanielk1977  }
98195b289b6Sdanielk1977} {1}
98295b289b6Sdanielk1977do_test pragma-9.13 {
98395b289b6Sdanielk1977  execsql {
98495b289b6Sdanielk1977    PRAGMA temp_store = 2;
98595b289b6Sdanielk1977    PRAGMA temp_store;
98695b289b6Sdanielk1977  }
98795b289b6Sdanielk1977} {2}
98895b289b6Sdanielk1977do_test pragma-9.14 {
98995b289b6Sdanielk1977  execsql {
99095b289b6Sdanielk1977    PRAGMA temp_store = 3;
99195b289b6Sdanielk1977    PRAGMA temp_store;
99295b289b6Sdanielk1977  }
99395b289b6Sdanielk1977} {0}
99495b289b6Sdanielk1977do_test pragma-9.15 {
99595b289b6Sdanielk1977  catchsql {
99695b289b6Sdanielk1977    BEGIN EXCLUSIVE;
99795b289b6Sdanielk1977    CREATE TEMP TABLE temp_table(t);
99895b289b6Sdanielk1977    INSERT INTO temp_table VALUES('valuable data');
99995b289b6Sdanielk1977    PRAGMA temp_store = 1;
100095b289b6Sdanielk1977  }
100195b289b6Sdanielk1977} {1 {temporary storage cannot be changed from within a transaction}}
100295b289b6Sdanielk1977do_test pragma-9.16 {
100395b289b6Sdanielk1977  execsql {
100495b289b6Sdanielk1977    SELECT * FROM temp_table;
100595b289b6Sdanielk1977    COMMIT;
100695b289b6Sdanielk1977  }
100795b289b6Sdanielk1977} {{valuable data}}
1008983e2309Sdanielk1977
1009983e2309Sdanielk1977do_test pragma-9.17 {
1010983e2309Sdanielk1977  execsql {
1011983e2309Sdanielk1977    INSERT INTO temp_table VALUES('valuable data II');
1012983e2309Sdanielk1977    SELECT * FROM temp_table;
1013983e2309Sdanielk1977  }
1014983e2309Sdanielk1977} {{valuable data} {valuable data II}}
1015983e2309Sdanielk1977
1016983e2309Sdanielk1977do_test pragma-9.18 {
1017983e2309Sdanielk1977  set rc [catch {
1018983e2309Sdanielk1977    db eval {SELECT t FROM temp_table} {
1019983e2309Sdanielk1977      execsql {pragma temp_store = 1}
1020983e2309Sdanielk1977    }
1021983e2309Sdanielk1977  } msg]
1022983e2309Sdanielk1977  list $rc $msg
1023983e2309Sdanielk1977} {1 {temporary storage cannot be changed from within a transaction}}
1024983e2309Sdanielk1977
1025268283bcSdrh} ;# ifcapable pager_pragmas
10269a09a3caStpoindex
1027cc6bd383Sdanielk1977ifcapable trigger {
1028cc6bd383Sdanielk1977
1029cc6bd383Sdanielk1977do_test pragma-10.0 {
1030cc6bd383Sdanielk1977  catchsql {
1031cc6bd383Sdanielk1977    DROP TABLE main.t1;
1032cc6bd383Sdanielk1977  }
1033cc6bd383Sdanielk1977  execsql {
1034cc6bd383Sdanielk1977    PRAGMA count_changes = 1;
1035cc6bd383Sdanielk1977
1036cc6bd383Sdanielk1977    CREATE TABLE t1(a PRIMARY KEY);
1037cc6bd383Sdanielk1977    CREATE TABLE t1_mirror(a);
1038cc6bd383Sdanielk1977    CREATE TABLE t1_mirror2(a);
1039cc6bd383Sdanielk1977    CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN
1040cc6bd383Sdanielk1977      INSERT INTO t1_mirror VALUES(new.a);
1041cc6bd383Sdanielk1977    END;
1042cc6bd383Sdanielk1977    CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN
1043cc6bd383Sdanielk1977      INSERT INTO t1_mirror2 VALUES(new.a);
1044cc6bd383Sdanielk1977    END;
1045cc6bd383Sdanielk1977    CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN
1046cc6bd383Sdanielk1977      UPDATE t1_mirror SET a = new.a WHERE a = old.a;
1047cc6bd383Sdanielk1977    END;
1048cc6bd383Sdanielk1977    CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN
1049cc6bd383Sdanielk1977      UPDATE t1_mirror2 SET a = new.a WHERE a = old.a;
1050cc6bd383Sdanielk1977    END;
1051cc6bd383Sdanielk1977    CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN
1052cc6bd383Sdanielk1977      DELETE FROM t1_mirror WHERE a = old.a;
1053cc6bd383Sdanielk1977    END;
1054cc6bd383Sdanielk1977    CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN
1055cc6bd383Sdanielk1977      DELETE FROM t1_mirror2 WHERE a = old.a;
1056cc6bd383Sdanielk1977    END;
1057cc6bd383Sdanielk1977  }
1058cc6bd383Sdanielk1977} {}
1059cc6bd383Sdanielk1977
1060cc6bd383Sdanielk1977do_test pragma-10.1 {
1061cc6bd383Sdanielk1977  execsql {
1062cc6bd383Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,10));
1063cc6bd383Sdanielk1977  }
1064cc6bd383Sdanielk1977} {1}
1065cc6bd383Sdanielk1977do_test pragma-10.2 {
1066cc6bd383Sdanielk1977  execsql {
1067cc6bd383Sdanielk1977    UPDATE t1 SET a = randstr(10,10);
1068cc6bd383Sdanielk1977  }
1069cc6bd383Sdanielk1977} {1}
1070cc6bd383Sdanielk1977do_test pragma-10.3 {
1071cc6bd383Sdanielk1977  execsql {
1072cc6bd383Sdanielk1977    DELETE FROM t1;
1073cc6bd383Sdanielk1977  }
1074cc6bd383Sdanielk1977} {1}
1075cc6bd383Sdanielk1977
1076cc6bd383Sdanielk1977} ;# ifcapable trigger
1077cc6bd383Sdanielk1977
107848af65aeSdanielk1977ifcapable schema_pragmas {
107948af65aeSdanielk1977  do_test pragma-11.1 {
108048af65aeSdanielk1977    execsql2 {
108148af65aeSdanielk1977      pragma collation_list;
108248af65aeSdanielk1977    }
10839b5adfa2Sdrh  } {seq 0 name NOCASE seq 1 name RTRIM seq 2 name BINARY}
108448af65aeSdanielk1977  do_test pragma-11.2 {
108548af65aeSdanielk1977    db collate New_Collation blah...
108648af65aeSdanielk1977    execsql {
108748af65aeSdanielk1977      pragma collation_list;
108848af65aeSdanielk1977    }
10899b5adfa2Sdrh  } {0 New_Collation 1 NOCASE 2 RTRIM 3 BINARY}
109048af65aeSdanielk1977}
109148af65aeSdanielk1977
1092ddfb2f03Sdanielk1977ifcapable schema_pragmas&&tempdb {
1093ddfb2f03Sdanielk1977  do_test pragma-12.1 {
1094ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1095ddfb2f03Sdanielk1977    execsql {
1096ddfb2f03Sdanielk1977      PRAGMA temp.table_info('abc');
1097ddfb2f03Sdanielk1977    } db2
1098ddfb2f03Sdanielk1977  } {}
1099ddfb2f03Sdanielk1977  db2 close
1100ddfb2f03Sdanielk1977
1101ddfb2f03Sdanielk1977  do_test pragma-12.2 {
1102ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1103ddfb2f03Sdanielk1977    execsql {
1104ddfb2f03Sdanielk1977      PRAGMA temp.default_cache_size = 200;
1105ddfb2f03Sdanielk1977      PRAGMA temp.default_cache_size;
1106ddfb2f03Sdanielk1977    } db2
1107ddfb2f03Sdanielk1977  } {200}
1108ddfb2f03Sdanielk1977  db2 close
1109ddfb2f03Sdanielk1977
1110ddfb2f03Sdanielk1977  do_test pragma-12.3 {
1111ddfb2f03Sdanielk1977    sqlite3 db2 test.db
1112ddfb2f03Sdanielk1977    execsql {
1113ddfb2f03Sdanielk1977      PRAGMA temp.cache_size = 400;
1114ddfb2f03Sdanielk1977      PRAGMA temp.cache_size;
1115ddfb2f03Sdanielk1977    } db2
1116ddfb2f03Sdanielk1977  } {400}
1117ddfb2f03Sdanielk1977  db2 close
1118ddfb2f03Sdanielk1977}
1119ddfb2f03Sdanielk1977
11204b2688abSdanielk1977ifcapable bloblit {
11214b2688abSdanielk1977
112205a82983Sdrhdo_test pragma-13.1 {
112305a82983Sdrh  execsql {
112405a82983Sdrh    DROP TABLE IF EXISTS t4;
112505a82983Sdrh    PRAGMA vdbe_trace=on;
112605a82983Sdrh    PRAGMA vdbe_listing=on;
112705a82983Sdrh    PRAGMA sql_trace=on;
112805a82983Sdrh    CREATE TABLE t4(a INTEGER PRIMARY KEY,b);
112905a82983Sdrh    INSERT INTO t4(b) VALUES(x'0123456789abcdef0123456789abcdef0123456789');
113005a82983Sdrh    INSERT INTO t4(b) VALUES(randstr(30,30));
113105a82983Sdrh    INSERT INTO t4(b) VALUES(1.23456);
113205a82983Sdrh    INSERT INTO t4(b) VALUES(NULL);
113305a82983Sdrh    INSERT INTO t4(b) VALUES(0);
113405a82983Sdrh    INSERT INTO t4(b) SELECT b||b||b||b FROM t4;
113505a82983Sdrh    SELECT * FROM t4;
113605a82983Sdrh  }
113705a82983Sdrh  execsql {
113805a82983Sdrh    PRAGMA vdbe_trace=off;
113905a82983Sdrh    PRAGMA vdbe_listing=off;
114005a82983Sdrh    PRAGMA sql_trace=off;
114105a82983Sdrh  }
114205a82983Sdrh} {}
114305a82983Sdrh
11444b2688abSdanielk1977} ;# ifcapable bloblit
11454b2688abSdanielk1977
114659a93791Sdanielk1977ifcapable pager_pragmas {
114759a93791Sdanielk1977  db close
114859a93791Sdanielk1977  file delete -force test.db
114959a93791Sdanielk1977  sqlite3 db test.db
115059a93791Sdanielk1977
115159a93791Sdanielk1977  do_test pragma-14.1 {
115259a93791Sdanielk1977    execsql { pragma auto_vacuum = 0 }
115359a93791Sdanielk1977    execsql { pragma page_count }
115459a93791Sdanielk1977  } {0}
115559a93791Sdanielk1977
115659a93791Sdanielk1977  do_test pragma-14.2 {
115759a93791Sdanielk1977    execsql {
115859a93791Sdanielk1977      CREATE TABLE abc(a, b, c);
115959a93791Sdanielk1977      PRAGMA page_count;
116059a93791Sdanielk1977    }
116159a93791Sdanielk1977  } {2}
116259a93791Sdanielk1977
116359a93791Sdanielk1977  do_test pragma-14.3 {
116459a93791Sdanielk1977    execsql {
116559a93791Sdanielk1977      BEGIN;
116659a93791Sdanielk1977      CREATE TABLE def(a, b, c);
116759a93791Sdanielk1977      PRAGMA page_count;
116859a93791Sdanielk1977    }
116959a93791Sdanielk1977  } {3}
117059a93791Sdanielk1977
117159a93791Sdanielk1977  do_test pragma-14.4 {
117259a93791Sdanielk1977    set page_size [db one {pragma page_size}]
117359a93791Sdanielk1977    expr [file size test.db] / $page_size
117459a93791Sdanielk1977  } {2}
117559a93791Sdanielk1977
117659a93791Sdanielk1977  do_test pragma-14.5 {
117759a93791Sdanielk1977    execsql {
117859a93791Sdanielk1977      ROLLBACK;
117959a93791Sdanielk1977      PRAGMA page_count;
118059a93791Sdanielk1977    }
118159a93791Sdanielk1977  } {2}
118259a93791Sdanielk1977
118359a93791Sdanielk1977  do_test pragma-14.6 {
118459a93791Sdanielk1977    file delete -force test2.db
118559a93791Sdanielk1977    sqlite3 db2 test2.db
118659a93791Sdanielk1977    execsql {
118759a93791Sdanielk1977      PRAGMA auto_vacuum = 0;
118859a93791Sdanielk1977      CREATE TABLE t1(a, b, c);
118959a93791Sdanielk1977      CREATE TABLE t2(a, b, c);
119059a93791Sdanielk1977      CREATE TABLE t3(a, b, c);
119159a93791Sdanielk1977      CREATE TABLE t4(a, b, c);
119259a93791Sdanielk1977    } db2
119359a93791Sdanielk1977    db2 close
119459a93791Sdanielk1977    execsql {
119559a93791Sdanielk1977      ATTACH 'test2.db' AS aux;
119659a93791Sdanielk1977      PRAGMA aux.page_count;
119759a93791Sdanielk1977    }
119859a93791Sdanielk1977  } {5}
119959a93791Sdanielk1977}
120059a93791Sdanielk1977
12018cf6c554Sdanielk1977# Test that the value set using the cache_size pragma is not reset when the
12028cf6c554Sdanielk1977# schema is reloaded.
12038cf6c554Sdanielk1977#
12048cf6c554Sdanielk1977ifcapable pager_pragmas {
12058cf6c554Sdanielk1977  db close
12068cf6c554Sdanielk1977  sqlite3 db test.db
12078cf6c554Sdanielk1977  do_test pragma-15.1 {
12088cf6c554Sdanielk1977    execsql {
12098cf6c554Sdanielk1977      PRAGMA cache_size=59;
12108cf6c554Sdanielk1977      PRAGMA cache_size;
12118cf6c554Sdanielk1977    }
12128cf6c554Sdanielk1977  } {59}
12138cf6c554Sdanielk1977  do_test pragma-15.2 {
12148cf6c554Sdanielk1977    sqlite3 db2 test.db
12158cf6c554Sdanielk1977    execsql {
12168cf6c554Sdanielk1977      CREATE TABLE newtable(a, b, c);
12178cf6c554Sdanielk1977    } db2
12188cf6c554Sdanielk1977    db2 close
12198cf6c554Sdanielk1977  } {}
12208cf6c554Sdanielk1977  do_test pragma-15.3 {
12218cf6c554Sdanielk1977    # Evaluating this statement will cause the schema to be reloaded (because
12228cf6c554Sdanielk1977    # the schema was changed by another connection in pragma-15.2). At one
12238cf6c554Sdanielk1977    # point there was a bug that reset the cache_size to its default value
12248cf6c554Sdanielk1977    # when this happened.
12258cf6c554Sdanielk1977    execsql { SELECT * FROM sqlite_master }
12268cf6c554Sdanielk1977    execsql { PRAGMA cache_size }
12278cf6c554Sdanielk1977  } {59}
12288cf6c554Sdanielk1977}
12298cf6c554Sdanielk1977
12305558a8a6Sdanielk1977# Reset the sqlite3_temp_directory variable for the next run of tests:
12315558a8a6Sdanielk1977sqlite3 dbX :memory:
12325558a8a6Sdanielk1977dbX eval {PRAGMA temp_store_directory = ""}
12335558a8a6Sdanielk1977dbX close
12345558a8a6Sdanielk1977
1235cd61c281Sdrhfinish_test
1236