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 |
| 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 andthis
tokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexam
pleandnotarealtoken', 'cynics!') |
| 293 } |
| 294 do_test fts3_malloc-5.2 { |
| 295 execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) } |
| 296 } {} |
| 297 do_write_test fts3_malloc-5.3 ft_content { |
| 298 INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthi
stokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexa
mpleandnotarealtoken') |
| 299 } |
| 300 |
| 301 |
| 302 finish_test |
| 303 |
OLD | NEW |