dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 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 |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 20 | source $testdir/fts3_common.tcl |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 21 | |
dan | 948a5f8 | 2009-11-16 16:36:23 +0000 | [diff] [blame] | 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 | |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 27 | set sqlite_fts3_enable_parentheses 1 |
dan | 948a5f8 | 2009-11-16 16:36:23 +0000 | [diff] [blame] | 28 | set DO_MALLOC_TEST 1 |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 29 | |
dan | 948a5f8 | 2009-11-16 16:36:23 +0000 | [diff] [blame] | 30 | # Test organization: |
| 31 | # |
dan | 16708c4 | 2009-11-19 15:25:25 +0000 | [diff] [blame] | 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. |
dan | d3789b9 | 2010-01-22 15:48:18 +0000 | [diff] [blame] | 36 | # fts3_malloc-5.*: Test that a couple of memory leaks that could follow |
| 37 | # OOM in tokenizer code have been fixed. |
dan | 948a5f8 | 2009-11-16 16:36:23 +0000 | [diff] [blame] | 38 | # |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 39 | |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 40 | |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 41 | proc normal_list {l} { |
| 42 | set ret [list] |
| 43 | foreach elem $l {lappend ret $elem} |
| 44 | set ret |
| 45 | } |
| 46 | |
dan | 948a5f8 | 2009-11-16 16:36:23 +0000 | [diff] [blame] | 47 | |
| 48 | do_write_test fts3_malloc-1.1 sqlite_master { |
| 49 | CREATE VIRTUAL TABLE ft1 USING fts3(a, b) |
| 50 | } |
| 51 | do_write_test fts3_malloc-1.2 sqlite_master { |
| 52 | CREATE VIRTUAL TABLE ft2 USING fts3([a], [b]); |
| 53 | } |
| 54 | do_write_test fts3_malloc-1.3 sqlite_master { |
| 55 | CREATE VIRTUAL TABLE ft3 USING fts3('a', "b"); |
| 56 | } |
| 57 | do_write_test fts3_malloc-1.4 sqlite_master { |
| 58 | CREATE VIRTUAL TABLE ft4 USING fts3(`a`, 'fred''s column'); |
| 59 | } |
| 60 | do_error_test fts3_malloc-1.5 { |
| 61 | CREATE VIRTUAL TABLE ft5 USING fts3(a, b, tokenize unknown) |
| 62 | } {unknown tokenizer: unknown} |
| 63 | do_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: |
dan | f13b704 | 2009-11-17 12:52:10 +0000 | [diff] [blame] | 68 | #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 | #} |
dan | 948a5f8 | 2009-11-16 16:36:23 +0000 | [diff] [blame] | 75 | |
| 76 | |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 77 | |
| 78 | do_test fts3_malloc-2.0 { |
dan | f13b704 | 2009-11-17 12:52:10 +0000 | [diff] [blame] | 79 | execsql { |
| 80 | DROP TABLE ft1; |
| 81 | DROP TABLE ft2; |
| 82 | DROP TABLE ft3; |
| 83 | DROP TABLE ft4; |
| 84 | DROP TABLE ft6; |
| 85 | } |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 86 | 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 | |
| 99 | foreach {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'} { |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 228 | {one two three} {one two three four} |
| 229 | {one two three five} {one two three four five} |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 230 | } |
| 231 | |
| 232 | } { |
| 233 | set result [normal_list $result] |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 234 | do_select_test fts3_malloc-2.$tn $sql $result |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 235 | } |
| 236 | |
| 237 | do_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 | } {} |
| 256 | foreach {tn sql result} { |
| 257 | 1 "SELECT count(*) FROM ft" {1023} |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 258 | |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 259 | 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 | |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 266 | 3 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH 'o*'} { |
| 267 | 512 262144 |
| 268 | } |
| 269 | |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 270 | 4 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH '"two three four"'} { |
| 271 | 128 66368 |
| 272 | } |
| 273 | } { |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 274 | set result [normal_list $result] |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 275 | do_select_test fts3_malloc-3.$tn $sql $result |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 276 | } |
| 277 | |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 278 | do_test fts3_malloc-4.0 { |
| 279 | execsql { DELETE FROM ft WHERE docid>=32 } |
| 280 | } {} |
| 281 | foreach {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 | } |
| 288 | do_test fts3_malloc-4.2 { |
| 289 | execsql { SELECT a FROM ft } |
| 290 | } {two four {two four}} |
| 291 | |
dan | d3789b9 | 2010-01-22 15:48:18 +0000 | [diff] [blame] | 292 | do_write_test fts3_malloc-5.1 ft_content { |
| 293 | INSERT INTO ft VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken', 'cynics!') |
| 294 | } |
| 295 | do_test fts3_malloc-5.2 { |
| 296 | execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) } |
| 297 | } {} |
| 298 | do_write_test fts3_malloc-5.3 ft_content { |
| 299 | INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken') |
| 300 | } |
| 301 | |
dan | 91f0ce3 | 2009-11-14 11:41:00 +0000 | [diff] [blame] | 302 | |
dan | 09977bb | 2009-11-13 10:36:20 +0000 | [diff] [blame] | 303 | finish_test |
| 304 | |