Home | History | Annotate | Download | only in test
      1 # 2007 June 20
      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 # $Id: fts3ao.test,v 1.1 2007/08/20 17:38:42 shess Exp $
     15 #
     16 
     17 set testdir [file dirname $argv0]
     18 source $testdir/tester.tcl
     19 
     20 # If SQLITE_ENABLE_FTS3 is not defined, omit this file.
     21 ifcapable !fts3 {
     22   finish_test
     23   return
     24 }
     25 
     26 set ::testprefix fts3ao
     27 
     28 #---------------------------------------------------------------------
     29 # These tests, fts3ao-1.*, test that ticket #2429 is fixed.
     30 #
     31 db eval {
     32   CREATE VIRTUAL TABLE t1 USING fts3(a, b, c);
     33   INSERT INTO t1(a, b, c) VALUES('one three four', 'one four', 'one four two');
     34 }
     35 do_test fts3ao-1.1 {
     36   execsql {
     37     SELECT rowid, snippet(t1) FROM t1 WHERE c MATCH 'four';
     38   }
     39 } {1 {one <b>four</b> two}}
     40 do_test fts3ao-1.2 {
     41   execsql {
     42     SELECT rowid, snippet(t1) FROM t1 WHERE b MATCH 'four';
     43   }
     44 } {1 {one <b>four</b>}}
     45 do_test fts3ao-1.3 {
     46   execsql {
     47     SELECT rowid, snippet(t1) FROM t1 WHERE a MATCH 'four';
     48   }
     49 } {1 {one three <b>four</b>}}
     50 
     51 #---------------------------------------------------------------------
     52 # Test that it is possible to rename an fts3 table.
     53 #
     54 do_test fts3ao-2.1 {
     55   execsql { SELECT tbl_name FROM sqlite_master WHERE type = 'table'}
     56 } {t1 t1_content t1_segments t1_segdir}
     57 do_test fts3ao-2.2 {
     58   execsql { ALTER TABLE t1 RENAME to fts_t1; }
     59 } {}
     60 do_test fts3ao-2.3 {
     61   execsql { SELECT rowid, snippet(fts_t1) FROM fts_t1 WHERE a MATCH 'four'; }
     62 } {1 {one three <b>four</b>}}
     63 do_test fts3ao-2.4 {
     64   execsql { SELECT tbl_name FROM sqlite_master WHERE type = 'table'}
     65 } {fts_t1 fts_t1_content fts_t1_segments fts_t1_segdir}
     66 
     67 # See what happens when renaming the fts3 table fails.
     68 #
     69 do_test fts3ao-2.5 {
     70   catchsql {
     71     CREATE TABLE t1_segdir(a, b, c);
     72     ALTER TABLE fts_t1 RENAME to t1;
     73   }
     74 } {1 {SQL logic error or missing database}}
     75 do_test fts3ao-2.6 {
     76   execsql { SELECT rowid, snippet(fts_t1) FROM fts_t1 WHERE a MATCH 'four'; }
     77 } {1 {one three <b>four</b>}}
     78 do_test fts3ao-2.7 {
     79   execsql { SELECT tbl_name FROM sqlite_master WHERE type = 'table'}
     80 } {fts_t1 fts_t1_content fts_t1_segments fts_t1_segdir t1_segdir}
     81 
     82 # See what happens when renaming the fts3 table fails inside a transaction.
     83 #
     84 do_test fts3ao-2.8 {
     85   execsql {
     86     BEGIN;
     87     INSERT INTO fts_t1(a, b, c) VALUES('one two three', 'one four', 'one two');
     88   }
     89 } {}
     90 do_test fts3ao-2.9 {
     91   catchsql {
     92     ALTER TABLE fts_t1 RENAME to t1;
     93   }
     94 } {1 {SQL logic error or missing database}}
     95 do_test fts3ao-2.10 {
     96   execsql { SELECT rowid, snippet(fts_t1) FROM fts_t1 WHERE a MATCH 'four'; }
     97 } {1 {one three <b>four</b>}}
     98 do_test fts3ao-2.11 {
     99   execsql { SELECT tbl_name FROM sqlite_master WHERE type = 'table'}
    100 } {fts_t1 fts_t1_content fts_t1_segments fts_t1_segdir t1_segdir}
    101 do_test fts3ao-2.12 {
    102   execsql COMMIT
    103   execsql {SELECT a FROM fts_t1}
    104 } {{one three four} {one two three}}
    105 do_test fts3ao-2.12 {
    106   execsql { SELECT a, b, c FROM fts_t1 WHERE c MATCH 'four'; }
    107 } {{one three four} {one four} {one four two}}
    108 
    109 #-------------------------------------------------------------------
    110 # Close, delete and reopen the database. The following test should 
    111 # be run on an initially empty db.
    112 #
    113 db close
    114 file delete -force test.db test.db-journal
    115 sqlite3 db test.db
    116 
    117 do_test fts3ao-3.1 {
    118   execsql {
    119     CREATE VIRTUAL TABLE t1 USING fts3(a, b, c);
    120     INSERT INTO t1(a, b, c) VALUES('one three four', 'one four', 'one two');
    121     SELECT a, b, c FROM t1 WHERE c MATCH 'two';
    122   }
    123 } {{one three four} {one four} {one two}}
    124 
    125 # This test was crashing at one point.
    126 #
    127 do_test fts3ao-3.2 {
    128   execsql {
    129     SELECT a, b, c FROM t1 WHERE c MATCH 'two';
    130     CREATE TABLE t3(a, b, c);
    131     SELECT a, b, c FROM t1 WHERE  c  MATCH 'two';
    132   }
    133 } {{one three four} {one four} {one two} {one three four} {one four} {one two}}
    134 
    135 #---------------------------------------------------------------------
    136 # Test that it is possible to rename an fts3 table in an attached 
    137 # database.
    138 #
    139 file delete -force test2.db test2.db-journal
    140 
    141 do_test fts3ao-3.1 {
    142   execsql {
    143     ATTACH 'test2.db' AS aux;
    144     CREATE VIRTUAL TABLE aux.t1 USING fts3(a, b, c);
    145     INSERT INTO aux.t1(a, b, c) VALUES(
    146       'neung song sahm', 'neung see', 'neung see song'
    147     );
    148   }
    149 } {}
    150 
    151 do_test fts3ao-3.2 {
    152   execsql { SELECT a, b, c FROM aux.t1 WHERE a MATCH 'song'; }
    153 } {{neung song sahm} {neung see} {neung see song}}
    154 
    155 do_test fts3ao-3.3 {
    156   execsql { SELECT a, b, c FROM t1 WHERE c MATCH 'two'; }
    157 } {{one three four} {one four} {one two}}
    158 
    159 do_test fts3ao-3.4 {
    160   execsql { ALTER TABLE aux.t1 RENAME TO t2 }
    161 } {}
    162 
    163 do_test fts3ao-3.2 {
    164   execsql { SELECT a, b, c FROM t2 WHERE a MATCH 'song'; }
    165 } {{neung song sahm} {neung see} {neung see song}}
    166 
    167 do_test fts3ao-3.3 {
    168   execsql { SELECT a, b, c FROM t1 WHERE c MATCH 'two'; }
    169 } {{one three four} {one four} {one two}}
    170 
    171 #---------------------------------------------------------------------
    172 # Test that it is possible to rename an fts3 table within a 
    173 # transaction.
    174 #
    175 do_test fts3ao-4.1 {
    176   execsql {
    177     CREATE VIRTUAL TABLE t4 USING fts3;
    178     INSERT INTO t4 VALUES('the quick brown fox');
    179   }
    180 } {}
    181 do_test fts3ao-4.2 {
    182   execsql {
    183     BEGIN;
    184       INSERT INTO t4 VALUES('jumped over the');
    185   }
    186 } {}
    187 do_test fts3ao-4.3 { execsql { ALTER TABLE t4 RENAME TO t5; } } {}
    188 do_test fts3ao-4.4 { execsql { INSERT INTO t5 VALUES('lazy dog'); } } {}
    189 do_test fts3ao-4.5 { execsql COMMIT } {}
    190 do_test fts3ao-4.6 {
    191   execsql { SELECT * FROM t5 }
    192 } {{the quick brown fox} {jumped over the} {lazy dog}}
    193 do_test fts3ao-4.7 {
    194   execsql {
    195     BEGIN;
    196       INSERT INTO t5 VALUES('Down came a jumbuck to drink at that billabong');
    197       ALTER TABLE t5 RENAME TO t6;
    198       INSERT INTO t6 VALUES('Down came the troopers, one, two, three');
    199     ROLLBACK;
    200     SELECT * FROM t5;
    201   }
    202 } {{the quick brown fox} {jumped over the} {lazy dog}}
    203 
    204 # Test that it is possible to rename an FTS4 table. Renaming an FTS4 table
    205 # involves renaming the extra %_docsize and %_stat tables.
    206 #
    207 do_execsql_test 5.1 {
    208   CREATE VIRTUAL TABLE t7 USING FTS4;
    209   INSERT INTO t7 VALUES('coined by a German clinician');
    210   SELECT count(*) FROM sqlite_master WHERE name LIKE 't7%';
    211   SELECT count(*) FROM sqlite_master WHERE name LIKE 't8%';
    212 } {6 0}
    213 do_execsql_test 5.2 {
    214   ALTER TABLE t7 RENAME TO t8;
    215   SELECT count(*) FROM sqlite_master WHERE name LIKE 't7%';
    216   SELECT count(*) FROM sqlite_master WHERE name LIKE 't8%';
    217 } {0 6}
    218 
    219 finish_test
    220 
    221