# 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. # #************************************************************************* # # TESTRUNNER: slow # source [file join [file dirname [info script]] fts5_common.tcl] ifcapable !fts5 { finish_test ; return } set ::testprefix fts5secure7 set NVOCAB 500 set NDOC [expr 1000] set NREP 100 set nDeletePerRep [expr 5] set VOCAB [list] proc select_one {list} { set n [llength $list] lindex $list [expr {abs(int(rand()*$n))}] } proc init_vocab {} { set L [split "abcdefghijklmnopqrstuvwxyz" {}] set nL [llength $L] for {set i 0} {$i < $::NVOCAB} {incr i} { set n [expr {6 + int(rand()*8)}] set word "" for {set j 0} {$j < $n} {incr j} { append word [select_one $L] } lappend ::VOCAB $word } } proc get_word {} { select_one $::VOCAB } proc get_document {nWord} { set ret [list] for {set i 0} {$i < $nWord} {incr i} { lappend ret [get_word] } return $ret } init_vocab db func document [list get_document 12] do_execsql_test 1.0 { CREATE VIRTUAL TABLE t1 USING fts5(body); INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } do_execsql_test 1.1 { WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$NDOC ) INSERT INTO t1 SELECT document() FROM s; } for {set iRep 0} {$iRep < $NREP} {incr iRep} { set lRowid [db eval {SELECT rowid FROM t1}] for {set iDel 0} {$iDel < $nDeletePerRep} {incr iDel} { set idx [select_one $lRowid] db eval { DELETE FROM t1 WHERE rowid=$idx } } db eval { WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$nDeletePerRep ) INSERT INTO t1 SELECT document() FROM s; } do_execsql_test 1.2.$iRep { INSERT INTO t1(t1) VALUES('integrity-check'); } } reset_db db func document [list get_document 12] do_execsql_test 2.0 { CREATE VIRTUAL TABLE t1 USING fts5(body); INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); INSERT INTO t1(t1, rank) VALUES('pgsz', 128); } do_execsql_test 2.1 { WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$NDOC ) INSERT INTO t1 SELECT document() FROM s; } for {set ii 0} {$ii < $NDOC} {incr ii} { set lRowid [db eval {SELECT rowid FROM t1}] set idx [select_one $lRowid] db eval { DELETE FROM t1 WHERE rowid=$idx } do_execsql_test 2.2.$ii { INSERT INTO t1(t1) VALUES('integrity-check'); } } finish_test