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

     1  # 2015 September 05
     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  
    13  source [file join [file dirname [info script]] fts5_common.tcl]
    14  set testprefix fts5simple
    15  
    16  # If SQLITE_ENABLE_FTS5 is defined, omit this file.
    17  ifcapable !fts5 {
    18    finish_test
    19    return
    20  }
    21  
    22  if 1 {
    23  
    24  #-------------------------------------------------------------------------
    25  #
    26  set doc "x x [string repeat {y } 50]z z"
    27  do_execsql_test 1.0 {
    28    CREATE VIRTUAL TABLE t1 USING fts5(x);
    29    INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
    30    BEGIN;
    31      INSERT INTO t1 VALUES($doc);
    32    COMMIT;
    33  }
    34  
    35  do_execsql_test 1.1 {
    36    INSERT INTO t1(t1) VALUES('integrity-check');
    37  }
    38  
    39  #-------------------------------------------------------------------------
    40  #
    41  reset_db
    42  do_execsql_test 2.0 {
    43    CREATE VIRTUAL TABLE t1 USING fts5(x);
    44    INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
    45    INSERT INTO t1 VALUES('a b c');
    46    INSERT INTO t1 VALUES('d e f');
    47    INSERT INTO t1(t1) VALUES('optimize');
    48  }
    49  
    50  do_execsql_test 2.1 {
    51    INSERT INTO t1(t1) VALUES('integrity-check');
    52  } {}
    53  
    54  
    55  #-------------------------------------------------------------------------
    56  #
    57  reset_db
    58  do_execsql_test 3.0 {
    59    CREATE VIRTUAL TABLE t1 USING fts5(x, prefix='1,2');
    60    INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
    61    BEGIN;
    62    INSERT INTO t1 VALUES('one');
    63    SELECT * FROM t1 WHERE t1 MATCH 'o*';
    64  } {one}
    65  
    66  do_execsql_test 3.1 {
    67    INSERT INTO t1(t1) VALUES('integrity-check');
    68  } {}
    69  
    70  #-------------------------------------------------------------------------
    71  reset_db
    72  do_execsql_test 4.1 {
    73    CREATE VIRTUAL TABLE t11 USING fts5(content);
    74    INSERT INTO t11(t11, rank) VALUES('pgsz', 32);
    75    INSERT INTO t11 VALUES('another');
    76    INSERT INTO t11 VALUES('string');
    77    INSERT INTO t11 VALUES('of');
    78    INSERT INTO t11 VALUES('text');
    79  }
    80  do_test 4.2 {
    81    execsql { INSERT INTO t11(t11) VALUES('optimize') }
    82  } {}
    83  do_execsql_test 4.3 {
    84    INSERT INTO t11(t11) VALUES('integrity-check');
    85  } {}
    86  
    87  #db eval { SELECT fts5_decode(rowid, block) as x FROM t11_data } { puts $x }
    88  
    89  #-------------------------------------------------------------------------
    90  reset_db
    91  set doc [string repeat "x y " 5]
    92  do_execsql_test 5.1 {
    93    CREATE VIRTUAL TABLE yy USING fts5(content);
    94    INSERT INTO yy(yy, rank) VALUES('pgsz', 32);
    95    BEGIN;
    96      INSERT INTO yy VALUES($doc);
    97      INSERT INTO yy VALUES($doc);
    98      INSERT INTO yy VALUES($doc);
    99      INSERT INTO yy VALUES($doc);
   100      INSERT INTO yy VALUES($doc);
   101      INSERT INTO yy VALUES($doc);
   102      INSERT INTO yy VALUES($doc);
   103      INSERT INTO yy VALUES($doc);
   104    COMMIT;
   105  }
   106  
   107  do_execsql_test 5.2 {
   108    SELECT rowid FROM yy WHERE yy MATCH 'y' ORDER BY rowid ASC
   109  } {1 2 3 4 5 6 7 8}
   110  
   111  do_execsql_test 5.3 {
   112    SELECT rowid FROM yy WHERE yy MATCH 'y' ORDER BY rowid DESC
   113  } {8 7 6 5 4 3 2 1}
   114  
   115  #db eval { SELECT fts5_decode(rowid, block) as x FROM yy_data } { puts $x }
   116  
   117  #-------------------------------------------------------------------------
   118  reset_db
   119  do_execsql_test 5.1 {
   120    CREATE VIRTUAL TABLE tt USING fts5(content);
   121    INSERT INTO tt(tt, rank) VALUES('pgsz', 32);
   122    INSERT INTO tt VALUES('aa');
   123  }
   124  
   125  do_execsql_test 5.2 {
   126    SELECT rowid FROM tt WHERE tt MATCH 'a*';
   127  } {1}
   128  
   129  do_execsql_test 5.3 {
   130    DELETE FROM tt;
   131    BEGIN;
   132      INSERT INTO tt VALUES('aa');
   133      INSERT INTO tt VALUES('ab');
   134    COMMIT;
   135  } {}
   136  
   137  do_execsql_test 5.4 {
   138    SELECT rowid FROM tt WHERE tt MATCH 'a*';
   139  } {1 2}
   140  
   141  do_execsql_test 5.5 {
   142    DELETE FROM tt;
   143    BEGIN;
   144      INSERT INTO tt VALUES('aa');
   145      INSERT INTO tt VALUES('ab');
   146      INSERT INTO tt VALUES('aa');
   147      INSERT INTO tt VALUES('ab');
   148      INSERT INTO tt VALUES('aa');
   149      INSERT INTO tt VALUES('ab');
   150      INSERT INTO tt VALUES('aa');
   151      INSERT INTO tt VALUES('ab');
   152    COMMIT;
   153    SELECT rowid FROM tt WHERE tt MATCH 'a*';
   154  } {1 2 3 4 5 6 7 8}
   155  
   156  do_execsql_test 5.6 {
   157    INSERT INTO tt(tt) VALUES('integrity-check');
   158  }
   159  
   160  reset_db
   161  do_execsql_test 5.7 {
   162    CREATE VIRTUAL TABLE tt USING fts5(content);
   163    INSERT INTO tt(tt, rank) VALUES('pgsz', 32);
   164    INSERT INTO tt VALUES('aa ab ac ad ae af');
   165  }
   166  
   167  do_execsql_test 5.8 {
   168    SELECT rowid FROM tt WHERE tt MATCH 'a*';
   169  } {1}
   170  
   171  #-------------------------------------------------------------------------
   172  
   173  reset_db
   174  do_execsql_test 6.1 {
   175    CREATE VIRTUAL TABLE xyz USING fts5(x, y, z);
   176    INSERT INTO xyz VALUES('x', 'y', 'z');
   177  }
   178  
   179  do_catchsql_test 6.2 { 
   180    SELECT * FROM xyz WHERE xyz MATCH '' 
   181  } {1 {fts5: syntax error near ""}}
   182  do_catchsql_test 6.3 { 
   183    SELECT * FROM xyz WHERE xyz MATCH NULL 
   184  } {1 {fts5: syntax error near ""}}
   185  
   186  #-------------------------------------------------------------------------
   187  
   188  do_execsql_test 7.1 {
   189    CREATE VIRTUAL TABLE ft2 USING fts5(content);
   190    INSERT INTO ft2(rowid, content) VALUES(1, 'a b c');
   191    INSERT INTO ft2(rowid, content) VALUES(2, 'a b d');
   192  } 
   193  
   194  do_catchsql_test 7.2 {
   195    BEGIN;
   196      UPDATE ft2 SET rowid=2 WHERE rowid=1;
   197  } {1 {constraint failed}} 
   198  
   199  do_execsql_test 7.3 {
   200    COMMIT;
   201    INSERT INTO ft2(ft2) VALUES('integrity-check');
   202  } {}
   203  
   204  do_execsql_test 7.4 {
   205    SELECT * FROM ft2;
   206  } {{a b c} {a b d}}
   207  
   208  #-------------------------------------------------------------------------
   209  #
   210  reset_db
   211  do_execsql_test 8.1 {
   212    CREATE VIRTUAL TABLE ft2 USING fts5(content);
   213    INSERT INTO ft2(rowid, content) VALUES(1, 'a b');
   214  }
   215  
   216  do_execsql_test 8.2 {
   217    BEGIN;
   218      INSERT INTO ft2(rowid, content) VALUES(4, 'a x');
   219  }
   220  
   221  do_execsql_test 8.3 {
   222    INSERT INTO ft2(ft2) VALUES('integrity-check');
   223  }
   224  
   225  #-------------------------------------------------------------------------
   226  # Check that the "table function" syntax works.
   227  #
   228  reset_db
   229  do_execsql_test 9.1 {
   230    CREATE VIRTUAL TABLE ft2 USING fts5(content);
   231    INSERT INTO ft2(rowid, content) VALUES(1, 'a b');
   232    INSERT INTO ft2(rowid, content) VALUES(2, 'a b c d');
   233    INSERT INTO ft2(rowid, content) VALUES(3, 'c d e f');
   234  }
   235  
   236  do_execsql_test 9.2 {
   237    SELECT rowid FROM ft2('a');
   238  } {1 2}
   239  
   240  do_execsql_test 9.3 {
   241    SELECT rowid FROM ft2('b AND c');
   242  } {2}
   243  
   244  #-------------------------------------------------------------------------
   245  #
   246  do_execsql_test 10.0 {
   247    CREATE VIRTUAL TABLE t3 USING fts5(a, b, c);
   248    INSERT INTO t3 VALUES('bac aab bab', 'c bac c', 'acb aba abb'); -- 1
   249    INSERT INTO t3 VALUES('bab abc c', 'acb c abb', 'c aaa c');     -- 2
   250  }
   251  
   252  do_execsql_test 10.1 {
   253    SELECT rowid FROM t3('c: c*');
   254  } {2}
   255  
   256  do_execsql_test 10.2 {
   257    SELECT rowid FROM t3('b: acb');
   258  } {2}
   259  
   260  #-------------------------------------------------------------------------
   261  # Test that character 0x1A is allowed in fts5 barewords.
   262  #
   263  do_test 11.0 {
   264    execsql "CREATE VIRTUAL TABLE t4 USING fts5(x, tokenize=\"ascii tokenchars '\x1A'\")"
   265    execsql "
   266      INSERT INTO t4 VALUES('a b c \x1A');
   267      INSERT INTO t4 VALUES('a b c d\x1A');
   268      INSERT INTO t4 VALUES('a b c \x1Ag');
   269      INSERT INTO t4 VALUES('a b c d');
   270    "
   271  } {}
   272  
   273  do_test 11.1 {
   274    execsql "SELECT rowid FROM t4('\x1A')"
   275  } {1}
   276  do_test 11.2 {
   277    execsql "SELECT rowid FROM t4('\x1A*')"
   278  } {1 3}
   279  do_test 11.3 {
   280    execsql "SELECT rowid FROM t4('d\x1A')"
   281  } {2}
   282  
   283  do_test 11.4 {
   284    catchsql "SELECT rowid FROM t4('d\x1B')"
   285  } {/fts5: syntax error/}
   286  do_test 11.5 {
   287    catchsql "SELECT rowid FROM t4('d\x19')"
   288  } {/fts5: syntax error/}
   289  
   290  #-------------------------------------------------------------------------
   291  #
   292  do_test 12.1 {
   293    execsql {
   294      CREATE VIRTUAL TABLE xx USING fts5(x,y);
   295      BEGIN;
   296        INSERT INTO xx VALUES('1 2 3', 'a b c');
   297    }
   298  } {}
   299  
   300  do_execsql_test 12.2 {
   301    SELECT rowid FROM xx('x:a');
   302    COMMIT;
   303  } {}
   304  
   305  #-------------------------------------------------------------------------
   306  # Try an UPDATE OR REPLACE query.
   307  #
   308  do_execsql_test 13.1 {
   309    CREATE VIRTUAL TABLE xy USING fts5(x);
   310    INSERT INTO xy(rowid, x) VALUES(1, '1 2 3');
   311    INSERT INTO xy(rowid, x) VALUES(2, '2 3 4');
   312    INSERT INTO xy(rowid, x) VALUES(3, '3 4 5');
   313  }
   314  
   315  do_execsql_test 13.2 {
   316    UPDATE OR REPLACE xy SET rowid=3 WHERE rowid = 2;
   317    SELECT rowid, x FROM xy;
   318  } {
   319    1 {1 2 3}
   320    3 {2 3 4}
   321  }
   322  
   323  do_execsql_test 13.3 {
   324    INSERT INTO xy(xy) VALUES('integrity-check');
   325  }
   326  
   327  #-------------------------------------------------------------------------
   328  #
   329  do_execsql_test 14.1 {
   330    CREATE VIRTUAL TABLE ttt USING fts5(x);
   331    BEGIN;
   332      INSERT INTO ttt(rowid, x) VALUES(1, 'a b c');
   333      INSERT INTO ttt(rowid, x) VALUES(2, 'a b c');
   334      INSERT INTO ttt(rowid, x) VALUES(3, 'a b c');
   335    COMMIT;
   336  }
   337  do_test 14.2 { 
   338    fts5_level_segs ttt 
   339  } {1}
   340  
   341  #-------------------------------------------------------------------------
   342  db func rnddoc fts5_rnddoc
   343  do_execsql_test 14.3 {
   344    CREATE VIRTUAL TABLE x1 USING fts5(x);
   345    INSERT INTO x1(x1, rank) VALUES('pgsz', 32);
   346  
   347    WITH ii(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM ii WHERE i<10 )
   348    INSERT INTO x1 SELECT rnddoc(5) FROM ii;
   349  }
   350  
   351  do_execsql_test 14.4 {
   352    SELECT rowid, x, x1 FROM x1 WHERE x1 MATCH '*reads'
   353  } {0 {} 3}
   354  
   355  #-------------------------------------------------------------------------
   356  reset_db
   357  do_execsql_test 15.0 {
   358    CREATE VIRTUAL TABLE x2 USING fts5(x, prefix=1);
   359    INSERT INTO x2 VALUES('ab');
   360  }
   361  
   362  do_execsql_test 15.1 {
   363    INSERT INTO x2(x2) VALUES('integrity-check');
   364  }
   365  
   366  #-------------------------------------------------------------------------
   367  foreach_detail_mode $testprefix {
   368    reset_db
   369    fts5_aux_test_functions db
   370    do_execsql_test 16.0 {
   371      CREATE VIRTUAL TABLE x3 USING fts5(x, detail=%DETAIL%);
   372      INSERT INTO x3 VALUES('a b c d e f');
   373    }
   374    do_execsql_test 16.1 {
   375      SELECT fts5_test_poslist(x3) FROM x3('(a NOT b) OR c');
   376    } {2.0.2}
   377  
   378    do_execsql_test 16.1 {
   379      SELECT fts5_test_poslist(x3) FROM x3('a OR c');
   380    } {{0.0.0 1.0.2}}
   381  }
   382  
   383  }
   384  
   385  #-------------------------------------------------------------------------
   386  reset_db
   387  do_execsql_test 17.0 {
   388    CREATE VIRTUAL TABLE x3 USING fts5(x);
   389    INSERT INTO x3 VALUES('a b c');
   390  }
   391  
   392  do_execsql_test 17.1 {
   393    SELECT rowid FROM x3('b AND d');
   394  }
   395  
   396  #-------------------------------------------------------------------------
   397  do_execsql_test 18.1 {
   398    CREATE VIRTUAL TABLE x4 USING fts5(x);
   399    SELECT rowid FROM x4('""');
   400  }
   401  
   402  #-------------------------------------------------------------------------
   403  reset_db
   404  do_execsql_test 19.1 {
   405    CREATE VIRTUAL TABLE x1 USING fts5(a,b,c);
   406  }
   407  
   408  do_catchsql_test 19.2 {
   409    SELECT * FROM x1 WHERE x1 MATCH 'c0 AND (c1 AND (c2 AND (c3 AND (c4 AND (c5 AND (c6 AND (c7 AND (c8 AND (c9 AND (c10 AND (c11 AND (c12 AND (c13 AND (c14 AND (c15 AND (c16 AND (c17 AND (c18 AND (c19 AND (c20 AND (c21 AND (c22 AND (c23 AND (c24 AND (c25 AND (c26 AND (c27 AND (c28 AND (c29 AND (c30 AND (c31 AND (c32 AND (c33 AND (c34 AND (c35 AND (c36 AND (c37 AND (c38 AND (c39 AND (c40 AND (c41 AND (c42 AND (c43 AND (c44 AND (c45 AND (c46 AND (c47 AND (c48 AND (c49 AND (c50 AND (c51 AND (c52 AND (c53 AND (c54 AND (c55 AND (c56 AND (c57 AND (c58 AND (c59 AND (c60 AND (c61 AND (c62 AND (c63 AND (c64 AND (c65 AND (c66 AND (c67 AND (c68 AND (c69 AND (c70 AND (c71 AND (c72 AND (c73 AND (c74 AND (c75 AND (c76 AND (c77 AND (c78 AND (c79 AND (c80 AND (c81 AND (c82 AND (c83 AND (c84 AND (c85 AND (c86 AND (c87 AND (c88 AND (c89 AND (c90 AND (c91 AND (c92 AND (c93 AND (c94 AND (c95 AND (c96 AND (c97 AND (c98 AND (c99 AND (c100 AND (c101 AND (c102 AND (c103 AND (c104 AND (c105 AND (c106 AND (c107 AND (c108 AND (c109 AND (c110 AND (c111 AND (c112 AND (c113 AND (c114 AND (c115 AND (c116 AND (c117 AND (c118 AND (c119 AND (c120 AND (c121 AND (c122 AND (c123 AND (c124 AND (c125 AND (c126 AND (c127 AND (c128 AND (c129 AND (c130 AND (c131 AND (c132 AND (c133 AND (c134 AND (c135 AND (c136 AND (c137 AND (c138 AND (c139 AND (c140 AND (c141 AND (c142 AND (c143 AND (c144 AND (c145 AND (c146 AND (c147 AND (c148 AND (c149 AND (c150 AND (c151 AND (c152 AND (c153 AND (c154 AND (c155 AND (c156 AND (c157 AND (c158 AND (c159 AND (c160 AND (c161 AND (c162 AND (c163 AND (c164 AND (c165 AND (c166 AND (c167 AND (c168 AND (c169 AND (c170 AND (c171 AND (c172 AND (c173 AND (c174 AND (c175 AND (c176 AND (c177 AND (c178 AND (c179 AND (c180 AND (c181 AND (c182 AND (c183 AND (c184 AND (c185 AND (c186 AND (c187 AND (c188 AND (c189 AND (c190 AND (c191 AND (c192 AND (c193 AND (c194 AND (c195 AND (c196 AND (c197 AND (c198 AND (c199 AND c200)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))';
   410  } {1 {fts5: parser stack overflow}}
   411  
   412  #-------------------------------------------------------------------------
   413  reset_db
   414  do_execsql_test 20.0 {
   415    CREATE VIRTUAL TABLE x1 USING fts5(x);
   416    INSERT INTO x1(x1, rank) VALUES('pgsz', 32);
   417    INSERT INTO x1(rowid, x) VALUES(11111, 'onetwothree');
   418  }
   419  do_test 20.1 {
   420    for {set i 1} {$i <= 200} {incr i} {
   421      execsql { INSERT INTO x1(rowid, x) VALUES($i, 'one two three'); }
   422    }
   423    execsql { INSERT INTO x1(x1) VALUES('optimize'); }
   424    execsql { DELETE FROM x1 WHERE rowid = 4; }
   425  } {}
   426  do_execsql_test 20.2 {
   427    INSERT INTO x1(x1) VALUES('optimize');
   428    INSERT INTO x1(x1) VALUES('integrity-check');
   429  } {}
   430  
   431  #-------------------------------------------------------------------------
   432  reset_db
   433  do_execsql_test 20.0 {
   434    CREATE VIRTUAL TABLE x1 USING fts5(x);
   435    INSERT INTO x1(x1, rank) VALUES('pgsz', 32);
   436    INSERT INTO x1(rowid, x) VALUES(11111, 'onetwothree');
   437  }
   438  do_test 20.1 {
   439    for {set i 1} {$i <= 200} {incr i} {
   440      execsql { INSERT INTO x1(rowid, x) VALUES($i, 'one two three'); }
   441    }
   442    execsql { INSERT INTO x1(x1) VALUES('optimize'); }
   443    execsql { DELETE FROM x1 WHERE rowid = 4; }
   444  } {}
   445  do_execsql_test 20.2 {
   446    INSERT INTO x1(x1) VALUES('optimize');
   447    INSERT INTO x1(x1) VALUES('integrity-check');
   448  } {}
   449  
   450  #-------------------------------------------------------------------------
   451  reset_db
   452  set doc "a b [string repeat x 100000]"
   453  do_execsql_test 21.0 {
   454    CREATE VIRTUAL TABLE x1 USING fts5(x);
   455    INSERT INTO x1(rowid, x) VALUES(11111, $doc);
   456    INSERT INTO x1(rowid, x) VALUES(11112, $doc);
   457  }
   458  do_execsql_test 21.1 {
   459    INSERT INTO x1(x1) VALUES('integrity-check');
   460  }
   461  do_execsql_test 21.2 {
   462    SELECT rowid FROM x1($doc);
   463  } {11111 11112}
   464  do_execsql_test 21.3 {
   465    DELETE FROM x1 WHERE rowid=11111;
   466    INSERT INTO x1(x1) VALUES('integrity-check');
   467    SELECT rowid FROM x1($doc);
   468  } {11112}
   469  
   470  finish_test