github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/fts3comp1.test (about)

     1  # 2011 January 27
     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  # This file implements regression tests for SQLite library.  The
    12  # focus of this script is testing the FTS3 module.
    13  #
    14  
    15  set testdir [file dirname $argv0]
    16  source $testdir/tester.tcl
    17  ifcapable !fts3 { finish_test ; return }
    18  set ::testprefix fts3comp1
    19  
    20  # Create a pretend compression system. 
    21  #
    22  # Each time the [zip] function is called, an entry is added to the ::strings
    23  # array mapping from an integer key to the string argument to zip. The key
    24  # is returned. Later on, when the key is passed to [unzip], the original
    25  # string is retrieved from the ::strings array and returned.
    26  #
    27  set next_x 0
    28  proc zip {x} {
    29   incr ::next_x
    30   set ::strings($::next_x) $x
    31   return $::next_x
    32  }
    33  proc unzip {x} {
    34    return $::strings($x)
    35  }
    36  
    37  foreach {tn zip unzip} {
    38    1   zip   unzip
    39    2   {z.i.p!!}    {un "zip"}
    40  } {
    41  
    42    set next_x 0
    43    catch {db close}
    44    forcedelete test.db
    45    sqlite3 db test.db
    46    db func $zip zip
    47    db func $unzip unzip
    48    
    49    # Create a table that uses zip/unzip. Check that content inserted into
    50    # the table can be read back (using a full-scan query). Check that the
    51    # underlying %_content table contains the compressed (integer) values.
    52    #
    53    do_execsql_test 1.$tn.0 "
    54      CREATE VIRTUAL TABLE t1 USING fts4(
    55        a, b, 
    56        compress='$zip', uncompress='$unzip'
    57      );
    58    "
    59    do_execsql_test 1.$tn.1 {
    60      INSERT INTO t1 VALUES('one two three', 'two four six');
    61      SELECT a, b FROM t1;
    62    } {{one two three} {two four six}}
    63    do_execsql_test 1.$tn.2 {
    64      SELECT c0a, c1b FROM t1_content;
    65    } {1 2}
    66    
    67    # Insert another row and check that it can be read back. Also that the
    68    # %_content table still contains all compressed content. This time, try
    69    # full-text index and by-docid queries too.
    70    #
    71    do_execsql_test 1.$tn.3 {
    72      INSERT INTO t1 VALUES('three six nine', 'four eight twelve');
    73      SELECT a, b FROM t1;
    74    } {{one two three} {two four six} {three six nine} {four eight twelve}}
    75    do_execsql_test 1.$tn.4 {
    76      SELECT c0a, c1b FROM t1_content;
    77    } {1 2 3 4}
    78    
    79    do_execsql_test 1.$tn.5 {
    80      SELECT a, b FROM t1 WHERE docid = 2
    81    } {{three six nine} {four eight twelve}}
    82    do_execsql_test 1.$tn.6 {
    83      SELECT a, b FROM t1 WHERE t1 MATCH 'two'
    84    } {{one two three} {two four six}}
    85    
    86    # Delete a row and check that the full-text index is correctly updated.
    87    # Inspect the full-text index using an fts4aux table.
    88    #
    89    do_execsql_test 1.$tn.7 {
    90      CREATE VIRTUAL TABLE terms USING fts4aux(t1);
    91      SELECT term, documents, occurrences FROM terms WHERE col = '*';
    92    } {
    93      eight 1 1    four 2 2    nine 1 1    one 1 1 
    94      six 2 2      three 2 2   twelve 1 1  two 1 2
    95    }
    96    do_execsql_test 1.$tn.8 {
    97      DELETE FROM t1 WHERE docid = 1;
    98      SELECT term, documents, occurrences FROM terms WHERE col = '*';
    99    } {
   100      eight 1 1   four 1 1    nine 1 1 
   101      six 1 1     three 1 1   twelve 1 1
   102    }
   103    do_execsql_test 1.$tn.9 { SELECT c0a, c1b FROM t1_content } {3 4}
   104  }
   105  
   106  # Test that is an error to specify just one of compress and uncompress.
   107  #
   108  do_catchsql_test 2.1 {
   109    CREATE VIRTUAL TABLE t2 USING fts4(x, compress=zip)
   110  } {1 {missing uncompress parameter in fts4 constructor}}
   111  do_catchsql_test 2.2 {
   112    CREATE VIRTUAL TABLE t2 USING fts4(x, uncompress=unzip)
   113  } {1 {missing compress parameter in fts4 constructor}}
   114  
   115  finish_test