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
#***********************************************************************
12
# This file contains tests of the memory allocation subsystem
14
# $Id: memsubsys1.test,v 1.17 2009/07/18 14:36:24 danielk1977 Exp $
16
set testdir [file dirname $argv0]
17
source $testdir/tester.tcl
18
sqlite3_reset_auto_extension
20
# This procedure constructs a new database in test.db. It fills
21
# this database with many small records (enough to force multiple
22
# rebalance operations in the btree-layer and to require a large
23
# page cache), verifies correct results, then returns.
25
proc build_test_db {testname pragmas} {
27
file delete -force test.db test.db-journal
29
sqlite3_db_config_lookaside db 0 0 0
32
CREATE TABLE t1(x, y);
33
CREATE TABLE t2(a, b);
34
CREATE INDEX i1 ON t1(x,y);
35
INSERT INTO t1 VALUES(1, 100);
36
INSERT INTO t1 VALUES(2, 200);
38
for {set i 2} {$i<5000} {incr i $i} {
39
db eval {INSERT INTO t2 SELECT * FROM t1}
40
db eval {INSERT INTO t1 SELECT a+$i, a+b*100 FROM t2}
41
db eval {DELETE FROM t2}
44
db eval {SELECT count(*) FROM t1}
46
integrity_check $testname.2
49
# Reset all of the highwater marks.
51
proc reset_highwater_marks {} {
52
sqlite3_status SQLITE_STATUS_MEMORY_USED 1
53
sqlite3_status SQLITE_STATUS_MALLOC_SIZE 1
54
sqlite3_status SQLITE_STATUS_PAGECACHE_USED 1
55
sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 1
56
sqlite3_status SQLITE_STATUS_PAGECACHE_SIZE 1
57
sqlite3_status SQLITE_STATUS_SCRATCH_USED 1
58
sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 1
59
sqlite3_status SQLITE_STATUS_SCRATCH_SIZE 1
60
sqlite3_status SQLITE_STATUS_PARSER_STACK 1
65
# Test 1: Both PAGECACHE and SCRATCH are shut down.
69
sqlite3_config_lookaside 0 0
72
build_test_db memsubsys1-1 {PRAGMA page_size=1024}
73
do_test memsubsys1-1.3 {
74
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
76
do_test memsubsys1-1.4 {
77
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
79
set max_pagecache [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
82
# Test 2: Activate PAGECACHE with 20 pages
86
sqlite3_config_pagecache [expr 1024+$xtra_size] 20
89
build_test_db memsubsys1-2 {PRAGMA page_size=1024}
91
do_test memsubsys1-2.3 {
92
set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
93
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
95
($pg_used*1024 + $pg_ovfl) < $max_pagecache &&
96
($pg_used*(1024+$xtra_size) + $pg_ovfl) >= $max_pagecache
99
do_test memsubsys1-2.4 {
100
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
102
do_test memsubsys1-2.5 {
103
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
106
# Test 3: Activate PAGECACHE with 20 pages but use the wrong page size
107
# so that PAGECACHE is not used.
111
sqlite3_config_pagecache [expr 512+$xtra_size] 20
113
reset_highwater_marks
114
build_test_db memsubsys1-3.1 {PRAGMA page_size=1024}
116
do_test memsubsys1-3.1.3 {
117
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
119
do_test memsubsys1-3.1.4 {
120
set overflow [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
122
do_test memsubsys1-3.1.5 {
123
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
127
sqlite3_config_pagecache [expr 2048+$xtra_size] 20
129
reset_highwater_marks
130
build_test_db memsubsys1-3.2 {PRAGMA page_size=2048}
132
do_test memsubsys1-3.2.3 {
133
db eval {PRAGMA page_size}
135
do_test memsubsys1-3.2.4 {
136
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
138
do_test memsubsys1-3.2.5 {
139
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
142
# Test 4: Activate both PAGECACHE and SCRATCH.
146
sqlite3_config_pagecache [expr 1024+$xtra_size] 50
147
sqlite3_config_scratch 6000 2
149
reset_highwater_marks
150
build_test_db memsubsys1-4 {PRAGMA page_size=1024}
152
do_test memsubsys1-4.3 {
153
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
155
do_test memsubsys1-4.4 {
156
set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
157
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
159
($pg_used*1024 + $pg_ovfl) < $max_pagecache &&
160
($pg_used*(1024+$xtra_size) + $pg_ovfl) >= $max_pagecache
163
do_test memsubsys1-4.5 {
164
set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
167
do_test memsubsys1-4.6 {
168
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
171
# Test 5: Activate both PAGECACHE and SCRATCH. But make the page size
172
# such that the SCRATCH allocations are too small.
176
sqlite3_config_pagecache [expr 4096+$xtra_size] 24
177
sqlite3_config_scratch 6000 2
179
reset_highwater_marks
180
build_test_db memsubsys1-5 {PRAGMA page_size=4096}
182
do_test memsubsys1-5.3 {
183
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
185
do_test memsubsys1-5.4 {
186
set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
189
do_test memsubsys1-5.5 {
190
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
192
do_test memsubsys1-5.6 {
193
set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]
197
# Test 6: Activate both PAGECACHE and SCRATCH with a 4k page size.
198
# Make it so that SCRATCH is large enough
202
sqlite3_config_pagecache [expr 4096+$xtra_size] 24
203
sqlite3_config_scratch 25300 1
205
reset_highwater_marks
206
build_test_db memsubsys1-6 {PRAGMA page_size=4096}
208
do_test memsubsys1-6.3 {
209
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
211
do_test memsubsys1-6.4 {
212
set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
213
expr {$maxreq>4096 && $maxreq<=(4096+$xtra_size)}
215
do_test memsubsys1-6.5 {
216
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
218
do_test memsubsys1-6.6 {
219
set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]
222
# Test 7: Activate both PAGECACHE and SCRATCH with a 4k page size.
223
# Set cache_size small so that no PAGECACHE overflow occurs. Verify
224
# that maximum allocation size is small.
228
sqlite3_config_pagecache [expr 4096+$xtra_size] 24
229
sqlite3_config_scratch 25300 1
231
reset_highwater_marks
232
build_test_db memsubsys1-7 {
233
PRAGMA page_size=4096;
234
PRAGMA cache_size=10;
235
PRAGMA temp_store=memory;
238
do_test memsubsys1-7.3 {
239
set pg_used [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] 2]
242
do_test memsubsys1-7.4 {
243
set pg_ovfl [lindex [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] 2]
245
do_test memsubsys1-7.5 {
246
set maxreq [lindex [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] 2]
249
do_test memsubsys1-7.6 {
250
set s_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
252
do_test memsubsys1-7.7 {
253
set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]
256
# Test 8: Disable PAGECACHE. Make available SCRATCH zero. Verify that
257
# the SCRATCH overflow logic works.
261
sqlite3_config_pagecache 0 0
262
sqlite3_config_scratch 25000 0
264
reset_highwater_marks
265
do_test memsubsys1-8.1 {
266
set pg_used [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] 2]
268
do_test memsubsys1-8.2 {
269
set s_ovfl [lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]
271
do_test memsubsys1-8.3 {
275
INSERT INTO t1 VALUES(zeroblob(400));
276
INSERT INTO t1 VALUES(zeroblob(400));
277
INSERT INTO t1 SELECT * FROM t1;
278
INSERT INTO t1 SELECT * FROM t1;
279
INSERT INTO t1 SELECT * FROM t1;
281
expr {[lindex [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] 2]>0}
285
sqlite3_config_memstatus 0
287
do_test memsubsys1-8.4 {
291
INSERT INTO t1 VALUES(zeroblob(400));
292
INSERT INTO t1 VALUES(zeroblob(400));
293
INSERT INTO t1 SELECT * FROM t1;
294
INSERT INTO t1 SELECT * FROM t1;
295
INSERT INTO t1 SELECT * FROM t1;
296
SELECT rowid FROM t1;
298
} {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16}
303
sqlite3_config_memstatus 1
304
sqlite3_config_pagecache 0 0
305
sqlite3_config_scratch 0 0
306
sqlite3_config_lookaside 100 500
308
autoinstall_test_functions