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