Annotation of embedaddon/sqlite3/test/fts3malloc.test, revision 1.1
1.1 ! misho 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 andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken', 'cynics!')
! 293: }
! 294: do_test fts3_malloc-5.2 {
! 295: execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) }
! 296: } {}
! 297:
! 298: do_write_test fts3_malloc-5.3 ft_content {
! 299: INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')
! 300: }
! 301:
! 302:
! 303: finish_test
! 304:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>