Roll src/third_party/WebKit a3b4a2e:7441784 (svn 202551:202552)
[chromium-blink-merge.git] / third_party / sqlite / src / test / pragma2.test
blob0dbc9777d261ffe8d7d770f3bf395fc1df9cd150
1 # 2002 March 6
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
6 #    May you do good and not evil.
7 #    May you find forgiveness for yourself and forgive others.
8 #    May you share freely, never taking more than you give.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
13 # This file implements tests for the PRAGMA command.
15 # $Id: pragma2.test,v 1.4 2007/10/09 08:29:33 danielk1977 Exp $
17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl
20 # Test organization:
22 # pragma2-1.*: Test freelist_count pragma on the main database.
23 # pragma2-2.*: Test freelist_count pragma on an attached database.
24 # pragma2-3.*: Test trying to write to the freelist_count is a no-op.
25 # pragma2-4.*: Tests for PRAGMA cache_spill
28 ifcapable !pragma||!schema_pragmas {
29   finish_test
30   return
33 # Delete the preexisting database to avoid the special setup
34 # that the "all.test" script does.
36 db close
37 delete_file test.db test.db-journal
38 delete_file test3.db test3.db-journal
39 sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
40 db eval {PRAGMA auto_vacuum=0}
42 do_test pragma2-1.1 {
43   execsql {
44     PRAGMA freelist_count;
45   }
46 } {0}
47 do_test pragma2-1.2 {
48   execsql {
49     CREATE TABLE abc(a, b, c);
50     PRAGMA freelist_count;
51   }
52 } {0}
53 do_test pragma2-1.3 {
54   execsql {
55     DROP TABLE abc;
56     PRAGMA freelist_count;
57   }
58 } {1}
59 do_test pragma2-1.4 {
60   execsql {
61     PRAGMA main.freelist_count;
62   }
63 } {1}
65 forcedelete test2.db
66 forcedelete test2.db-journal
68 ifcapable attach {
69   do_test pragma2-2.1 {
70     execsql {
71       ATTACH 'test2.db' AS aux;
72       PRAGMA aux.auto_vacuum=OFF;
73       PRAGMA aux.freelist_count;
74     }
75   } {0}
76   do_test pragma2-2.2 {
77     execsql {
78       CREATE TABLE aux.abc(a, b, c);
79       PRAGMA aux.freelist_count;
80     }
81   } {0}
82   do_test pragma2-2.3 {
83     set ::val [string repeat 0123456789 1000]
84     execsql {
85       INSERT INTO aux.abc VALUES(1, 2, $::val);
86       PRAGMA aux.freelist_count;
87     }
88   } {0}
89   do_test pragma2-2.4 {
90     expr {[file size test2.db] / 1024}
91   } {11}
92   do_test pragma2-2.5 {
93     execsql {
94       DELETE FROM aux.abc;
95       PRAGMA aux.freelist_count;
96     }
97   } {9}
98   
99   do_test pragma2-3.1 {
100     execsql {
101       PRAGMA aux.freelist_count;
102       PRAGMA main.freelist_count;
103       PRAGMA freelist_count;
104     }
105   } {9 1 1}
106   do_test pragma2-3.2 {
107     execsql {
108       PRAGMA freelist_count = 500;
109       PRAGMA freelist_count;
110     }
111   } {1 1}
112   do_test pragma2-3.3 {
113     execsql {
114       PRAGMA aux.freelist_count = 500;
115       PRAGMA aux.freelist_count;
116     }
117   } {9 9}
120 # Default setting of PRAGMA cache_spill is always ON
122 # EVIDENCE-OF: R-51036-62828 PRAGMA cache_spill; PRAGMA
123 # cache_spill=boolean;
125 # EVIDENCE-OF: R-23955-02765 Cache_spill is enabled by default
127 db close
128 delete_file test.db test.db-journal
129 delete_file test2.db test2.db-journal
130 sqlite3 db test.db
131 do_execsql_test pragma2-4.1 {
132   PRAGMA cache_spill;
133   PRAGMA main.cache_spill;
134   PRAGMA temp.cache_spill;
135 } {1 1 1}
136 do_execsql_test pragma2-4.2 {
137   PRAGMA cache_spill=OFF;
138   PRAGMA cache_spill;
139   PRAGMA main.cache_spill;
140   PRAGMA temp.cache_spill;
141 } {0 0 0}
142 do_execsql_test pragma2-4.3 {
143   PRAGMA page_size=1024;
144   PRAGMA cache_size=50;
145   BEGIN;
146   CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d);
147   INSERT INTO t1 VALUES(1, randomblob(400), 1, randomblob(400));
148   INSERT INTO t1 SELECT a+1, randomblob(400), a+1, randomblob(400) FROM t1;
149   INSERT INTO t1 SELECT a+2, randomblob(400), a+2, randomblob(400) FROM t1;
150   INSERT INTO t1 SELECT a+4, randomblob(400), a+4, randomblob(400) FROM t1;
151   INSERT INTO t1 SELECT a+8, randomblob(400), a+8, randomblob(400) FROM t1;
152   INSERT INTO t1 SELECT a+16, randomblob(400), a+16, randomblob(400) FROM t1;
153   INSERT INTO t1 SELECT a+32, randomblob(400), a+32, randomblob(400) FROM t1;
154   INSERT INTO t1 SELECT a+64, randomblob(400), a+64, randomblob(400) FROM t1;
155   COMMIT;
156   ATTACH 'test2.db' AS aux1;
157   CREATE TABLE aux1.t2(a INTEGER PRIMARY KEY, b, c, d);
158   INSERT INTO t2 SELECT * FROM t1;
159   DETACH aux1;
160   PRAGMA cache_spill=ON;
161 } {}
162 sqlite3_release_memory
164 # EVIDENCE-OF: R-07634-40532 The cache_spill pragma enables or disables
165 # the ability of the pager to spill dirty cache pages to the database
166 # file in the middle of a transaction.
168 do_test pragma2-4.4 {
169   db eval {
170     BEGIN;
171     UPDATE t1 SET c=c+1;
172     PRAGMA lock_status;
173   }
174 } {main exclusive temp unknown}  ;# EXCLUSIVE lock due to cache spill
175 do_test pragma2-4.5 {
176   db eval {
177     COMMIT;
178     PRAGMA cache_spill=OFF;
179     BEGIN;
180     UPDATE t1 SET c=c-1;
181     PRAGMA lock_status;
182   }
183 } {main reserved temp unknown}   ;# No cache spill, so no exclusive lock
185 # Verify that newly attached databases inherit the cache_spill=OFF
186 # setting.
188 do_execsql_test pragma2-4.6 {
189   COMMIT;
190   ATTACH 'test2.db' AS aux1;
191   PRAGMA aux1.cache_size=50;
192   BEGIN;
193   UPDATE t2 SET c=c+1;
194   PRAGMA lock_status;
195 } {main unlocked temp unknown aux1 reserved}
196 do_execsql_test pragma2-4.7 {
197   COMMIT;
199 sqlite3_release_memory
200 do_execsql_test pragma2-4.8 {
201   PRAGMA cache_spill=ON; -- Applies to all databases
202   BEGIN;
203   UPDATE t2 SET c=c-1;
204   PRAGMA lock_status;
205 } {main unlocked temp unknown aux1 exclusive}
206    
208 finish_test