Snapshot of upstream SQLite 3.46.1
[sqlcipher.git] / ext / fts5 / test / fts5secure7.test
blob16a044f5389005a4c10f8513cc4340469abdcc6e
1 # 2023 Feb 17
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #*************************************************************************
12 # TESTRUNNER: slow
15 source [file join [file dirname [info script]] fts5_common.tcl]
16 ifcapable !fts5 { finish_test ; return }
17 set ::testprefix fts5secure7
20 set NVOCAB 500
21 set NDOC [expr 1000]
23 set NREP 100
24 set nDeletePerRep [expr 5]
26 set VOCAB [list]
28 proc select_one {list} {
29   set n [llength $list]
30   lindex $list [expr {abs(int(rand()*$n))}]
33 proc init_vocab {} {
34   set L [split "abcdefghijklmnopqrstuvwxyz" {}]
35   set nL [llength $L]
36   for {set i 0} {$i < $::NVOCAB} {incr i} {
37     set n [expr {6 + int(rand()*8)}]
38     set word ""
39     for {set j 0} {$j < $n} {incr j} {
40       append word [select_one $L]
41     }
42     lappend ::VOCAB $word
43   }
46 proc get_word {} {
47   select_one $::VOCAB
50 proc get_document {nWord} {
51   set ret [list]
52   for {set i 0} {$i < $nWord} {incr i} {
53     lappend ret [get_word]
54   }
55   return $ret
58 init_vocab
60 db func document [list get_document 12]
62 do_execsql_test 1.0 {
63   CREATE VIRTUAL TABLE t1 USING fts5(body);
64   INSERT INTO t1(t1, rank) VALUES('secure-delete', 1);
66 do_execsql_test 1.1 {
67   WITH s(i) AS (
68     SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$NDOC
69   )
70   INSERT INTO t1 SELECT document() FROM s;
73 for {set iRep 0} {$iRep < $NREP} {incr iRep} {
74   set lRowid [db eval {SELECT rowid FROM t1}]
75   for {set iDel 0} {$iDel < $nDeletePerRep} {incr iDel} {
76     set idx [select_one $lRowid]
77     db eval {
78       DELETE FROM t1 WHERE rowid=$idx
79     }
80   }
81   db eval {
82     WITH s(i) AS (
83       SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$nDeletePerRep
84     )
85     INSERT INTO t1 SELECT document() FROM s;
86   }
87   do_execsql_test 1.2.$iRep {
88     INSERT INTO t1(t1) VALUES('integrity-check');
89   }
92 reset_db
93 db func document [list get_document 12]
94 do_execsql_test 2.0 {
95   CREATE VIRTUAL TABLE t1 USING fts5(body);
96   INSERT INTO t1(t1, rank) VALUES('secure-delete', 1);
97   INSERT INTO t1(t1, rank) VALUES('pgsz', 128);
99 do_execsql_test 2.1 {
100   WITH s(i) AS (
101     SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$NDOC
102   )
103   INSERT INTO t1 SELECT document() FROM s;
105 for {set ii 0} {$ii < $NDOC} {incr ii} {
106   set lRowid [db eval {SELECT rowid FROM t1}]
107   set idx [select_one $lRowid]
108   db eval { DELETE FROM t1 WHERE rowid=$idx }
109   do_execsql_test 2.2.$ii {
110     INSERT INTO t1(t1) VALUES('integrity-check');
111   }
114 finish_test