| 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 |