1: # 2009 October 22
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 to verify that malloc() errors that occur
13: # within the FTS3 module code are handled correctly.
14: #
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18: ifcapable !fts3 { finish_test ; return }
19: source $testdir/malloc_common.tcl
20: source $testdir/fts3_common.tcl
21:
22: # Ensure the lookaside buffer is disabled for these tests.
23: #
24: sqlite3 db test.db
25: sqlite3_db_config_lookaside db 0 0 0
26:
27: set sqlite_fts3_enable_parentheses 1
28: set DO_MALLOC_TEST 1
29:
30: # Test organization:
31: #
32: # fts3_malloc-1.*: Test OOM during CREATE and DROP table statements.
33: # fts3_malloc-2.*: Test OOM during SELECT operations.
34: # fts3_malloc-3.*: Test OOM during SELECT operations with a larger database.
35: # fts3_malloc-4.*: Test OOM during database write operations.
36: # fts3_malloc-5.*: Test that a couple of memory leaks that could follow
37: # OOM in tokenizer code have been fixed.
38: #
39:
40:
41: proc normal_list {l} {
42: set ret [list]
43: foreach elem $l {lappend ret $elem}
44: set ret
45: }
46:
47: do_write_test fts3_malloc-1.1 sqlite_master {
48: CREATE VIRTUAL TABLE ft1 USING fts3(a, b)
49: }
50: do_write_test fts3_malloc-1.2 sqlite_master {
51: CREATE VIRTUAL TABLE ft2 USING fts3([a], [b]);
52: }
53: do_write_test fts3_malloc-1.3 sqlite_master {
54: CREATE VIRTUAL TABLE ft3 USING fts3('a', "b");
55: }
56: do_write_test fts3_malloc-1.4 sqlite_master {
57: CREATE VIRTUAL TABLE ft4 USING fts3(`a`, 'fred''s column');
58: }
59: do_error_test fts3_malloc-1.5 {
60: CREATE VIRTUAL TABLE ft5 USING fts3(a, b, tokenize unknown)
61: } {unknown tokenizer: unknown}
62: do_write_test fts3_malloc-1.6 sqlite_master {
63: CREATE VIRTUAL TABLE ft6 USING fts3(a, b, tokenize porter)
64: }
65:
66: # Test the xConnect/xDisconnect methods:
67: #db eval { ATTACH 'test2.db' AS aux }
68: #do_write_test fts3_malloc-1.6 aux.sqlite_master {
69: # CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
70: #}
71: #do_write_test fts3_malloc-1.6 aux.sqlite_master {
72: # CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
73: #}
74:
75:
76:
77: do_test fts3_malloc-2.0 {
78: execsql {
79: DROP TABLE ft1;
80: DROP TABLE ft2;
81: DROP TABLE ft3;
82: DROP TABLE ft4;
83: DROP TABLE ft6;
84: }
85: execsql { CREATE VIRTUAL TABLE ft USING fts3(a, b) }
86: for {set ii 1} {$ii < 32} {incr ii} {
87: set a [list]
88: set b [list]
89: if {$ii & 0x01} {lappend a one ; lappend b neung}
90: if {$ii & 0x02} {lappend a two ; lappend b song }
91: if {$ii & 0x04} {lappend a three ; lappend b sahm }
92: if {$ii & 0x08} {lappend a four ; lappend b see }
93: if {$ii & 0x10} {lappend a five ; lappend b hah }
94: execsql { INSERT INTO ft VALUES($a, $b) }
95: }
96: } {}
97:
98: foreach {tn sql result} {
99: 1 "SELECT count(*) FROM sqlite_master" {5}
100: 2 "SELECT * FROM ft WHERE docid = 1" {one neung}
101: 3 "SELECT * FROM ft WHERE docid = 2" {two song}
102: 4 "SELECT * FROM ft WHERE docid = 3" {{one two} {neung song}}
103:
104: 5 "SELECT a FROM ft" {
105: {one} {two} {one two}
106: {three} {one three} {two three}
107: {one two three} {four} {one four}
108: {two four} {one two four} {three four}
109: {one three four} {two three four} {one two three four}
110: {five} {one five} {two five}
111: {one two five} {three five} {one three five}
112: {two three five} {one two three five} {four five}
113: {one four five} {two four five} {one two four five}
114: {three four five} {one three four five} {two three four five}
115: {one two three four five}
116: }
117:
118: 6 "SELECT a FROM ft WHERE a MATCH 'one'" {
119: {one} {one two} {one three} {one two three}
120: {one four} {one two four} {one three four} {one two three four}
121: {one five} {one two five} {one three five} {one two three five}
122: {one four five} {one two four five}
123: {one three four five} {one two three four five}
124: }
125:
126: 7 "SELECT a FROM ft WHERE a MATCH 'o*'" {
127: {one} {one two} {one three} {one two three}
128: {one four} {one two four} {one three four} {one two three four}
129: {one five} {one two five} {one three five} {one two three five}
130: {one four five} {one two four five}
131: {one three four five} {one two three four five}
132: }
133:
134: 8 "SELECT a FROM ft WHERE a MATCH 'o* t*'" {
135: {one two} {one three} {one two three}
136: {one two four} {one three four} {one two three four}
137: {one two five} {one three five} {one two three five}
138: {one two four five} {one three four five} {one two three four five}
139: }
140:
141: 9 "SELECT a FROM ft WHERE a MATCH '\"o* t*\"'" {
142: {one two} {one three} {one two three}
143: {one two four} {one three four} {one two three four}
144: {one two five} {one three five} {one two three five}
145: {one two four five} {one three four five} {one two three four five}
146: }
147:
148: 10 {SELECT a FROM ft WHERE a MATCH '"o* f*"'} {
149: {one four} {one five} {one four five}
150: }
151:
152: 11 {SELECT a FROM ft WHERE a MATCH '"one two three"'} {
153: {one two three}
154: {one two three four}
155: {one two three five}
156: {one two three four five}
157: }
158:
159: 12 {SELECT a FROM ft WHERE a MATCH '"two three four"'} {
160: {two three four}
161: {one two three four}
162: {two three four five}
163: {one two three four five}
164: }
165:
166: 12 {SELECT a FROM ft WHERE a MATCH '"two three" five'} {
167: {two three five} {one two three five}
168: {two three four five} {one two three four five}
169: }
170:
171: 13 {SELECT a FROM ft WHERE ft MATCH '"song sahm" hah'} {
172: {two three five} {one two three five}
173: {two three four five} {one two three four five}
174: }
175:
176: 14 {SELECT a FROM ft WHERE b MATCH 'neung'} {
177: {one} {one two}
178: {one three} {one two three}
179: {one four} {one two four}
180: {one three four} {one two three four}
181: {one five} {one two five}
182: {one three five} {one two three five}
183: {one four five} {one two four five}
184: {one three four five} {one two three four five}
185: }
186:
187: 15 {SELECT a FROM ft WHERE b MATCH '"neung song sahm"'} {
188: {one two three} {one two three four}
189: {one two three five} {one two three four five}
190: }
191:
192: 16 {SELECT a FROM ft WHERE b MATCH 'hah "song sahm"'} {
193: {two three five} {one two three five}
194: {two three four five} {one two three four five}
195: }
196:
197: 17 {SELECT a FROM ft WHERE b MATCH 'song OR sahm'} {
198: {two} {one two} {three}
199: {one three} {two three} {one two three}
200: {two four} {one two four} {three four}
201: {one three four} {two three four} {one two three four}
202: {two five} {one two five} {three five}
203: {one three five} {two three five} {one two three five}
204: {two four five} {one two four five} {three four five}
205: {one three four five} {two three four five} {one two three four five}
206: }
207:
208: 18 {SELECT a FROM ft WHERE a MATCH 'three NOT two'} {
209: {three} {one three} {three four}
210: {one three four} {three five} {one three five}
211: {three four five} {one three four five}
212: }
213:
214: 19 {SELECT a FROM ft WHERE b MATCH 'sahm NOT song'} {
215: {three} {one three} {three four}
216: {one three four} {three five} {one three five}
217: {three four five} {one three four five}
218: }
219:
220: 20 {SELECT a FROM ft WHERE ft MATCH 'sahm NOT song'} {
221: {three} {one three} {three four}
222: {one three four} {three five} {one three five}
223: {three four five} {one three four five}
224: }
225:
226: 21 {SELECT a FROM ft WHERE b MATCH 'neung NEAR song NEAR sahm'} {
227: {one two three} {one two three four}
228: {one two three five} {one two three four five}
229: }
230:
231: } {
232: set result [normal_list $result]
233: do_select_test fts3_malloc-2.$tn $sql $result
234: }
235:
236: do_test fts3_malloc-3.0 {
237: execsql BEGIN
238: for {set ii 32} {$ii < 1024} {incr ii} {
239: set a [list]
240: set b [list]
241: if {$ii & 0x0001} {lappend a one ; lappend b neung }
242: if {$ii & 0x0002} {lappend a two ; lappend b song }
243: if {$ii & 0x0004} {lappend a three ; lappend b sahm }
244: if {$ii & 0x0008} {lappend a four ; lappend b see }
245: if {$ii & 0x0010} {lappend a five ; lappend b hah }
246: if {$ii & 0x0020} {lappend a six ; lappend b hok }
247: if {$ii & 0x0040} {lappend a seven ; lappend b jet }
248: if {$ii & 0x0080} {lappend a eight ; lappend b bairt }
249: if {$ii & 0x0100} {lappend a nine ; lappend b gow }
250: if {$ii & 0x0200} {lappend a ten ; lappend b sip }
251: execsql { INSERT INTO ft VALUES($a, $b) }
252: }
253: execsql COMMIT
254: } {}
255: foreach {tn sql result} {
256: 1 "SELECT count(*) FROM ft" {1023}
257:
258: 2 "SELECT a FROM ft WHERE a MATCH 'one two three four five six seven eight'" {
259: {one two three four five six seven eight}
260: {one two three four five six seven eight nine}
261: {one two three four five six seven eight ten}
262: {one two three four five six seven eight nine ten}
263: }
264:
265: 3 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH 'o*'} {
266: 512 262144
267: }
268:
269: 4 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH '"two three four"'} {
270: 128 66368
271: }
272: } {
273: set result [normal_list $result]
274: do_select_test fts3_malloc-3.$tn $sql $result
275: }
276:
277: do_test fts3_malloc-4.0 {
278: execsql { DELETE FROM ft WHERE docid>=32 }
279: } {}
280: foreach {tn sql} {
281: 1 "DELETE FROM ft WHERE ft MATCH 'one'"
282: 2 "DELETE FROM ft WHERE ft MATCH 'three'"
283: 3 "DELETE FROM ft WHERE ft MATCH 'five'"
284: } {
285: do_write_test fts3_malloc-4.1.$tn ft_content $sql
286: }
287: do_test fts3_malloc-4.2 {
288: execsql { SELECT a FROM ft }
289: } {two four {two four}}
290:
291: do_write_test fts3_malloc-5.1 ft_content {
292: INSERT INTO ft VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken', 'cynics!')
293: }
294: do_test fts3_malloc-5.2 {
295: execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) }
296: } {}
297:
298: do_write_test fts3_malloc-5.3 ft_content {
299: INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')
300: }
301:
302:
303: finish_test
304:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>