OLD | NEW |
(Empty) | |
| 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 |
| 213 |
OLD | NEW |