| OLD | NEW |
| 1 # 2015 Apr 24 | 1 # 2015 Apr 24 |
| 2 # | 2 # |
| 3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
| 4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
| 5 # | 5 # |
| 6 # May you do good and not evil. | 6 # May you do good and not evil. |
| 7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
| 8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
| 9 # | 9 # |
| 10 #*********************************************************************** | 10 #*********************************************************************** |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 } {} | 172 } {} |
| 173 | 173 |
| 174 set nErr 0 | 174 set nErr 0 |
| 175 for {set i 1} {1} {incr i} { | 175 for {set i 1} {1} {incr i} { |
| 176 set struct [db one {SELECT block FROM t1_data WHERE id=10}] | 176 set struct [db one {SELECT block FROM t1_data WHERE id=10}] |
| 177 binary scan $struct c* var | 177 binary scan $struct c* var |
| 178 set end [lindex $var end] | 178 set end [lindex $var end] |
| 179 if {$end<=$i} break | 179 if {$end<=$i} break |
| 180 lset var end [expr $end - $i] | 180 lset var end [expr $end - $i] |
| 181 set struct [binary format c* $var] | 181 set struct [binary format c* $var] |
| 182 |
| 183 db close |
| 184 sqlite3 db test.db |
| 185 |
| 182 db eval { | 186 db eval { |
| 183 BEGIN; | 187 BEGIN; |
| 184 UPDATE t1_data SET block = $struct WHERE id=10; | 188 UPDATE t1_data SET block = $struct WHERE id=10; |
| 185 } | 189 } |
| 186 do_test 4.1.$i { | 190 do_test 4.1.$i { |
| 187 incr nErr [catch { db eval { SELECT rowid FROM t1 WHERE t1 MATCH 'x*' } }] | 191 incr nErr [catch { db eval { SELECT rowid FROM t1 WHERE t1 MATCH 'x*' } }] |
| 188 set {} {} | 192 set {} {} |
| 189 } {} | 193 } {} |
| 190 catch { db eval ROLLBACK } | 194 catch { db eval ROLLBACK } |
| 191 } | 195 } |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 UPDATE t1_data SET block = | 331 UPDATE t1_data SET block = |
| 328 X'0000001C503061626301020204036465660102030707676869010204040808' | 332 X'0000001C503061626301020204036465660102030707676869010204040808' |
| 329 ----------^^----------------------------------------------------- | 333 ----------^^----------------------------------------------------- |
| 330 WHERE id>100; | 334 WHERE id>100; |
| 331 } | 335 } |
| 332 do_catchsql_test 6.3.5 { | 336 do_catchsql_test 6.3.5 { |
| 333 INSERT INTO t1(t1) VALUES('integrity-check'); | 337 INSERT INTO t1(t1) VALUES('integrity-check'); |
| 334 } {1 {database disk image is malformed}} | 338 } {1 {database disk image is malformed}} |
| 335 | 339 |
| 336 | 340 |
| 337 } | |
| 338 | |
| 339 #------------------------------------------------------------------------ | 341 #------------------------------------------------------------------------ |
| 340 # | 342 # |
| 341 reset_db | 343 reset_db |
| 342 reset_db | |
| 343 proc rnddoc {n} { | 344 proc rnddoc {n} { |
| 344 set map [list a b c d] | 345 set map [list a b c d] |
| 345 set doc [list] | 346 set doc [list] |
| 346 for {set i 0} {$i < $n} {incr i} { | 347 for {set i 0} {$i < $n} {incr i} { |
| 347 lappend doc "x[lindex $map [expr int(rand()*4)]]" | 348 lappend doc "x[lindex $map [expr int(rand()*4)]]" |
| 348 } | 349 } |
| 349 set doc | 350 set doc |
| 350 } | 351 } |
| 351 | 352 |
| 352 db func rnddoc rnddoc | 353 db func rnddoc rnddoc |
| (...skipping 11 matching lines...) Expand all Loading... |
| 364 do_test 7.1 { | 365 do_test 7.1 { |
| 365 foreach i [db eval { SELECT rowid FROM t5_data WHERE rowid>100 }] { | 366 foreach i [db eval { SELECT rowid FROM t5_data WHERE rowid>100 }] { |
| 366 db eval BEGIN | 367 db eval BEGIN |
| 367 db eval {DELETE FROM t5_data WHERE rowid = $i} | 368 db eval {DELETE FROM t5_data WHERE rowid = $i} |
| 368 set r [catchsql { INSERT INTO t5(t5) VALUES('integrity-check')} ] | 369 set r [catchsql { INSERT INTO t5(t5) VALUES('integrity-check')} ] |
| 369 if {$r != "1 {database disk image is malformed}"} { error $r } | 370 if {$r != "1 {database disk image is malformed}"} { error $r } |
| 370 db eval ROLLBACK | 371 db eval ROLLBACK |
| 371 } | 372 } |
| 372 } {} | 373 } {} |
| 373 | 374 |
| 375 } |
| 376 |
| 377 #------------------------------------------------------------------------ |
| 378 # Corruption within the structure record. |
| 379 # |
| 380 reset_db |
| 381 do_execsql_test 8.1 { |
| 382 CREATE VIRTUAL TABLE t1 USING fts5(x, y); |
| 383 INSERT INTO t1 VALUES('one', 'two'); |
| 384 } |
| 385 |
| 386 do_test 9.1.1 { |
| 387 set blob "12345678" ;# cookie |
| 388 append blob "0105" ;# 1 level, total of 5 segments |
| 389 append blob "06" ;# write counter |
| 390 append blob "0002" ;# first level has 0 segments merging, 2 other. |
| 391 append blob "450108" ;# first segment |
| 392 execsql "REPLACE INTO t1_data VALUES(10, X'$blob')" |
| 393 } {} |
| 394 do_catchsql_test 9.1.2 { |
| 395 SELECT * FROM t1('one AND two'); |
| 396 } {1 {database disk image is malformed}} |
| 397 |
| 398 do_test 9.2.1 { |
| 399 set blob "12345678" ;# cookie |
| 400 append blob "0205" ;# 2 levels, total of 5 segments |
| 401 append blob "06" ;# write counter |
| 402 append blob "0001" ;# first level has 0 segments merging, 1 other. |
| 403 append blob "450108" ;# first segment |
| 404 execsql "REPLACE INTO t1_data VALUES(10, X'$blob')" |
| 405 } {} |
| 406 do_catchsql_test 9.2.2 { |
| 407 SELECT * FROM t1('one AND two'); |
| 408 } {1 {database disk image is malformed}} |
| 409 |
| 374 sqlite3_fts5_may_be_corrupt 0 | 410 sqlite3_fts5_may_be_corrupt 0 |
| 375 finish_test | 411 finish_test |
| 376 | 412 |
| OLD | NEW |