1: # 2008 August 29
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 is focused on testing the pcache module.
13: #
14: # $Id: pcache.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:
19: # Do not use a codec for tests in this file, as the database file is
20: # manipulated directly using tcl scripts (using the [hexio_write] command).
21: #
22: do_not_use_codec
23:
24: # Only works with a mode-2 pcache where all pcaches share a single set
25: # of pages.
26: #
27: ifcapable {!memorymanage && threadsafe} {
28: finish_test
29: return
30: }
31:
32: # The pcache module limits the number of pages available to purgeable
33: # caches to the sum of the 'cache_size' values for the set of open
34: # caches. This block of tests, pcache-1.*, test that the library behaves
35: # corrctly when it is forced to exceed this limit.
36: #
37: do_test pcache-1.1 {
38: db close
39: pcache_stats
40: } {current 0 max 0 min 0 recyclable 0}
41:
42: do_test pcache-1.2 {
43: sqlite3 db test.db
44: execsql {
45: PRAGMA cache_size=12;
46: PRAGMA auto_vacuum=0;
47: }
48: pcache_stats
49: } {current 1 max 12 min 10 recyclable 1}
50:
51: do_test pcache-1.3 {
52: execsql {
53: BEGIN;
54: CREATE TABLE t1(a, b, c);
55: CREATE TABLE t2(a, b, c);
56: CREATE TABLE t3(a, b, c);
57: CREATE TABLE t4(a, b, c);
58: CREATE TABLE t5(a, b, c);
59: }
60: pcache_stats
61: } {current 6 max 12 min 10 recyclable 0}
62:
63: do_test pcache-1.4 {
64: execsql {
65: CREATE TABLE t6(a, b, c);
66: CREATE TABLE t7(a, b, c);
67: CREATE TABLE t8(a, b, c);
68: CREATE TABLE t9(a, b, c);
69: }
70: pcache_stats
71: } {current 10 max 12 min 10 recyclable 0}
72:
73: do_test pcache-1.5 {
74: sqlite3 db2 test.db
75: execsql "PRAGMA cache_size=10" db2
76: pcache_stats
77: } {current 11 max 22 min 20 recyclable 1}
78:
79: do_test pcache-1.6.1 {
80: execsql {
81: BEGIN;
82: SELECT * FROM sqlite_master;
83: } db2
84: pcache_stats
85: } {current 11 max 22 min 20 recyclable 0}
86:
87: # At this point connection db2 has a read lock on the database file and a
88: # single pinned page in its cache. Connection [db] is holding 10 dirty
89: # pages. It cannot recycle them because of the read lock held by db2.
90: #
91: do_test pcache-1.6.2 {
92: execsql {
93: CREATE INDEX i1 ON t1(a, b);
94: CREATE INDEX i2 ON t2(a, b);
95: CREATE INDEX i3 ON t3(a, b);
96: CREATE INDEX i4 ON t4(a, b);
97: CREATE INDEX i5 ON t5(a, b);
98: CREATE INDEX i6 ON t6(a, b);
99: CREATE INDEX i7 ON t7(a, b);
100: CREATE INDEX i8 ON t8(a, b);
101: CREATE INDEX i9 ON t9(a, b);
102: CREATE INDEX i10 ON t9(a, b);
103: CREATE INDEX i11 ON t9(a, b);
104: }
105: pcache_stats
106: } {current 23 max 22 min 20 recyclable 0}
107:
108: do_test pcache-1.7 {
109: execsql {
110: CREATE TABLE t10(a, b, c);
111: }
112: pcache_stats
113: } {current 24 max 22 min 20 recyclable 0}
114:
115: # Rolling back the transaction held by db2 at this point releases a pinned
116: # page. Because the number of allocated pages is greater than the
117: # configured maximum, this page should be freed immediately instead of
118: # recycled.
119: #
120: do_test pcache-1.8 {
121: execsql {ROLLBACK} db2
122: pcache_stats
123: } {current 23 max 22 min 20 recyclable 0}
124:
125: do_test pcache-1.9 {
126: execsql COMMIT
127: pcache_stats
128: } {current 22 max 22 min 20 recyclable 22}
129:
130: do_test pcache-1.10 {
131: db2 close
132: pcache_stats
133: } {current 12 max 12 min 10 recyclable 12}
134:
135: do_test pcache-1.11 {
136: execsql { PRAGMA cache_size = 20 }
137: pcache_stats
138: } {current 12 max 20 min 10 recyclable 12}
139:
140: do_test pcache-1.12 {
141: execsql {
142: SELECT * FROM t1 ORDER BY a; SELECT * FROM t1;
143: SELECT * FROM t2 ORDER BY a; SELECT * FROM t2;
144: SELECT * FROM t3 ORDER BY a; SELECT * FROM t3;
145: SELECT * FROM t4 ORDER BY a; SELECT * FROM t4;
146: SELECT * FROM t5 ORDER BY a; SELECT * FROM t5;
147: SELECT * FROM t6 ORDER BY a; SELECT * FROM t6;
148: SELECT * FROM t7 ORDER BY a; SELECT * FROM t7;
149: SELECT * FROM t8 ORDER BY a; SELECT * FROM t8;
150: SELECT * FROM t9 ORDER BY a; SELECT * FROM t9;
151: }
152: pcache_stats
153: } {current 19 max 20 min 10 recyclable 19}
154:
155: do_test pcache-1.13 {
156: execsql { PRAGMA cache_size = 15 }
157: pcache_stats
158: } {current 15 max 15 min 10 recyclable 15}
159:
160: do_test pcache-1.14 {
161: hexio_write test.db 24 [hexio_render_int32 1000]
162: execsql { SELECT * FROM sqlite_master }
163: pcache_stats
164: } {current 2 max 15 min 10 recyclable 2}
165:
166: do_test pcache-1.15 {
167: execsql {
168: SELECT * FROM t1 ORDER BY a; SELECT * FROM t1;
169: SELECT * FROM t2 ORDER BY a; SELECT * FROM t2;
170: SELECT * FROM t3 ORDER BY a; SELECT * FROM t3;
171: SELECT * FROM t4 ORDER BY a; SELECT * FROM t4;
172: SELECT * FROM t5 ORDER BY a; SELECT * FROM t5;
173: SELECT * FROM t6 ORDER BY a; SELECT * FROM t6;
174: SELECT * FROM t7 ORDER BY a; SELECT * FROM t7;
175: SELECT * FROM t8 ORDER BY a; SELECT * FROM t8;
176: SELECT * FROM t9 ORDER BY a; SELECT * FROM t9;
177: }
178: pcache_stats
179: } {current 14 max 15 min 10 recyclable 14}
180:
181: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>