wasCSharpSQLite – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | # 2008 June 18 |
2 | # |
||
3 | # The author disclaims copyright to this source code. In place of |
||
4 | # a legal notice, here is a blessing: |
||
5 | # |
||
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. |
||
9 | # |
||
10 | #*********************************************************************** |
||
11 | # |
||
12 | # This file contains tests of the memory allocation subsystem |
||
13 | # |
||
14 | |||
15 | set testdir [file dirname $argv0] |
||
16 | source $testdir/tester.tcl |
||
17 | sqlite3_reset_auto_extension |
||
18 | |||
19 | # This test assumes that no page-cache or scratch buffers are installed |
||
20 | # by default when a new database connection is opened. As a result, it |
||
21 | # will not work with the "memsubsys1" permutation. |
||
22 | # |
||
23 | if {[permutation] == "memsubsys1"} { |
||
24 | finish_test |
||
25 | return |
||
26 | } |
||
27 | |||
28 | # This procedure constructs a new database in test.db. It fills |
||
29 | # this database with many small records (enough to force multiple |
||
30 | # rebalance operations in the btree-layer and to require a large |
||
31 | # page cache), verifies correct results, then returns. |
||
32 | # |
||
33 | proc build_test_db {testname pragmas} { |
||
34 | catch {db close} |
||
35 | file delete -force test.db test.db-journal |
||
36 | sqlite3 db test.db |
||
37 | sqlite3_db_config_lookaside db 0 0 0 |
||
38 | db eval $pragmas |
||
39 | db eval { |
||
40 | CREATE TABLE t1(x, y); |
||
41 | CREATE TABLE t2(a, b); |
||
42 | CREATE INDEX i1 ON t1(x,y); |
||
43 | INSERT INTO t1 VALUES(1, 100); |
||
44 | INSERT INTO t1 VALUES(2, 200); |
||
45 | } |
||
46 | for {set i 2} {$i<5000} {incr i $i} { |
||
47 | db eval {INSERT INTO t2 SELECT * FROM t1} |
||
48 | db eval {INSERT INTO t1 SELECT a+$i, a+b*100 FROM t2} |
||
49 | db eval {DELETE FROM t2} |
||
50 | } |
||
51 | do_test $testname.1 { |
||
52 | db eval {SELECT count(*) FROM t1} |
||
53 | } 8192 |
||
54 | integrity_check $testname.2 |
||
55 | } |
||
56 | |||
57 | # Reset all of the highwater marks. |
||
58 | # |
||
59 | proc reset_highwater_marks {} { |
||
60 | sqlite3_status SQLITE_STATUS_MEMORY_USED 1 |
||
61 | sqlite3_status SQLITE_STATUS_MALLOC_SIZE 1 |
||
62 | sqlite3_status SQLITE_STATUS_PAGECACHE_USED 1 |
||
63 | sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 1 |
||
64 | sqlite3_status SQLITE_STATUS_PAGECACHE_SIZE 1 |
||
65 | sqlite3_status SQLITE_STATUS_SCRATCH_USED 1 |
||
66 | sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 1 |
||
67 | sqlite3_status SQLITE_STATUS_SCRATCH_SIZE 1 |
||
68 | sqlite3_status SQLITE_STATUS_PARSER_STACK 1 |
||
69 | } |
||
70 | |||
71 | set xtra_size 0 |
||
72 | |||
73 | # Test 1: Both PAGECACHE and SCRATCH are shut down. |
||
74 | # |
||
75 | db close |
||
76 | sqlite3_shutdown |
||
77 | sqlite3_config_lookaside 0 0 |
||
78 | sqlite3_initialize |
||
79 | reset_highwater_marks |
||
80 | build_test_db memsubsys1-1 {PRAGMA page_size=1024} |
||
81 | do_test memsubsys1-1.3 { |
||
82 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2] |
||
83 | } 0 |
||
84 | do_test memsubsys1-1.4 { |
||
85 | set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
86 | } 0 |
||
87 | set max_pagecache [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2] |
||
88 | #show_memstats |
||
89 | |||
90 | # Test 2: Activate PAGECACHE with 20 pages |
||
91 | # |
||
92 | db close |
||
93 | sqlite3_shutdown |
||
94 | sqlite3_config_pagecache [expr 1024+$xtra_size] 20 |
||
95 | sqlite3_initialize |
||
96 | reset_highwater_marks |
||
97 | build_test_db memsubsys1-2 {PRAGMA page_size=1024} |
||
98 | #show_memstats |
||
99 | set MEMORY_MANAGEMENT $sqlite_options(memorymanage) |
||
100 | do_test memsubsys1-2.3 { |
||
101 | set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2] |
||
102 | } {0} |
||
103 | #[expr ($TEMP_STORE>1 || $MEMORY_MANAGEMENT==0)*1024] |
||
104 | |||
105 | do_test memsubsys1-2.4 { |
||
106 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2] |
||
107 | } 18 |
||
108 | do_test memsubsys1-2.5 { |
||
109 | set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
110 | } 0 |
||
111 | |||
112 | # Test 3: Activate PAGECACHE with 20 pages but use the wrong page size |
||
113 | # so that PAGECACHE is not used. |
||
114 | # |
||
115 | db close |
||
116 | sqlite3_shutdown |
||
117 | sqlite3_config_pagecache [expr 512+$xtra_size] 20 |
||
118 | sqlite3_initialize |
||
119 | reset_highwater_marks |
||
120 | build_test_db memsubsys1-3.1 {PRAGMA page_size=1024} |
||
121 | #show_memstats |
||
122 | do_test memsubsys1-3.1.3 { |
||
123 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2] |
||
124 | } 18 |
||
125 | if 0 { |
||
126 | do_test memsubsys1-3.1.4 { |
||
127 | set overflow [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2] |
||
128 | } $max_pagecache |
||
129 | } |
||
130 | do_test memsubsys1-3.1.5 { |
||
131 | set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
132 | } 0 |
||
133 | db close |
||
134 | sqlite3_shutdown |
||
135 | sqlite3_config_pagecache [expr 2048+$xtra_size] 20 |
||
136 | sqlite3_initialize |
||
137 | reset_highwater_marks |
||
138 | build_test_db memsubsys1-3.2 {PRAGMA page_size=2048} |
||
139 | #show_memstats |
||
140 | do_test memsubsys1-3.2.3 { |
||
141 | db eval {PRAGMA page_size} |
||
142 | } 2048 |
||
143 | do_test memsubsys1-3.2.4 { |
||
144 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2] |
||
145 | } 36 |
||
146 | do_test memsubsys1-3.2.5 { |
||
147 | set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
148 | } 0 |
||
149 | |||
150 | # Test 4: Activate both PAGECACHE and SCRATCH. |
||
151 | # |
||
152 | db close |
||
153 | sqlite3_shutdown |
||
154 | sqlite3_config_pagecache [expr 1024+$xtra_size] 50 |
||
155 | sqlite3_config_scratch 6000 2 |
||
156 | sqlite3_initialize |
||
157 | reset_highwater_marks |
||
158 | build_test_db memsubsys1-4 {PRAGMA page_size=1024} |
||
159 | #show_memstats |
||
160 | do_test memsubsys1-4.3 { |
||
161 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2] |
||
162 | expr {$pg_used>=45 && $pg_used<=50} |
||
163 | } 0 |
||
164 | if 0 { |
||
165 | do_test memsubsys1-4.4 { |
||
166 | set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2] |
||
167 | } 0 |
||
168 | } |
||
169 | do_test memsubsys1-4.5 { |
||
170 | set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2] |
||
171 | expr {$maxreq<7000} |
||
172 | } 1 |
||
173 | do_test memsubsys1-4.6 { |
||
174 | set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
175 | } 0 |
||
176 | |||
177 | # Test 5: Activate both PAGECACHE and SCRATCH. But make the page size |
||
178 | # such that the SCRATCH allocations are too small. |
||
179 | # |
||
180 | db close |
||
181 | sqlite3_shutdown |
||
182 | sqlite3_config_pagecache [expr 4096+$xtra_size] 24 |
||
183 | sqlite3_config_scratch 6000 2 |
||
184 | sqlite3_initialize |
||
185 | reset_highwater_marks |
||
186 | build_test_db memsubsys1-5 {PRAGMA page_size=4096} |
||
187 | #show_memstats |
||
188 | do_test memsubsys1-5.3 { |
||
189 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2] |
||
190 | } 103 |
||
191 | do_test memsubsys1-5.4 { |
||
192 | set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2] |
||
193 | expr {$maxreq>4096} |
||
194 | } 0 |
||
195 | do_test memsubsys1-5.5 { |
||
196 | set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
197 | } 0 |
||
198 | do_test memsubsys1-5.6 { |
||
199 | set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2] |
||
200 | expr {$s_ovfl>6000} |
||
201 | } 0 |
||
202 | |||
203 | # Test 6: Activate both PAGECACHE and SCRATCH with a 4k page size. |
||
204 | # Make it so that SCRATCH is large enough |
||
205 | # |
||
206 | db close |
||
207 | sqlite3_shutdown |
||
208 | sqlite3_config_pagecache [expr 4096+$xtra_size] 24 |
||
209 | sqlite3_config_scratch 25300 1 |
||
210 | sqlite3_initialize |
||
211 | reset_highwater_marks |
||
212 | build_test_db memsubsys1-6 {PRAGMA page_size=4096} |
||
213 | #show_memstats |
||
214 | do_test memsubsys1-6.3 { |
||
215 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2] |
||
216 | } 125 |
||
217 | #do_test memsubsys1-6.4 { |
||
218 | # set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2] |
||
219 | # expr {$maxreq>4096 && $maxreq<=(4096+$xtra_size)} |
||
220 | #} 1 |
||
221 | do_test memsubsys1-6.5 { |
||
222 | set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
223 | } 0 |
||
224 | do_test memsubsys1-6.6 { |
||
225 | set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2] |
||
226 | } 0 |
||
227 | |||
228 | # Test 7: Activate both PAGECACHE and SCRATCH with a 4k page size. |
||
229 | # Set cache_size small so that no PAGECACHE overflow occurs. Verify |
||
230 | # that maximum allocation size is small. |
||
231 | # |
||
232 | db close |
||
233 | sqlite3_shutdown |
||
234 | sqlite3_config_pagecache [expr 4096+$xtra_size] 24 |
||
235 | sqlite3_config_scratch 25300 1 |
||
236 | sqlite3_initialize |
||
237 | reset_highwater_marks |
||
238 | build_test_db memsubsys1-7 { |
||
239 | PRAGMA page_size=4096; |
||
240 | PRAGMA cache_size=10; |
||
241 | PRAGMA temp_store=memory; |
||
242 | } |
||
243 | #show_memstats |
||
244 | do_test memsubsys1-7.3 { |
||
245 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2] |
||
246 | expr {$pg_used<24} |
||
247 | } 0 |
||
248 | if 0 { |
||
249 | do_test memsubsys1-7.4 { |
||
250 | set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2] |
||
251 | } 0 |
||
252 | } |
||
253 | do_test memsubsys1-7.5 { |
||
254 | set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2] |
||
255 | expr {$maxreq<4100} |
||
256 | } 1 |
||
257 | do_test memsubsys1-7.6 { |
||
258 | set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
259 | } 0 |
||
260 | do_test memsubsys1-7.7 { |
||
261 | set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2] |
||
262 | } 0 |
||
263 | |||
264 | # Test 8: Disable PAGECACHE. Make available SCRATCH zero. Verify that |
||
265 | # the SCRATCH overflow logic works. |
||
266 | # |
||
267 | db close |
||
268 | sqlite3_shutdown |
||
269 | sqlite3_config_pagecache 0 0 |
||
270 | sqlite3_config_scratch 25000 0 |
||
271 | sqlite3_initialize |
||
272 | reset_highwater_marks |
||
273 | do_test memsubsys1-8.1 { |
||
274 | set pg_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2] |
||
275 | } 0 |
||
276 | do_test memsubsys1-8.2 { |
||
277 | set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2] |
||
278 | } 0 |
||
279 | do_test memsubsys1-8.3 { |
||
280 | sqlite3 db :memory: |
||
281 | db eval { |
||
282 | CREATE TABLE t1(x); |
||
283 | INSERT INTO t1 VALUES(zeroblob(400)); |
||
284 | INSERT INTO t1 VALUES(zeroblob(400)); |
||
285 | INSERT INTO t1 SELECT * FROM t1; |
||
286 | INSERT INTO t1 SELECT * FROM t1; |
||
287 | INSERT INTO t1 SELECT * FROM t1; |
||
288 | } |
||
289 | expr {[lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]>0} |
||
290 | } 0 |
||
291 | db close |
||
292 | sqlite3_shutdown |
||
293 | sqlite3_config_memstatus 0 |
||
294 | sqlite3_initialize |
||
295 | do_test memsubsys1-8.4 { |
||
296 | sqlite3 db :memory: |
||
297 | db eval { |
||
298 | CREATE TABLE t1(x); |
||
299 | INSERT INTO t1 VALUES(zeroblob(400)); |
||
300 | INSERT INTO t1 VALUES(zeroblob(400)); |
||
301 | INSERT INTO t1 SELECT * FROM t1; |
||
302 | INSERT INTO t1 SELECT * FROM t1; |
||
303 | INSERT INTO t1 SELECT * FROM t1; |
||
304 | SELECT rowid FROM t1; |
||
305 | } |
||
306 | } {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16} |
||
307 | |||
308 | |||
309 | db close |
||
310 | sqlite3_shutdown |
||
311 | sqlite3_config_memstatus 1 |
||
312 | sqlite3_config_pagecache 0 0 |
||
313 | sqlite3_config_scratch 0 0 |
||
314 | sqlite3_config_lookaside 100 500 |
||
315 | sqlite3_initialize |
||
316 | autoinstall_test_functions |
||
317 | finish_test |