| 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 breakpoint | |
| 149 do_execsql_test 5.3 { | |
| 150 INSERT INTO gg(gg) VALUES('integrity-check'); | |
| 151 } | |
| 152 | |
| 153 finish_test | |
| 154 | |
| OLD | NEW |