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: # $Id: memsubsys2.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18: sqlite3_reset_auto_extension
19:
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.
24: #
25: proc build_test_db {testname pragmas} {
26: catch {db close}
27: forcedelete test.db test.db-journal
28: sqlite3 db test.db
29: db eval $pragmas
30: db eval {
31: CREATE TABLE t1(x, y);
32: CREATE TABLE t2(a, b);
33: CREATE INDEX i1 ON t1(x,y);
34: INSERT INTO t1 VALUES(1, 100);
35: INSERT INTO t1 VALUES(2, 200);
36: }
37: for {set i 2} {$i<5000} {incr i $i} {
38: db eval {INSERT INTO t2 SELECT * FROM t1}
39: db eval {INSERT INTO t1 SELECT a+$i, a+b*100 FROM t2}
40: db eval {DELETE FROM t2}
41: }
42: do_test $testname.1 {
43: db eval {SELECT count(*) FROM t1}
44: } 8192
45: integrity_check $testname.2
46: }
47:
48: # Reset all of the highwater marks.
49: #
50: proc reset_highwater_marks {} {
51: sqlite3_status SQLITE_STATUS_MEMORY_USED 1
52: sqlite3_status SQLITE_STATUS_MALLOC_SIZE 1
53: sqlite3_status SQLITE_STATUS_PAGECACHE_USED 1
54: sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 1
55: sqlite3_status SQLITE_STATUS_PAGECACHE_SIZE 1
56: sqlite3_status SQLITE_STATUS_SCRATCH_USED 1
57: sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 1
58: sqlite3_status SQLITE_STATUS_SCRATCH_SIZE 1
59: sqlite3_status SQLITE_STATUS_PARSER_STACK 1
60: }
61:
62: # Test 1: Verify that calling sqlite3_malloc(0) returns a NULL
63: # pointer.
64: #
65: set highwater [sqlite3_memory_highwater 0]
66: do_test memsubsys2-1.1 {
67: sqlite3_malloc 0
68: } {0}
69: do_test memsubsys2-1.2 {
70: sqlite3_memory_highwater 0
71: } $highwater
72:
73:
74: # Test 2: Verify that the highwater mark increases after a large
75: # allocation.
76: #
77: sqlite3_memory_highwater 1
78: set highwater [sqlite3_memory_highwater 0]
79: do_test memsubsys2-2.1 {
80: sqlite3_free [set x [sqlite3_malloc 100000]]
81: expr {$x!="0"}
82: } {1}
83: do_test memsubsys2-2.2 {
84: expr {[sqlite3_memory_highwater 0]>=[sqlite3_memory_used]+$highwater}
85: } {1}
86:
87: # Test 3: Verify that turning of memstatus disables the statistics
88: # tracking.
89: #
90: db close
91: sqlite3_shutdown
92: sqlite3_config_memstatus 0
93: sqlite3_initialize
94: reset_highwater_marks
95: set highwater [sqlite3_memory_highwater 0]
96: do_test memsubsys2-3.1 {
97: set highwater
98: } {0}
99: do_test memsubsys2-3.2 {
100: sqlite3_malloc 0
101: } {0}
102: do_test memsubsys2-3.3 {
103: sqlite3_memory_highwater 0
104: } {0}
105: do_test memsubsys2-3.4 {
106: sqlite3_memory_used
107: } {0}
108: do_test memsubsys2-3.5 {
109: set ::allocation [sqlite3_malloc 100000]
110: expr {$::allocation!="0"}
111: } {1}
112: do_test memsubsys2-3.6 {
113: sqlite3_memory_highwater 0
114: } {0}
115: do_test memsubsys2-3.7 {
116: sqlite3_memory_used
117: } {0}
118: do_test memsubsys2-3.8 {
119: sqlite3_free $::allocation
120: } {}
121: do_test memsubsys2-3.9 {
122: sqlite3_free 0
123: } {}
124:
125:
126: # Test 4: Verify that turning on memstatus reenables the statistics
127: # tracking.
128: #
129: sqlite3_shutdown
130: sqlite3_config_memstatus 1
131: sqlite3_initialize
132: reset_highwater_marks
133: set highwater [sqlite3_memory_highwater 0]
134: do_test memsubsys2-4.1 {
135: set highwater
136: } {0}
137: do_test memsubsys2-4.2 {
138: sqlite3_malloc 0
139: } {0}
140: do_test memsubsys2-4.3 {
141: sqlite3_memory_highwater 0
142: } {0}
143: do_test memsubsys2-4.4 {
144: sqlite3_memory_used
145: } {0}
146: do_test memsubsys2-4.5 {
147: set ::allocation [sqlite3_malloc 100000]
148: expr {$::allocation!="0"}
149: } {1}
150: do_test memsubsys2-4.6 {
151: expr {[sqlite3_memory_highwater 0]>=100000}
152: } {1}
153: do_test memsubsys2-4.7 {
154: expr {[sqlite3_memory_used]>=100000}
155: } {1}
156: do_test memsubsys2-4.8 {
157: sqlite3_free $::allocation
158: } {}
159: do_test memsubsys2-4.9 {
160: sqlite3_free 0
161: } {}
162: do_test memsubsys2-4.10 {
163: expr {[sqlite3_memory_highwater 0]>=100000}
164: } {1}
165: do_test memsubsys2-4.11 {
166: sqlite3_memory_used
167: } {0}
168:
169:
170:
171:
172: autoinstall_test_functions
173: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>