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

     1  # 2014 June 17
     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 FTS5 module.
    13  #
    14  #
    15  
    16  source [file join [file dirname [info script]] fts5_common.tcl]
    17  set testprefix fts5ab
    18  
    19  # If SQLITE_ENABLE_FTS5 is defined, omit this file.
    20  ifcapable !fts5 {
    21    finish_test
    22    return
    23  }
    24  
    25  foreach_detail_mode $testprefix {
    26  
    27  do_execsql_test 1.0 {
    28    CREATE VIRTUAL TABLE t1 USING fts5(a, b, detail=%DETAIL%);
    29    INSERT INTO t1 VALUES('hello', 'world');
    30    INSERT INTO t1 VALUES('one two', 'three four');
    31    INSERT INTO t1(rowid, a, b) VALUES(45, 'forty', 'five');
    32  }
    33  
    34  do_execsql_test 1.1 {
    35    SELECT * FROM t1 ORDER BY rowid DESC;
    36  } { forty five {one two} {three four} hello world }
    37  
    38  do_execsql_test 1.2 {
    39    SELECT rowid FROM t1 ORDER BY rowid DESC;
    40  } {45 2 1}
    41  
    42  do_execsql_test 1.3 {
    43    SELECT rowid FROM t1 ORDER BY rowid ASC;
    44  } {1 2 45}
    45  
    46  do_execsql_test 1.4 {
    47    SELECT * FROM t1 WHERE rowid=2;
    48  } {{one two} {three four}}
    49  
    50  do_execsql_test 1.5 {
    51    SELECT * FROM t1 WHERE rowid=2.01;
    52  } {}
    53  
    54  do_execsql_test 1.6 {
    55    SELECT * FROM t1 WHERE rowid=1.99;
    56  } {}
    57  
    58  #-------------------------------------------------------------------------
    59  
    60  reset_db
    61  do_execsql_test 2.1 {
    62    CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%);
    63    INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
    64    INSERT INTO t1 VALUES('one');
    65    INSERT INTO t1 VALUES('two');
    66    INSERT INTO t1 VALUES('three');
    67  }
    68  
    69  do_catchsql_test 2.2 {
    70    SELECT rowid, * FROM t1 WHERE t1 MATCH 'AND AND'
    71  } {1 {fts5: syntax error near "AND"}}
    72  
    73  do_execsql_test 2.3 { SELECT rowid, * FROM t1 WHERE t1 MATCH 'two' } {2 two}
    74  do_execsql_test 2.4 { SELECT rowid, * FROM t1 WHERE t1 MATCH 'three' } {3 three}
    75  do_execsql_test 2.5 { SELECT rowid, * FROM t1 WHERE t1 MATCH 'one' } {1 one}
    76  
    77  do_execsql_test 2.6 {
    78    INSERT INTO t1 VALUES('a b c d e f g');
    79    INSERT INTO t1 VALUES('b d e a a a i');
    80    INSERT INTO t1 VALUES('x y z b c c c');
    81  }
    82  
    83  foreach {tn expr res} {
    84    1  a    {5 4}
    85    2  b    {6 5 4}
    86    3  c    {6 4}
    87    4  d    {5 4}
    88    5  e    {5 4}
    89    6  f    {4}
    90    7  g    {4}
    91    8  x    {6}
    92    9  y    {6}
    93    10 z    {6}
    94  } {
    95    do_execsql_test 2.7.$tn.1 { 
    96      SELECT rowid FROM t1 WHERE t1 MATCH $expr ORDER BY rowid DESC
    97    } $res
    98    do_execsql_test 2.7.$tn.2 { 
    99      SELECT rowid FROM t1 WHERE t1 MATCH $expr ORDER BY rowid ASC
   100    } [lsort -integer $res]
   101  }
   102  
   103  #-------------------------------------------------------------------------
   104  #
   105  reset_db
   106  do_execsql_test 3.0 {
   107    CREATE VIRTUAL TABLE t1 USING fts5(a,b);
   108    INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
   109  }
   110  
   111  foreach {tn a b} {
   112     1 {abashed abandons abase abash abaft} {abases abased}
   113     2 {abasing abases abaft abated abandons} {abases abandoned}
   114     3 {abatement abash abash abated abase} {abasements abashing}
   115     4 {abaft abasements abase abasement abasing} {abasement abases}
   116     5 {abaft abashing abatement abash abasements} {abandons abandoning}
   117     6 {aback abate abasements abashes abandoned} {abasement abased}
   118     7 {abandons abated abased aback abandoning} {abases abandoned}
   119     8 {abashing abases abasement abaft abashing} {abashed abate}
   120     9 {abash abase abate abashing abashed} {abandon abandoned}
   121     10 {abate abandoning abandons abasement aback} {abandon abandoning}
   122  } {
   123    do_execsql_test 3.1.$tn.1 { INSERT INTO t1 VALUES($a, $b) } 
   124    do_execsql_test 3.1.$tn.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
   125  }
   126  
   127  foreach {tn expr res} {
   128    1 {abash} {9 5 3 1}
   129    2 {abase} {9 4 3 1}
   130    3 {abase + abash} {1}
   131    4 {abash + abase} {9}
   132    5 {abaft + abashing} {8 5}
   133    6 {abandon + abandoning} {10}
   134    7 {"abashing abases abasement abaft abashing"} {8}
   135  } {
   136    do_execsql_test 3.2.$tn {
   137      SELECT rowid FROM t1 WHERE t1 MATCH $expr ORDER BY rowid DESC
   138    } $res
   139  }
   140  
   141  do_execsql_test 3.3 {
   142    SELECT rowid FROM t1 WHERE t1 MATCH 'NEAR(aback abate, 2)'
   143  } {6}
   144  
   145  foreach {tn expr res} {
   146    1 {abash} {1 3 5 9}
   147    2 {abase} {1 3 4 9}
   148    3 {abase + abash} {1}
   149    4 {abash + abase} {9}
   150    5 {abaft + abashing} {5 8}
   151    6 {abandon + abandoning} {10}
   152    7 {"abashing abases abasement abaft abashing"} {8}
   153  } {
   154    do_execsql_test 3.4.$tn {
   155      SELECT rowid FROM t1 WHERE t1 MATCH $expr
   156    } $res
   157  }
   158  
   159  #-------------------------------------------------------------------------
   160  # Documents with more than 2M tokens.
   161  #
   162  
   163  do_execsql_test 4.0 {
   164    CREATE VIRTUAL TABLE s1 USING fts5(x, detail=%DETAIL%);
   165  }
   166  foreach {tn doc} [list \
   167    1 [string repeat {a x } 1500000]       \
   168    2 "[string repeat {a a } 1500000] x"   \
   169  ] {
   170    do_execsql_test 4.$tn { INSERT INTO s1 VALUES($doc) }
   171  }
   172  
   173  do_execsql_test 4.3 {
   174    SELECT rowid FROM s1 WHERE s1 MATCH 'x'
   175  } {1 2}
   176  
   177  if {[detail_is_full]} {
   178    do_execsql_test 4.4 {
   179      SELECT rowid FROM s1 WHERE s1 MATCH '"a x"'
   180    } {1 2}
   181  }
   182  
   183  do_execsql_test 4.5 {
   184    SELECT rowid FROM s1 WHERE s1 MATCH 'a x'
   185  } {1 2}
   186  
   187  #-------------------------------------------------------------------------
   188  # Check that a special case of segment promotion works. The case is where
   189  # a new segment is written to level L, but the oldest segment within level
   190  # (L-2) is larger than it.
   191  #
   192  do_execsql_test 5.0 {
   193    CREATE VIRTUAL TABLE s2 USING fts5(x, detail=%DETAIL%);
   194    INSERT INTO s2(s2, rank) VALUES('pgsz', 32);
   195    INSERT INTO s2(s2, rank) VALUES('automerge', 0);
   196  }
   197  
   198  proc rnddoc {n} {
   199    set map [list 0 a  1 b  2 c  3 d  4 e  5 f  6 g  7 h  8 i  9 j]
   200    set doc [list]
   201    for {set i 0} {$i < $n} {incr i} {
   202      lappend doc [string map $map [format %.3d [expr int(rand()*1000)]]]
   203    }
   204    set doc
   205  }
   206  db func rnddoc rnddoc
   207  
   208  do_test 5.1 {
   209    for {set i 1} {$i <= 65} {incr i} {
   210      execsql { INSERT INTO s2 VALUES(rnddoc(10)) }
   211    }
   212    for {set i 1} {$i <= 63} {incr i} {
   213      execsql { DELETE FROM s2 WHERE rowid = $i }
   214    }
   215    fts5_level_segs s2
   216  } {0 8}
   217  
   218  do_test 5.2 {
   219    execsql {
   220      INSERT INTO s2(s2, rank) VALUES('automerge', 8);
   221    }
   222    for {set i 0} {$i < 7} {incr i} {
   223      execsql { INSERT INTO s2 VALUES(rnddoc(50)) }
   224    }
   225    fts5_level_segs s2
   226  } {8 0 0}
   227  
   228  # Test also the other type of segment promotion - when a new segment is written
   229  # that is larger than segments immediately following it.
   230  do_test 5.3 {
   231    execsql {
   232      DROP TABLE s2;
   233      CREATE VIRTUAL TABLE s2 USING fts5(x, detail=%DETAIL%);
   234      INSERT INTO s2(s2, rank) VALUES('pgsz', 32);
   235      INSERT INTO s2(s2, rank) VALUES('automerge', 0);
   236    }
   237  
   238    for {set i 1} {$i <= 16} {incr i} {
   239      execsql { INSERT INTO s2 VALUES(rnddoc(5)) }
   240    }
   241    fts5_level_segs s2
   242  } {0 1}
   243  
   244  do_test 5.4 {
   245    execsql { INSERT INTO s2 VALUES(rnddoc(160)) }
   246    fts5_level_segs s2
   247  } {2 0}
   248  
   249  #-------------------------------------------------------------------------
   250  #
   251  do_execsql_test 6.0 {
   252    CREATE VIRTUAL TABLE s3 USING fts5(x, detail=%DETAIL%);
   253    BEGIN;
   254      INSERT INTO s3 VALUES('a b c');
   255      INSERT INTO s3 VALUES('A B C');
   256  }
   257  
   258  do_execsql_test 6.1.1 {
   259    SELECT rowid FROM s3 WHERE s3 MATCH 'a'
   260  } {1 2}
   261  
   262  do_execsql_test 6.1.2 {
   263    SELECT rowid FROM s3 WHERE s3 MATCH 'a' ORDER BY rowid DESC
   264  } {2 1}
   265  
   266  do_execsql_test 6.2 {
   267    COMMIT;
   268  }
   269  
   270  do_execsql_test 6.3 {
   271    SELECT rowid FROM s3 WHERE s3 MATCH 'a'
   272  } {1 2}
   273  
   274  do_test 6.4 {
   275    db close
   276    sqlite3 db test.db
   277    execsql {
   278      BEGIN;
   279        INSERT INTO s3(s3) VALUES('optimize');
   280      ROLLBACK;
   281    }
   282  } {}
   283  
   284  #-------------------------------------------------------------------------
   285  #
   286  set doc [string repeat "a b c " 500]
   287  do_execsql_test 7.0 {
   288    CREATE VIRTUAL TABLE x1 USING fts5(x, detail=%DETAIL%);
   289    INSERT INTO x1(x1, rank) VALUES('pgsz', 32);
   290    INSERT INTO x1 VALUES($doc);
   291  }
   292  
   293  } ;# foreach_detail_mode...
   294  
   295  
   296  finish_test