Home | History | Annotate | Download | only in test
      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
    106