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

     1  # 2015 Jan 13
     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  # This file contains tests focused on the integrity-check procedure.
    13  #
    14  
    15  source [file join [file dirname [info script]] fts5_common.tcl]
    16  set testprefix fts5integrity
    17  
    18  # If SQLITE_ENABLE_FTS5 is defined, omit this file.
    19  ifcapable !fts5 {
    20    finish_test
    21    return
    22  }
    23  
    24  do_execsql_test 1.0 {
    25    CREATE VIRTUAL TABLE xx USING fts5(x);
    26    INSERT INTO xx VALUES('term');
    27  }
    28  do_execsql_test 1.1 {
    29    INSERT INTO xx(xx) VALUES('integrity-check');
    30  }
    31  
    32  do_execsql_test 2.0 {
    33    CREATE VIRTUAL TABLE yy USING fts5(x, prefix=1);
    34    INSERT INTO yy VALUES('term');
    35  }
    36  do_execsql_test 2.1 {
    37    INSERT INTO yy(yy) VALUES('integrity-check');
    38  }
    39  
    40  #--------------------------------------------------------------------
    41  #
    42  do_execsql_test 3.0 {
    43    CREATE VIRTUAL TABLE zz USING fts5(z);
    44    INSERT INTO zz(zz, rank) VALUES('pgsz', 32);
    45    INSERT INTO zz VALUES('b b b b b b b b b b b b b b');
    46    INSERT INTO zz SELECT z FROM zz;
    47    INSERT INTO zz SELECT z FROM zz;
    48    INSERT INTO zz SELECT z FROM zz;
    49    INSERT INTO zz SELECT z FROM zz;
    50    INSERT INTO zz SELECT z FROM zz;
    51    INSERT INTO zz SELECT z FROM zz;
    52    INSERT INTO zz(zz) VALUES('optimize');
    53  }
    54  
    55  do_execsql_test 3.1 { INSERT INTO zz(zz) VALUES('integrity-check'); }
    56  
    57  #--------------------------------------------------------------------
    58  # Mess around with a docsize record. And the averages record. Then
    59  # check that integrity-check picks it up.
    60  #
    61  do_execsql_test 4.0 {
    62    CREATE VIRTUAL TABLE aa USING fts5(zz);
    63    INSERT INTO aa(zz) VALUES('a b c d e');
    64    INSERT INTO aa(zz) VALUES('a b c d');
    65    INSERT INTO aa(zz) VALUES('a b c');
    66    INSERT INTO aa(zz) VALUES('a b');
    67    INSERT INTO aa(zz) VALUES('a');
    68    SELECT length(sz) FROM aa_docsize;
    69  } {1 1 1 1 1}
    70  do_execsql_test 4.1 { 
    71    INSERT INTO aa(aa) VALUES('integrity-check'); 
    72  }
    73  
    74  do_catchsql_test 4.2 { 
    75    BEGIN;
    76      UPDATE aa_docsize SET sz = X'44' WHERE rowid = 3;
    77      INSERT INTO aa(aa) VALUES('integrity-check'); 
    78  } {1 {database disk image is malformed}}
    79  
    80  do_catchsql_test 4.3 { 
    81    ROLLBACK;
    82    BEGIN;
    83      UPDATE aa_data SET block = X'44' WHERE rowid = 1;
    84      INSERT INTO aa(aa) VALUES('integrity-check'); 
    85  } {1 {database disk image is malformed}}
    86  
    87  do_catchsql_test 4.4 { 
    88    ROLLBACK;
    89    BEGIN;
    90      INSERT INTO aa_docsize VALUES(23, X'04');
    91      INSERT INTO aa(aa) VALUES('integrity-check'); 
    92  } {1 {database disk image is malformed}}
    93  
    94  do_catchsql_test 4.5 { 
    95    ROLLBACK;
    96    BEGIN;
    97      INSERT INTO aa_docsize VALUES(23, X'00');
    98      INSERT INTO aa_content VALUES(23, '');
    99      INSERT INTO aa(aa) VALUES('integrity-check'); 
   100  } {1 {database disk image is malformed}}
   101  
   102  #db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM zz_data} {puts $r}
   103  #exit
   104  
   105  execsql { ROLLBACK }
   106  
   107  
   108  #-------------------------------------------------------------------------
   109  # Test that integrity-check works on a reasonably large db with many
   110  # different terms.
   111  
   112  # Document generator command.
   113  proc rnddoc {n} {
   114    set doc [list]
   115    for {set i 0} {$i<$n} {incr i} {
   116      lappend doc [format %.5d [expr int(rand()*10000)]]
   117    }
   118    return $doc
   119  }
   120  db func rnddoc rnddoc
   121  
   122  expr srand(0)
   123  do_execsql_test 5.0 {
   124    CREATE VIRTUAL TABLE gg USING fts5(a, prefix="1,2,3");
   125    INSERT INTO gg(gg, rank) VALUES('pgsz', 256);
   126    INSERT INTO gg VALUES(rnddoc(20));
   127    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   128    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   129    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   130    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   131    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   132    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   133    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   134    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   135    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   136    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   137    INSERT INTO gg SELECT rnddoc(20) FROM gg;
   138  }
   139  
   140  do_execsql_test 5.1 {
   141    INSERT INTO gg(gg) VALUES('integrity-check');
   142  }
   143  
   144  do_execsql_test 5.2 {
   145    INSERT INTO gg(gg) VALUES('optimize');
   146  }
   147  
   148  do_execsql_test 5.3 {
   149    INSERT INTO gg(gg) VALUES('integrity-check');
   150  }
   151  
   152  do_test 5.4.1 {
   153    set ok 0
   154    for {set i 0} {$i < 10000} {incr i} {
   155      set T [format %.5d $i]
   156      set res  [db eval { SELECT rowid FROM gg($T) ORDER BY rowid ASC  }]
   157      set res2 [db eval { SELECT rowid FROM gg($T) ORDER BY rowid DESC }]
   158      if {$res == [lsort -integer $res2]} { incr ok }
   159    }
   160    set ok
   161  } {10000}
   162  
   163  do_test 5.4.2 {
   164    set ok 0
   165    for {set i 0} {$i < 100} {incr i} {
   166      set T "[format %.3d $i]*"
   167      set res  [db eval { SELECT rowid FROM gg($T) ORDER BY rowid ASC  }]
   168      set res2 [db eval { SELECT rowid FROM gg($T) ORDER BY rowid DESC }]
   169      if {$res == [lsort -integer $res2]} { incr ok }
   170    }
   171    set ok
   172  } {100}
   173  
   174  #-------------------------------------------------------------------------
   175  # Similar to 5.*.
   176  #
   177  foreach {tn pgsz} {
   178    1  32
   179    2  36
   180    3  40
   181    4  44
   182    5  48
   183  } {
   184    do_execsql_test 6.$tn.1 {
   185      DROP TABLE IF EXISTS hh;
   186      CREATE VIRTUAL TABLE hh USING fts5(y);
   187      INSERT INTO hh(hh, rank) VALUES('pgsz', $pgsz);
   188  
   189      WITH s(i) AS (SELECT 0 UNION ALL SELECT i+1 FROM s WHERE i<999)
   190       INSERT INTO hh SELECT printf("%.3d%.3d%.3d %.3d%.3d%.3d",i,i,i,i+1,i+1,i+1)
   191       FROM s;
   192  
   193      WITH s(i) AS (SELECT 0 UNION ALL SELECT i+1 FROM s WHERE i<999)
   194       INSERT INTO hh SELECT printf("%.3d%.3d%.3d %.3d%.3d%.3d",i,i,i,i+1,i+1,i+1)
   195       FROM s;
   196  
   197      INSERT INTO hh(hh) VALUES('optimize');
   198    }
   199  
   200    do_test 6.$tn.2 {
   201      set ok 0
   202      for {set i 0} {$i < 1000} {incr i} {
   203        set T [format %.3d%.3d%.3d $i $i $i]
   204        set res  [db eval { SELECT rowid FROM hh($T) ORDER BY rowid ASC  }]
   205        set res2 [db eval { SELECT rowid FROM hh($T) ORDER BY rowid DESC }]
   206        if {$res == [lsort -integer $res2]} { incr ok }
   207      }
   208      set ok
   209    } {1000}
   210  }
   211  
   212  finish_test