OLD | NEW |
| (Empty) |
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 do_write_test fts3_malloc-1.7 sqlite_master { | |
66 CREATE VIRTUAL TABLE ft7 USING fts4(a, b, notindexed=b) | |
67 } | |
68 | |
69 # Test the xConnect/xDisconnect methods: | |
70 #db eval { ATTACH 'test2.db' AS aux } | |
71 #do_write_test fts3_malloc-1.6 aux.sqlite_master { | |
72 # CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c); | |
73 #} | |
74 #do_write_test fts3_malloc-1.6 aux.sqlite_master { | |
75 # CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c); | |
76 #} | |
77 | |
78 | |
79 | |
80 do_test fts3_malloc-2.0 { | |
81 execsql { | |
82 DROP TABLE ft1; | |
83 DROP TABLE ft2; | |
84 DROP TABLE ft3; | |
85 DROP TABLE ft4; | |
86 DROP TABLE ft6; | |
87 DROP TABLE ft7; | |
88 } | |
89 execsql { CREATE VIRTUAL TABLE ft USING fts3(a, b) } | |
90 for {set ii 1} {$ii < 32} {incr ii} { | |
91 set a [list] | |
92 set b [list] | |
93 if {$ii & 0x01} {lappend a one ; lappend b neung} | |
94 if {$ii & 0x02} {lappend a two ; lappend b song } | |
95 if {$ii & 0x04} {lappend a three ; lappend b sahm } | |
96 if {$ii & 0x08} {lappend a four ; lappend b see } | |
97 if {$ii & 0x10} {lappend a five ; lappend b hah } | |
98 execsql { INSERT INTO ft VALUES($a, $b) } | |
99 } | |
100 } {} | |
101 | |
102 foreach {tn sql result} { | |
103 1 "SELECT count(*) FROM sqlite_master" {5} | |
104 2 "SELECT * FROM ft WHERE docid = 1" {one neung} | |
105 3 "SELECT * FROM ft WHERE docid = 2" {two song} | |
106 4 "SELECT * FROM ft WHERE docid = 3" {{one two} {neung song}} | |
107 | |
108 5 "SELECT a FROM ft" { | |
109 {one} {two} {one two} | |
110 {three} {one three} {two three} | |
111 {one two three} {four} {one four} | |
112 {two four} {one two four} {three four} | |
113 {one three four} {two three four} {one two three four} | |
114 {five} {one five} {two five} | |
115 {one two five} {three five} {one three five} | |
116 {two three five} {one two three five} {four five} | |
117 {one four five} {two four five} {one two four five} | |
118 {three four five} {one three four five} {two three four five} | |
119 {one two three four five} | |
120 } | |
121 | |
122 6 "SELECT a FROM ft WHERE a MATCH 'one'" { | |
123 {one} {one two} {one three} {one two three} | |
124 {one four} {one two four} {one three four} {one two three four} | |
125 {one five} {one two five} {one three five} {one two three five} | |
126 {one four five} {one two four five} | |
127 {one three four five} {one two three four five} | |
128 } | |
129 | |
130 7 "SELECT a FROM ft WHERE a MATCH 'o*'" { | |
131 {one} {one two} {one three} {one two three} | |
132 {one four} {one two four} {one three four} {one two three four} | |
133 {one five} {one two five} {one three five} {one two three five} | |
134 {one four five} {one two four five} | |
135 {one three four five} {one two three four five} | |
136 } | |
137 | |
138 8 "SELECT a FROM ft WHERE a MATCH 'o* t*'" { | |
139 {one two} {one three} {one two three} | |
140 {one two four} {one three four} {one two three four} | |
141 {one two five} {one three five} {one two three five} | |
142 {one two four five} {one three four five} {one two three four five} | |
143 } | |
144 | |
145 9 "SELECT a FROM ft WHERE a MATCH '\"o* t*\"'" { | |
146 {one two} {one three} {one two three} | |
147 {one two four} {one three four} {one two three four} | |
148 {one two five} {one three five} {one two three five} | |
149 {one two four five} {one three four five} {one two three four five} | |
150 } | |
151 | |
152 10 {SELECT a FROM ft WHERE a MATCH '"o* f*"'} { | |
153 {one four} {one five} {one four five} | |
154 } | |
155 | |
156 11 {SELECT a FROM ft WHERE a MATCH '"one two three"'} { | |
157 {one two three} | |
158 {one two three four} | |
159 {one two three five} | |
160 {one two three four five} | |
161 } | |
162 | |
163 12 {SELECT a FROM ft WHERE a MATCH '"two three four"'} { | |
164 {two three four} | |
165 {one two three four} | |
166 {two three four five} | |
167 {one two three four five} | |
168 } | |
169 | |
170 12 {SELECT a FROM ft WHERE a MATCH '"two three" five'} { | |
171 {two three five} {one two three five} | |
172 {two three four five} {one two three four five} | |
173 } | |
174 | |
175 13 {SELECT a FROM ft WHERE ft MATCH '"song sahm" hah'} { | |
176 {two three five} {one two three five} | |
177 {two three four five} {one two three four five} | |
178 } | |
179 | |
180 14 {SELECT a FROM ft WHERE b MATCH 'neung'} { | |
181 {one} {one two} | |
182 {one three} {one two three} | |
183 {one four} {one two four} | |
184 {one three four} {one two three four} | |
185 {one five} {one two five} | |
186 {one three five} {one two three five} | |
187 {one four five} {one two four five} | |
188 {one three four five} {one two three four five} | |
189 } | |
190 | |
191 15 {SELECT a FROM ft WHERE b MATCH '"neung song sahm"'} { | |
192 {one two three} {one two three four} | |
193 {one two three five} {one two three four five} | |
194 } | |
195 | |
196 16 {SELECT a FROM ft WHERE b MATCH 'hah "song sahm"'} { | |
197 {two three five} {one two three five} | |
198 {two three four five} {one two three four five} | |
199 } | |
200 | |
201 17 {SELECT a FROM ft WHERE b MATCH 'song OR sahm'} { | |
202 {two} {one two} {three} | |
203 {one three} {two three} {one two three} | |
204 {two four} {one two four} {three four} | |
205 {one three four} {two three four} {one two three four} | |
206 {two five} {one two five} {three five} | |
207 {one three five} {two three five} {one two three five} | |
208 {two four five} {one two four five} {three four five} | |
209 {one three four five} {two three four five} {one two three four five} | |
210 } | |
211 | |
212 18 {SELECT a FROM ft WHERE a MATCH 'three NOT two'} { | |
213 {three} {one three} {three four} | |
214 {one three four} {three five} {one three five} | |
215 {three four five} {one three four five} | |
216 } | |
217 | |
218 19 {SELECT a FROM ft WHERE b MATCH 'sahm NOT song'} { | |
219 {three} {one three} {three four} | |
220 {one three four} {three five} {one three five} | |
221 {three four five} {one three four five} | |
222 } | |
223 | |
224 20 {SELECT a FROM ft WHERE ft MATCH 'sahm NOT song'} { | |
225 {three} {one three} {three four} | |
226 {one three four} {three five} {one three five} | |
227 {three four five} {one three four five} | |
228 } | |
229 | |
230 21 {SELECT a FROM ft WHERE b MATCH 'neung NEAR song NEAR sahm'} { | |
231 {one two three} {one two three four} | |
232 {one two three five} {one two three four five} | |
233 } | |
234 | |
235 } { | |
236 set result [normal_list $result] | |
237 do_select_test fts3_malloc-2.$tn $sql $result | |
238 } | |
239 | |
240 do_test fts3_malloc-3.0 { | |
241 execsql BEGIN | |
242 for {set ii 32} {$ii < 1024} {incr ii} { | |
243 set a [list] | |
244 set b [list] | |
245 if {$ii & 0x0001} {lappend a one ; lappend b neung } | |
246 if {$ii & 0x0002} {lappend a two ; lappend b song } | |
247 if {$ii & 0x0004} {lappend a three ; lappend b sahm } | |
248 if {$ii & 0x0008} {lappend a four ; lappend b see } | |
249 if {$ii & 0x0010} {lappend a five ; lappend b hah } | |
250 if {$ii & 0x0020} {lappend a six ; lappend b hok } | |
251 if {$ii & 0x0040} {lappend a seven ; lappend b jet } | |
252 if {$ii & 0x0080} {lappend a eight ; lappend b bairt } | |
253 if {$ii & 0x0100} {lappend a nine ; lappend b gow } | |
254 if {$ii & 0x0200} {lappend a ten ; lappend b sip } | |
255 execsql { INSERT INTO ft VALUES($a, $b) } | |
256 } | |
257 execsql COMMIT | |
258 } {} | |
259 foreach {tn sql result} { | |
260 1 "SELECT count(*) FROM ft" {1023} | |
261 | |
262 2 "SELECT a FROM ft WHERE a MATCH 'one two three four five six seven eight'" { | |
263 {one two three four five six seven eight} | |
264 {one two three four five six seven eight nine} | |
265 {one two three four five six seven eight ten} | |
266 {one two three four five six seven eight nine ten} | |
267 } | |
268 | |
269 3 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH 'o*'} { | |
270 512 262144 | |
271 } | |
272 | |
273 4 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH '"two three four"'} { | |
274 128 66368 | |
275 } | |
276 } { | |
277 set result [normal_list $result] | |
278 do_select_test fts3_malloc-3.$tn $sql $result | |
279 } | |
280 | |
281 do_test fts3_malloc-4.0 { | |
282 execsql { DELETE FROM ft WHERE docid>=32 } | |
283 } {} | |
284 foreach {tn sql} { | |
285 1 "DELETE FROM ft WHERE ft MATCH 'one'" | |
286 2 "DELETE FROM ft WHERE ft MATCH 'three'" | |
287 3 "DELETE FROM ft WHERE ft MATCH 'five'" | |
288 } { | |
289 do_write_test fts3_malloc-4.1.$tn ft_content $sql | |
290 } | |
291 do_test fts3_malloc-4.2 { | |
292 execsql { SELECT a FROM ft } | |
293 } {two four {two four}} | |
294 | |
295 do_write_test fts3_malloc-5.1 ft_content { | |
296 INSERT INTO ft VALUES('short alongertoken reallyquitealotlongerimeanit andthis
tokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexam
pleandnotarealtoken', 'cynics!') | |
297 } | |
298 do_test fts3_malloc-5.2 { | |
299 execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) } | |
300 } {} | |
301 | |
302 do_write_test fts3_malloc-5.3 ft_content { | |
303 INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthi
stokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexa
mpleandnotarealtoken') | |
304 } | |
305 | |
306 | |
307 finish_test | |
OLD | NEW |