123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- # 2009 October 22
- #
- # The author disclaims copyright to this source code. In place of
- # a legal notice, here is a blessing:
- #
- # May you do good and not evil.
- # May you find forgiveness for yourself and forgive others.
- # May you share freely, never taking more than you give.
- #
- #***********************************************************************
- #
- # This file contains tests to verify that malloc() errors that occur
- # within the FTS3 module code are handled correctly.
- #
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- ifcapable !fts3 { finish_test ; return }
- source $testdir/malloc_common.tcl
- source $testdir/fts3_common.tcl
- # Ensure the lookaside buffer is disabled for these tests.
- #
- sqlite3 db test.db
- sqlite3_db_config_lookaside db 0 0 0
- set sqlite_fts3_enable_parentheses 1
- set DO_MALLOC_TEST 1
- # Test organization:
- #
- # fts3_malloc-1.*: Test OOM during CREATE and DROP table statements.
- # fts3_malloc-2.*: Test OOM during SELECT operations.
- # fts3_malloc-3.*: Test OOM during SELECT operations with a larger database.
- # fts3_malloc-4.*: Test OOM during database write operations.
- # fts3_malloc-5.*: Test that a couple of memory leaks that could follow
- # OOM in tokenizer code have been fixed.
- #
- proc normal_list {l} {
- set ret [list]
- foreach elem $l {lappend ret $elem}
- set ret
- }
- do_write_test fts3_malloc-1.1 sqlite_master {
- CREATE VIRTUAL TABLE ft1 USING fts3(a, b)
- }
- do_write_test fts3_malloc-1.2 sqlite_master {
- CREATE VIRTUAL TABLE ft2 USING fts3([a], [b]);
- }
- do_write_test fts3_malloc-1.3 sqlite_master {
- CREATE VIRTUAL TABLE ft3 USING fts3('a', "b");
- }
- do_write_test fts3_malloc-1.4 sqlite_master {
- CREATE VIRTUAL TABLE ft4 USING fts3(`a`, 'fred''s column');
- }
- do_error_test fts3_malloc-1.5 {
- CREATE VIRTUAL TABLE ft5 USING fts3(a, b, tokenize unknown)
- } {unknown tokenizer: unknown}
- do_write_test fts3_malloc-1.6 sqlite_master {
- CREATE VIRTUAL TABLE ft6 USING fts3(a, b, tokenize porter)
- }
- do_write_test fts3_malloc-1.7 sqlite_master {
- CREATE VIRTUAL TABLE ft7 USING fts4(a, b, notindexed=b)
- }
- # Test the xConnect/xDisconnect methods:
- #db eval { ATTACH 'test2.db' AS aux }
- #do_write_test fts3_malloc-1.6 aux.sqlite_master {
- # CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
- #}
- #do_write_test fts3_malloc-1.6 aux.sqlite_master {
- # CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
- #}
- do_test fts3_malloc-2.0 {
- execsql {
- DROP TABLE ft1;
- DROP TABLE ft2;
- DROP TABLE ft3;
- DROP TABLE ft4;
- DROP TABLE ft6;
- DROP TABLE ft7;
- }
- execsql { CREATE VIRTUAL TABLE ft USING fts3(a, b) }
- for {set ii 1} {$ii < 32} {incr ii} {
- set a [list]
- set b [list]
- if {$ii & 0x01} {lappend a one ; lappend b neung}
- if {$ii & 0x02} {lappend a two ; lappend b song }
- if {$ii & 0x04} {lappend a three ; lappend b sahm }
- if {$ii & 0x08} {lappend a four ; lappend b see }
- if {$ii & 0x10} {lappend a five ; lappend b hah }
- execsql { INSERT INTO ft VALUES($a, $b) }
- }
- } {}
- foreach {tn sql result} {
- 1 "SELECT count(*) FROM sqlite_master" {5}
- 2 "SELECT * FROM ft WHERE docid = 1" {one neung}
- 3 "SELECT * FROM ft WHERE docid = 2" {two song}
- 4 "SELECT * FROM ft WHERE docid = 3" {{one two} {neung song}}
- 5 "SELECT a FROM ft" {
- {one} {two} {one two}
- {three} {one three} {two three}
- {one two three} {four} {one four}
- {two four} {one two four} {three four}
- {one three four} {two three four} {one two three four}
- {five} {one five} {two five}
- {one two five} {three five} {one three five}
- {two three five} {one two three five} {four five}
- {one four five} {two four five} {one two four five}
- {three four five} {one three four five} {two three four five}
- {one two three four five}
- }
- 6 "SELECT a FROM ft WHERE a MATCH 'one'" {
- {one} {one two} {one three} {one two three}
- {one four} {one two four} {one three four} {one two three four}
- {one five} {one two five} {one three five} {one two three five}
- {one four five} {one two four five}
- {one three four five} {one two three four five}
- }
- 7 "SELECT a FROM ft WHERE a MATCH 'o*'" {
- {one} {one two} {one three} {one two three}
- {one four} {one two four} {one three four} {one two three four}
- {one five} {one two five} {one three five} {one two three five}
- {one four five} {one two four five}
- {one three four five} {one two three four five}
- }
- 8 "SELECT a FROM ft WHERE a MATCH 'o* t*'" {
- {one two} {one three} {one two three}
- {one two four} {one three four} {one two three four}
- {one two five} {one three five} {one two three five}
- {one two four five} {one three four five} {one two three four five}
- }
- 9 "SELECT a FROM ft WHERE a MATCH '\"o* t*\"'" {
- {one two} {one three} {one two three}
- {one two four} {one three four} {one two three four}
- {one two five} {one three five} {one two three five}
- {one two four five} {one three four five} {one two three four five}
- }
- 10 {SELECT a FROM ft WHERE a MATCH '"o* f*"'} {
- {one four} {one five} {one four five}
- }
- 11 {SELECT a FROM ft WHERE a MATCH '"one two three"'} {
- {one two three}
- {one two three four}
- {one two three five}
- {one two three four five}
- }
- 12 {SELECT a FROM ft WHERE a MATCH '"two three four"'} {
- {two three four}
- {one two three four}
- {two three four five}
- {one two three four five}
- }
- 12 {SELECT a FROM ft WHERE a MATCH '"two three" five'} {
- {two three five} {one two three five}
- {two three four five} {one two three four five}
- }
- 13 {SELECT a FROM ft WHERE ft MATCH '"song sahm" hah'} {
- {two three five} {one two three five}
- {two three four five} {one two three four five}
- }
- 14 {SELECT a FROM ft WHERE b MATCH 'neung'} {
- {one} {one two}
- {one three} {one two three}
- {one four} {one two four}
- {one three four} {one two three four}
- {one five} {one two five}
- {one three five} {one two three five}
- {one four five} {one two four five}
- {one three four five} {one two three four five}
- }
- 15 {SELECT a FROM ft WHERE b MATCH '"neung song sahm"'} {
- {one two three} {one two three four}
- {one two three five} {one two three four five}
- }
- 16 {SELECT a FROM ft WHERE b MATCH 'hah "song sahm"'} {
- {two three five} {one two three five}
- {two three four five} {one two three four five}
- }
- 17 {SELECT a FROM ft WHERE b MATCH 'song OR sahm'} {
- {two} {one two} {three}
- {one three} {two three} {one two three}
- {two four} {one two four} {three four}
- {one three four} {two three four} {one two three four}
- {two five} {one two five} {three five}
- {one three five} {two three five} {one two three five}
- {two four five} {one two four five} {three four five}
- {one three four five} {two three four five} {one two three four five}
- }
- 18 {SELECT a FROM ft WHERE a MATCH 'three NOT two'} {
- {three} {one three} {three four}
- {one three four} {three five} {one three five}
- {three four five} {one three four five}
- }
- 19 {SELECT a FROM ft WHERE b MATCH 'sahm NOT song'} {
- {three} {one three} {three four}
- {one three four} {three five} {one three five}
- {three four five} {one three four five}
- }
- 20 {SELECT a FROM ft WHERE ft MATCH 'sahm NOT song'} {
- {three} {one three} {three four}
- {one three four} {three five} {one three five}
- {three four five} {one three four five}
- }
- 21 {SELECT a FROM ft WHERE b MATCH 'neung NEAR song NEAR sahm'} {
- {one two three} {one two three four}
- {one two three five} {one two three four five}
- }
- } {
- set result [normal_list $result]
- do_select_test fts3_malloc-2.$tn $sql $result
- }
- do_test fts3_malloc-3.0 {
- execsql BEGIN
- for {set ii 32} {$ii < 1024} {incr ii} {
- set a [list]
- set b [list]
- if {$ii & 0x0001} {lappend a one ; lappend b neung }
- if {$ii & 0x0002} {lappend a two ; lappend b song }
- if {$ii & 0x0004} {lappend a three ; lappend b sahm }
- if {$ii & 0x0008} {lappend a four ; lappend b see }
- if {$ii & 0x0010} {lappend a five ; lappend b hah }
- if {$ii & 0x0020} {lappend a six ; lappend b hok }
- if {$ii & 0x0040} {lappend a seven ; lappend b jet }
- if {$ii & 0x0080} {lappend a eight ; lappend b bairt }
- if {$ii & 0x0100} {lappend a nine ; lappend b gow }
- if {$ii & 0x0200} {lappend a ten ; lappend b sip }
- execsql { INSERT INTO ft VALUES($a, $b) }
- }
- execsql COMMIT
- } {}
- foreach {tn sql result} {
- 1 "SELECT count(*) FROM ft" {1023}
- 2 "SELECT a FROM ft WHERE a MATCH 'one two three four five six seven eight'" {
- {one two three four five six seven eight}
- {one two three four five six seven eight nine}
- {one two three four five six seven eight ten}
- {one two three four five six seven eight nine ten}
- }
- 3 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH 'o*'} {
- 512 262144
- }
- 4 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH '"two three four"'} {
- 128 66368
- }
- } {
- set result [normal_list $result]
- do_select_test fts3_malloc-3.$tn $sql $result
- }
- do_test fts3_malloc-4.0 {
- execsql { DELETE FROM ft WHERE docid>=32 }
- } {}
- foreach {tn sql} {
- 1 "DELETE FROM ft WHERE ft MATCH 'one'"
- 2 "DELETE FROM ft WHERE ft MATCH 'three'"
- 3 "DELETE FROM ft WHERE ft MATCH 'five'"
- } {
- do_write_test fts3_malloc-4.1.$tn ft_content $sql
- }
- do_test fts3_malloc-4.2 {
- execsql { SELECT a FROM ft }
- } {two four {two four}}
- do_write_test fts3_malloc-5.1 ft_content {
- INSERT INTO ft VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken', 'cynics!')
- }
- do_test fts3_malloc-5.2 {
- execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) }
- } {}
- do_write_test fts3_malloc-5.3 ft_content {
- INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')
- }
- finish_test
|