Home | History | Annotate | Download | only in test
      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 do_write_test fts3_malloc-5.3 ft_content {
    298   INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')
    299 }
    300 
    301 
    302 finish_test
    303 
    304