# 2023 Feb 17 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #************************************************************************* # source [file join [file dirname [info script]] fts5_common.tcl] ifcapable !fts5 { finish_test ; return } set ::testprefix fts5secure6 db progress 1 progress_handler set ::PHC 0 proc progress_handler {args} { incr ::PHC # if {($::PHC % 100000)==0} breakpoint return 0 } proc setup {} { db eval { DROP TABLE IF EXISTS t1; CREATE VIRTUAL TABLE t1 USING fts5(x); WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1000 ) INSERT INTO t1 SELECT 'a b c d e f g h i j k' FROM s; } } foreach {tn sd} { 1 0 2 1 } { setup do_execsql_test 1.$tn.0 { INSERT INTO t1(t1, rank) VALUES('secure-delete', $sd) } set PHC 0 do_execsql_test 1.$tn.1 { DELETE FROM t1; } set phc($tn) $PHC } do_test 1.3 { expr $phc(1)*5 < $phc(2) } {1} #------------------------------------------------------------------------- reset_db do_execsql_test 2.0 { CREATE VIRTUAL TABLE t1 USING fts5(x); INSERT INTO t1(t1, rank) VALUES('secure-delete', $sd) } do_execsql_test 2.1 { BEGIN; INSERT INTO t1(rowid, x) VALUES(-100000, 'abc def ghi'); INSERT INTO t1(rowid, x) VALUES(-99999, 'abc def ghi'); INSERT INTO t1(rowid, x) VALUES(9223372036854775800, 'abc def ghi'); COMMIT; } do_execsql_test 2.2 { SELECT rowid FROM t1('def') } {-100000 -99999 9223372036854775800} #------------------------------------------------------------------------- reset_db do_execsql_test 3.0 { CREATE VIRTUAL TABLE t1 USING fts5(x); INSERT INTO t1(t1, rank) VALUES('secure-delete', $sd) } do_execsql_test 3.1 { BEGIN; INSERT INTO t1(rowid, x) VALUES(51869, 'when whenever where weress what turn'), (51871, 'to were'); COMMIT; } do_execsql_test 3.2 { DELETE FROM t1 WHERE rowid=51871; INSERT INTO t1(t1) VALUES('integrity-check'); } #------------------------------------------------------------------------- reset_db do_execsql_test 4.0 { CREATE VIRTUAL TABLE t1 USING fts5(x); INSERT INTO t1(rowid, x) VALUES(10, 'one two'); } do_execsql_test 4.1 { UPDATE t1 SET x = 'one three' WHERE rowid=10; INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } do_execsql_test 4.2 { DELETE FROM t1 WHERE rowid=10; } do_execsql_test 4.3 { INSERT INTO t1(t1) VALUES('integrity-check'); } #------------------------------------------------------------------------- reset_db do_execsql_test 5.0 { CREATE VIRTUAL TABLE t1 USING fts5(content); INSERT INTO t1(t1,rank) VALUES('secure-delete',1); INSERT INTO t1 VALUES('active'),('boomer'),('atom'),('atomic'), ('alpha channel backup abandon test aback boomer atom alpha active'); DELETE FROM t1 WHERE t1 MATCH 'abandon'; } do_execsql_test 5.1 { INSERT INTO t1(t1) VALUES('rebuild'); } do_execsql_test 5.2 { DELETE FROM t1 WHERE rowid NOTNULL<5; } db close sqlite3 db test.db do_execsql_test 5.3 { PRAGMA integrity_check; } {ok} finish_test