3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
12 # This file contains tests to verify that malloc() errors that occur
13 # within the FTS3 module code are handled correctly.
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
22 # Ensure the lookaside buffer is disabled for these tests.
25 sqlite3_db_config_lookaside db 0 0 0
27 set sqlite_fts3_enable_parentheses 1
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.
41 proc normal_list {l} {
43 foreach elem $l {lappend ret $elem}
47 do_write_test fts3_malloc-1.1 sqlite_master {
48 CREATE VIRTUAL TABLE ft1 USING fts3(a, b)
50 do_write_test fts3_malloc-1.2 sqlite_master {
51 CREATE VIRTUAL TABLE ft2 USING fts3([a], [b]);
53 do_write_test fts3_malloc-1.3 sqlite_master {
54 CREATE VIRTUAL TABLE ft3 USING fts3('a', "b");
56 do_write_test fts3_malloc-1.4 sqlite_master {
57 CREATE VIRTUAL TABLE ft4 USING fts3(`a`, 'fred''s column');
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)
65 do_write_test fts3_malloc-1.7 sqlite_master {
66 CREATE VIRTUAL TABLE ft7 USING fts4(a, b, notindexed=b)
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);
74 #do_write_test fts3_malloc-1.6 aux.sqlite_master {
75 # CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
80 do_test fts3_malloc-2.0 {
89 execsql { CREATE VIRTUAL TABLE ft USING fts3(a, b) }
90 for {set ii 1} {$ii < 32} {incr ii} {
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) }
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}}
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}
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}
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}
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}
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}
152 10 {SELECT a FROM ft WHERE a MATCH '"o* f*"'} {
153 {one four} {one five} {one four five}
156 11 {SELECT a FROM ft WHERE a MATCH '"one two three"'} {
160 {one two three four five}
163 12 {SELECT a FROM ft WHERE a MATCH '"two three four"'} {
166 {two three four five}
167 {one two three four five}
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}
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}
180 14 {SELECT a FROM ft WHERE b MATCH 'neung'} {
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}
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}
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}
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}
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}
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}
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}
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}
236 set result [normal_list $result]
237 do_select_test fts3_malloc-2.$tn $sql $result
240 do_test fts3_malloc-3.0 {
242 for {set ii 32} {$ii < 1024} {incr ii} {
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) }
259 foreach {tn sql result} {
260 1 "SELECT count(*) FROM ft" {1023}
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}
269 3 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH 'o*'} {
273 4 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH '"two three four"'} {
277 set result [normal_list $result]
278 do_select_test fts3_malloc-3.$tn $sql $result
281 do_test fts3_malloc-4.0 {
282 execsql { DELETE FROM ft WHERE docid>=32 }
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'"
289 do_write_test fts3_malloc-4.1.$tn ft_content $sql
291 do_test fts3_malloc-4.2 {
292 execsql { SELECT a FROM ft }
293 } {two four {two four}}
295 do_write_test fts3_malloc-5.1 ft_content {
296 INSERT INTO ft VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken', 'cynics!')
298 do_test fts3_malloc-5.2 {
299 execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) }
302 do_write_test fts3_malloc-5.3 ft_content {
303 INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')