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

     1  # 2007 March 9
     2  #
     3  # The author disclaims copyright to this source code.
     4  #
     5  #*************************************************************************
     6  # This file implements regression tests for SQLite library.  These
     7  # make sure that fts2 insertion buffering is fully transparent when
     8  # using transactions.
     9  #
    10  # $Id: fts2k.test,v 1.2 2007/08/10 23:47:04 shess Exp $
    11  #
    12  
    13  set testdir [file dirname $argv0]
    14  source $testdir/tester.tcl
    15  
    16  # If SQLITE_ENABLE_FTS2 is defined, omit this file.
    17  ifcapable !fts2 {
    18    finish_test
    19    return
    20  }
    21  
    22  db eval {
    23    CREATE VIRTUAL TABLE t1 USING fts2(content);
    24    INSERT INTO t1 (rowid, content) VALUES(1, "hello world");
    25    INSERT INTO t1 (rowid, content) VALUES(2, "hello there");
    26    INSERT INTO t1 (rowid, content) VALUES(3, "cruel world");
    27  }
    28  
    29  # Test that possibly-buffered inserts went through after commit.
    30  do_test fts2k-1.1 {
    31    execsql {
    32      BEGIN TRANSACTION;
    33      INSERT INTO t1 (rowid, content) VALUES(4, "false world");
    34      INSERT INTO t1 (rowid, content) VALUES(5, "false door");
    35      COMMIT TRANSACTION;
    36      SELECT rowid FROM t1 WHERE t1 MATCH 'world';
    37    }
    38  } {1 3 4}
    39  
    40  # Test that buffered inserts are seen by selects in the same
    41  # transaction.
    42  do_test fts2k-1.2 {
    43    execsql {
    44      BEGIN TRANSACTION;
    45      INSERT INTO t1 (rowid, content) VALUES(6, "another world");
    46      INSERT INTO t1 (rowid, content) VALUES(7, "another test");
    47      SELECT rowid FROM t1 WHERE t1 MATCH 'world';
    48      COMMIT TRANSACTION;
    49    }
    50  } {1 3 4 6}
    51  
    52  # Test that buffered inserts are seen within a transaction.  This is
    53  # really the same test as 1.2.
    54  do_test fts2k-1.3 {
    55    execsql {
    56      BEGIN TRANSACTION;
    57      INSERT INTO t1 (rowid, content) VALUES(8, "second world");
    58      INSERT INTO t1 (rowid, content) VALUES(9, "second sight");
    59      SELECT rowid FROM t1 WHERE t1 MATCH 'world';
    60      ROLLBACK TRANSACTION;
    61    }
    62  } {1 3 4 6 8}
    63  
    64  # Double-check that the previous result doesn't persist past the
    65  # rollback!
    66  do_test fts2k-1.4 {
    67    execsql {
    68      SELECT rowid FROM t1 WHERE t1 MATCH 'world';
    69    }
    70  } {1 3 4 6}
    71  
    72  # Test it all together.
    73  do_test fts2k-1.5 {
    74    execsql {
    75      BEGIN TRANSACTION;
    76      INSERT INTO t1 (rowid, content) VALUES(10, "second world");
    77      INSERT INTO t1 (rowid, content) VALUES(11, "second sight");
    78      ROLLBACK TRANSACTION;
    79      SELECT rowid FROM t1 WHERE t1 MATCH 'world';
    80    }
    81  } {1 3 4 6}
    82  
    83  # Test that the obvious case works.
    84  do_test fts2k-1.6 {
    85    execsql {
    86      BEGIN;
    87      INSERT INTO t1 (rowid, content) VALUES(12, "third world");
    88      COMMIT;
    89      SELECT rowid FROM t1 WHERE t1 MATCH 'third';
    90    }
    91  } {12}
    92  
    93  # This is exactly the same as the previous test, except that older
    94  # code loses the INSERT due to an SQLITE_SCHEMA error.
    95  do_test fts2k-1.7 {
    96    execsql {
    97      BEGIN;
    98      INSERT INTO t1 (rowid, content) VALUES(13, "third dimension");
    99      CREATE TABLE x (c);
   100      COMMIT;
   101      SELECT rowid FROM t1 WHERE t1 MATCH 'dimension';
   102    }
   103  } {13}
   104  
   105  finish_test