modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/rbu/rbufts.test (about)

     1  # 2014 August 30
     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 for the RBU module. More specifically, it
    13  # contains tests to ensure that RBU works with FTS tables.
    14  #
    15  
    16  if {![info exists testdir]} {
    17    set testdir [file join [file dirname [info script]] .. .. test]
    18  }
    19  source $testdir/tester.tcl
    20  set ::testprefix rbufts
    21  
    22  ifcapable !fts3 {
    23    finish_test
    24    return
    25  }
    26  
    27  proc step_rbu {target rbu} {
    28    while 1 {
    29      sqlite3rbu rbu $target $rbu
    30      set rc [rbu step]
    31      rbu close
    32      if {$rc != "SQLITE_OK"} break
    33    }
    34    set rc
    35  }
    36  
    37  proc apply_rbu_update {target sql} {
    38    forcedelete rbu.db
    39    sqlite3 dbrbu rbu.db
    40    execsql $sql dbrbu
    41    dbrbu close
    42  
    43    step_rbu $target rbu.db
    44  }
    45  
    46  do_execsql_test 1.1.0 {
    47    CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b);
    48    CREATE VIRTUAL TABLE xx USING fts4(content=t1, a, b);
    49    INSERT INTO t1(rowid, a, b) VALUES(10, 'a b c', 'c b a');
    50    INSERT INTO t1(rowid, a, b) VALUES(20, 'a b c', 'd e f');
    51    INSERT INTO t1(rowid, a, b) VALUES(30, 'd e f', 'a b c');
    52    INSERT INTO t1(rowid, a, b) VALUES(40, 'd e f', 'd e f');
    53  }
    54  
    55  do_execsql_test 1.1.1 {
    56    INSERT INTO xx(xx) VALUES('rebuild');
    57    INSERT INTO xx(xx) VALUES('integrity-check');
    58  }
    59  
    60  do_test 1.1.2 {
    61    apply_rbu_update test.db {
    62      CREATE TABLE data_t1(i, a, b, rbu_control);
    63      INSERT INTO data_t1 VALUES(20, NULL, NULL, 1);        -- delete
    64      INSERT INTO data_t1 VALUES(30, 'x y z', NULL, '.x.'); -- update
    65      INSERT INTO data_t1 VALUES(50, '1 2 3', 'x y z', 0);  -- insert
    66  
    67      CREATE VIEW data0_xx AS 
    68      SELECT i AS rbu_rowid, a, b, 
    69      CASE WHEN rbu_control IN (0, 1) 
    70      THEN rbu_control ELSE substr(rbu_control, 2) END AS rbu_control
    71      FROM data_t1;
    72    }
    73  } {SQLITE_DONE}
    74  
    75  do_execsql_test 1.1.3 {
    76    INSERT INTO xx(xx) VALUES('integrity-check');
    77  }
    78  
    79  reset_db
    80  do_execsql_test 1.2.1 {
    81    CREATE TABLE ccc(addr, text);
    82    CREATE VIRTUAL TABLE ccc_fts USING fts4(addr, text, content=ccc);
    83    INSERT INTO ccc VALUES('a b c', 'd e f');
    84    INSERT INTO ccc VALUES('a b c', 'd e f');
    85    INSERT INTO ccc_fts(ccc_fts) VALUES('rebuild');
    86    INSERT INTO ccc_fts(ccc_fts) VALUES('integrity-check');
    87  }
    88  
    89  do_test 1.2.2 {
    90    apply_rbu_update test.db {
    91      CREATE TABLE data_ccc(addr, text, rbu_rowid, rbu_control);
    92      CREATE VIEW data0_ccc_fts AS SELECT * FROM data_ccc;
    93      INSERT INTO data_ccc VALUES(NULL, NULL, 1, 1);
    94      INSERT INTO data_ccc VALUES('x y z', NULL, 2, 'x.');
    95      INSERT INTO data_ccc VALUES('y y y', '1 1 1', 3, 0);
    96    }
    97  } {SQLITE_DONE}
    98  
    99  do_execsql_test 1.2.3 {
   100    INSERT INTO ccc_fts(ccc_fts) VALUES('integrity-check');
   101  }
   102  do_execsql_test 1.2.4 {
   103    SELECT rowid, * FROM ccc_fts;
   104  } {2 {x y z} {d e f} 3 {y y y} {1 1 1}}
   105  
   106  #-------------------------------------------------------------------------
   107  # Test the outcome of attempting to delete or update a row within a 
   108  # contentless FTS table using RBU. An error.
   109  #
   110  reset_db
   111  do_execsql_test 3.1 {
   112    CREATE VIRTUAL TABLE ft USING fts4(x, content=);
   113    INSERT INTO ft(rowid, x) VALUES(1, '1 2 3');
   114    INSERT INTO ft(rowid, x) VALUES(2, '4 5 6');
   115  }
   116  
   117  do_test 3.2 {
   118    list [catch { apply_rbu_update test.db {
   119      CREATE TABLE data_ft(x, rbu_rowid, rbu_control);
   120      INSERT INTO data_ft VALUES(NULL, 2, 1);
   121    } } msg] $msg]
   122  } {1 {SQLITE_ERROR - SQL logic error]}}
   123  
   124  do_test 3.3 {
   125    list [catch { apply_rbu_update test.db {
   126      CREATE TABLE data_ft(x, rbu_rowid, rbu_control);
   127      INSERT INTO data_ft VALUES('7 8 9', 1, 'x');
   128    } } msg] $msg]
   129  } {1 {SQLITE_ERROR - SQL logic error]}}
   130  
   131  
   132  
   133  finish_test
   134