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>