| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| source [file join [file dirname [info script]] fts5_common.tcl] |
| set testprefix fts5corrupt7 |
|
|
| |
| ifcapable !fts5 { |
| finish_test |
| return |
| } |
| sqlite3_fts5_may_be_corrupt 1 |
|
|
| do_execsql_test 1.0 { |
| CREATE VIRTUAL TABLE t1 USING fts5(x); |
| INSERT INTO t1(t1, rank) VALUES('pgsz', 32); |
| } |
|
|
| set doc [string repeat "a b " 30] |
|
|
| do_execsql_test 1.1 { |
| BEGIN; |
| INSERT INTO t1(rowid, x) VALUES(123, $doc); |
| INSERT INTO t1(rowid, x) VALUES(124, $doc); |
| COMMIT; |
| } |
|
|
| execsql_pp { |
| SELECT id, fts5_decode(id, block), quote(block) FROM t1_data |
| } |
|
|
| set rows [db eval { SELECT rowid FROM t1_data }] |
| db_save_and_close |
|
|
| foreach r $rows { |
| db_restore_and_reopen |
|
|
| proc edit_block {b} { |
| binary scan $b c* in |
| set out [lreplace $in 0 1 255 255] |
| binary format c* $out |
| } |
| db func edit_block edit_block |
|
|
| do_execsql_test 1.2.$r.1 { |
| UPDATE t1_data SET block = edit_block(block) WHERE rowid=$r; |
| } |
|
|
| do_execsql_test 1.2.$r.2 { |
| INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); |
| } |
|
|
| do_test 1.2.$r.3 { |
| catchsql { DELETE FROM t1 WHERE rowid=123; } |
| catchsql { DELETE FROM t1 WHERE rowid=124; } |
| set {} {} |
| } {} |
|
|
| db close |
| } |
|
|
| foreach r $rows { |
| set r 137438953475 |
| db_restore_and_reopen |
|
|
| proc edit_block {b} { |
| binary scan $b c* in |
| set out [lreplace $in end end 127] |
| binary format c* $out |
| } |
| db func edit_block edit_block |
|
|
| do_execsql_test 1.2.$r.1 { |
| UPDATE t1_data SET block = edit_block(block) WHERE rowid=$r; |
| } |
|
|
| do_execsql_test 1.2.$r.2 { |
| INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); |
| } |
|
|
| do_test 1.2.$r.3 { |
| catchsql { DELETE FROM t1 WHERE rowid=124; } |
| catchsql { DELETE FROM t1 WHERE rowid=123; } |
| set {} {} |
| } {} |
|
|
| db close |
| } |
|
|
| |
| reset_db |
| do_execsql_test 2.0 { |
| CREATE VIRTUAL TABLE t1 USING fts5(x); |
| BEGIN; |
| INSERT INTO t1 VALUES('abc'); |
| INSERT INTO t1 VALUES('b d d d'); |
| COMMIT; |
| INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); |
| } |
|
|
| execsql_pp { |
| SELECT id, quote(block) FROM t1_data |
| } |
|
|
| do_execsql_test 2.1 { |
| SELECT quote(block) FROM t1_data WHERE id > 10; |
| } {X'0000001A04306162630102020101620202020101640206030303040806'} |
|
|
| do_execsql_test 2.2 { |
| UPDATE t1_data SET |
| block=X'0000001A04306162630102025501620202020101640206030303040806' |
| WHERE id>10 |
| } |
|
|
| do_catchsql_test 2.3 { |
| DELETE FROM t1 WHERE rowid = 1 |
| } {/.*fts5: corrupt.*/} |
|
|
| finish_test |
|
|