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