gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/fts3malloc.test (about)

     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  do_write_test fts3_malloc-1.7 sqlite_master {
    66    CREATE VIRTUAL TABLE ft7 USING fts4(a, b, notindexed=b)
    67  }
    68  
    69  # Test the xConnect/xDisconnect methods:
    70  #db eval { ATTACH 'test2.db' AS aux }
    71  #do_write_test fts3_malloc-1.6 aux.sqlite_master {
    72  #  CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
    73  #}
    74  #do_write_test fts3_malloc-1.6 aux.sqlite_master {
    75  #  CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
    76  #}
    77  
    78  
    79  
    80  do_test fts3_malloc-2.0 {
    81    execsql { 
    82      DROP TABLE ft1;
    83      DROP TABLE ft2;
    84      DROP TABLE ft3;
    85      DROP TABLE ft4;
    86      DROP TABLE ft6;
    87      DROP TABLE ft7;
    88    }
    89    execsql { CREATE VIRTUAL TABLE ft USING fts3(a, b) }
    90    for {set ii 1} {$ii < 32} {incr ii} {
    91      set a [list]
    92      set b [list]
    93      if {$ii & 0x01} {lappend a one   ; lappend b neung}
    94      if {$ii & 0x02} {lappend a two   ; lappend b song }
    95      if {$ii & 0x04} {lappend a three ; lappend b sahm }
    96      if {$ii & 0x08} {lappend a four  ; lappend b see  }
    97      if {$ii & 0x10} {lappend a five  ; lappend b hah  }
    98      execsql { INSERT INTO ft VALUES($a, $b) }
    99    }
   100  } {}
   101  
   102  foreach {tn sql result} {
   103    1 "SELECT count(*) FROM sqlite_master" {5}
   104    2 "SELECT * FROM ft WHERE docid = 1"   {one neung}
   105    3 "SELECT * FROM ft WHERE docid = 2"   {two song}
   106    4 "SELECT * FROM ft WHERE docid = 3"   {{one two} {neung song}}
   107  
   108    5 "SELECT a FROM ft" {
   109      {one}                     {two}                 {one two}
   110      {three}                   {one three}           {two three}     
   111      {one two three}           {four}                {one four} 
   112      {two four}                {one two four}        {three four}   
   113      {one three four}          {two three four}      {one two three four}  
   114      {five}                    {one five}            {two five}            
   115      {one two five}            {three five}          {one three five} 
   116      {two three five}          {one two three five}  {four five}
   117      {one four five}           {two four five}       {one two four five}
   118      {three four five}         {one three four five} {two three four five}
   119      {one two three four five}
   120    }
   121  
   122    6 "SELECT a FROM ft WHERE a MATCH 'one'" {
   123      {one} {one two} {one three} {one two three}
   124      {one four} {one two four} {one three four} {one two three four}
   125      {one five} {one two five} {one three five} {one two three five}
   126      {one four five} {one two four five} 
   127      {one three four five} {one two three four five}
   128    }
   129  
   130    7 "SELECT a FROM ft WHERE a MATCH 'o*'" {
   131      {one} {one two} {one three} {one two three}
   132      {one four} {one two four} {one three four} {one two three four}
   133      {one five} {one two five} {one three five} {one two three five}
   134      {one four five} {one two four five} 
   135      {one three four five} {one two three four five}
   136    }
   137  
   138    8 "SELECT a FROM ft WHERE a MATCH 'o* t*'" {
   139      {one two}             {one three}           {one two three} 
   140      {one two four}        {one three four}      {one two three four} 
   141      {one two five}        {one three five}      {one two three five} 
   142      {one two four five}   {one three four five} {one two three four five}
   143    }
   144  
   145    9 "SELECT a FROM ft WHERE a MATCH '\"o* t*\"'" {
   146      {one two}             {one three}           {one two three} 
   147      {one two four}        {one three four}      {one two three four} 
   148      {one two five}        {one three five}      {one two three five} 
   149      {one two four five}   {one three four five} {one two three four five}
   150    }
   151  
   152    10 {SELECT a FROM ft WHERE a MATCH '"o* f*"'} {
   153      {one four}            {one five}            {one four five}
   154    }
   155  
   156    11 {SELECT a FROM ft WHERE a MATCH '"one two three"'} {
   157      {one two three}
   158      {one two three four}  
   159      {one two three five}
   160      {one two three four five}
   161    }
   162  
   163    12 {SELECT a FROM ft WHERE a MATCH '"two three four"'} {
   164      {two three four}
   165      {one two three four}
   166      {two three four five}
   167      {one two three four five}
   168    }
   169  
   170    12 {SELECT a FROM ft WHERE a MATCH '"two three" five'} {
   171      {two three five}         {one two three five}
   172      {two three four five}    {one two three four five}
   173    }
   174  
   175    13 {SELECT a FROM ft WHERE ft MATCH '"song sahm" hah'} {
   176      {two three five}         {one two three five}
   177      {two three four five}    {one two three four five}
   178    }
   179  
   180    14 {SELECT a FROM ft WHERE b MATCH 'neung'} {
   181      {one}                    {one two} 
   182      {one three}              {one two three}
   183      {one four}               {one two four} 
   184      {one three four}         {one two three four}
   185      {one five}               {one two five} 
   186      {one three five}         {one two three five}
   187      {one four five}          {one two four five} 
   188      {one three four five}    {one two three four five}
   189    }
   190  
   191    15 {SELECT a FROM ft WHERE b MATCH '"neung song sahm"'} {
   192      {one two three}          {one two three four}  
   193      {one two three five}     {one two three four five}
   194    }
   195  
   196    16 {SELECT a FROM ft WHERE b MATCH 'hah "song sahm"'} {
   197      {two three five}         {one two three five}
   198      {two three four five}    {one two three four five}
   199    }
   200  
   201    17 {SELECT a FROM ft WHERE b MATCH 'song OR sahm'} {
   202      {two}                     {one two}             {three}
   203      {one three}               {two three}           {one two three}
   204      {two four}                {one two four}        {three four}   
   205      {one three four}          {two three four}      {one two three four}  
   206      {two five}                {one two five}        {three five}
   207      {one three five}          {two three five}      {one two three five}
   208      {two four five}           {one two four five}   {three four five}
   209      {one three four five}     {two three four five} {one two three four five}
   210    }
   211  
   212    18 {SELECT a FROM ft WHERE a MATCH 'three NOT two'} {
   213      {three}                   {one three}           {three four}   
   214      {one three four}          {three five}          {one three five}
   215      {three four five}         {one three four five}
   216    }
   217  
   218    19 {SELECT a FROM ft WHERE b MATCH 'sahm NOT song'} {
   219      {three}                   {one three}           {three four}   
   220      {one three four}          {three five}          {one three five}
   221      {three four five}         {one three four five}
   222    }
   223  
   224    20 {SELECT a FROM ft WHERE ft MATCH 'sahm NOT song'} {
   225      {three}                   {one three}           {three four}   
   226      {one three four}          {three five}          {one three five}
   227      {three four five}         {one three four five}
   228    }
   229  
   230    21 {SELECT a FROM ft WHERE b MATCH 'neung NEAR song NEAR sahm'} {
   231      {one two three}           {one two three four}  
   232      {one two three five}      {one two three four five}
   233    }
   234  
   235  } {
   236    set result [normal_list $result]
   237    do_select_test fts3_malloc-2.$tn $sql $result
   238  }
   239  
   240  do_test fts3_malloc-3.0 {
   241    execsql BEGIN
   242    for {set ii 32} {$ii < 1024} {incr ii} {
   243      set a [list]
   244      set b [list]
   245      if {$ii & 0x0001} {lappend a one   ; lappend b neung }
   246      if {$ii & 0x0002} {lappend a two   ; lappend b song  }
   247      if {$ii & 0x0004} {lappend a three ; lappend b sahm  }
   248      if {$ii & 0x0008} {lappend a four  ; lappend b see   }
   249      if {$ii & 0x0010} {lappend a five  ; lappend b hah   }
   250      if {$ii & 0x0020} {lappend a six   ; lappend b hok   }
   251      if {$ii & 0x0040} {lappend a seven ; lappend b jet   }
   252      if {$ii & 0x0080} {lappend a eight ; lappend b bairt }
   253      if {$ii & 0x0100} {lappend a nine  ; lappend b gow   }
   254      if {$ii & 0x0200} {lappend a ten   ; lappend b sip   }
   255      execsql { INSERT INTO ft VALUES($a, $b) }
   256    }
   257    execsql COMMIT
   258  } {}
   259  foreach {tn sql result} {
   260    1 "SELECT count(*) FROM ft" {1023}
   261  
   262    2 "SELECT a FROM ft WHERE a MATCH 'one two three four five six seven eight'" {
   263       {one two three four five six seven eight}
   264       {one two three four five six seven eight nine}
   265       {one two three four five six seven eight ten}
   266       {one two three four five six seven eight nine ten}
   267    }
   268  
   269    3 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH 'o*'} {
   270      512 262144
   271    }
   272  
   273    4 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH '"two three four"'} {
   274      128 66368
   275    }
   276  } {
   277    set result [normal_list $result]
   278    do_select_test fts3_malloc-3.$tn $sql $result
   279  }
   280  
   281  do_test fts3_malloc-4.0 {
   282    execsql { DELETE FROM ft WHERE docid>=32 }
   283  } {}
   284  foreach {tn sql} {
   285    1 "DELETE FROM ft WHERE ft MATCH 'one'"
   286    2 "DELETE FROM ft WHERE ft MATCH 'three'"
   287    3 "DELETE FROM ft WHERE ft MATCH 'five'"
   288  } {
   289    do_write_test fts3_malloc-4.1.$tn ft_content $sql
   290  }
   291  do_test fts3_malloc-4.2 {
   292    execsql { SELECT a FROM ft }
   293  } {two four {two four}}
   294  
   295  do_write_test fts3_malloc-5.1 ft_content {
   296    INSERT INTO ft VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken', 'cynics!')
   297  }
   298  do_test fts3_malloc-5.2 {
   299    execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) }
   300  } {}
   301  
   302  do_write_test fts3_malloc-5.3 ft_content {
   303    INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')
   304  }
   305  
   306  
   307  finish_test