summaryrefslogtreecommitdiffstats
path: root/ext/fts5/test/fts5secure3.test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 14:07:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 14:07:11 +0000
commit63847496f14c813a5d80efd5b7de0f1294ffe1e3 (patch)
tree01c7571c7c762ceee70638549a99834fdd7c411b /ext/fts5/test/fts5secure3.test
parentInitial commit. (diff)
downloadsqlite3-63847496f14c813a5d80efd5b7de0f1294ffe1e3.tar.xz
sqlite3-63847496f14c813a5d80efd5b7de0f1294ffe1e3.zip
Adding upstream version 3.45.1.upstream/3.45.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ext/fts5/test/fts5secure3.test')
-rw-r--r--ext/fts5/test/fts5secure3.test171
1 files changed, 171 insertions, 0 deletions
diff --git a/ext/fts5/test/fts5secure3.test b/ext/fts5/test/fts5secure3.test
new file mode 100644
index 0000000..4934714
--- /dev/null
+++ b/ext/fts5/test/fts5secure3.test
@@ -0,0 +1,171 @@
+# 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 fts5secure3
+
+do_execsql_test 1.0 {
+ CREATE VIRTUAL TABLE ft USING fts5(col);
+ INSERT INTO ft VALUES('data for the table');
+ INSERT INTO ft VALUES('more of the same');
+ INSERT INTO ft VALUES('and extra data');
+
+ INSERT INTO ft(ft, rank) VALUES('secure-delete', 1);
+}
+
+do_execsql_test 1.1 {
+ BEGIN;
+ INSERT INTO ft(rowid, col) VALUES(0, 'the next data');
+ DELETE FROM ft WHERE rowid=1;
+ DELETE FROM ft WHERE rowid=2;
+ INSERT INTO ft(rowid, col) VALUES(6, 'with some more of the same data');
+ COMMIT;
+}
+
+do_execsql_test 1.2 {
+ INSERT INTO ft(ft) VALUES('integrity-check');
+}
+
+#-------------------------------------------------------------------------
+
+reset_db
+do_execsql_test 2.0 {
+ CREATE VIRTUAL TABLE t1 USING fts5(x);
+ INSERT INTO t1(t1, rank) VALUES('pgsz', 64);
+ INSERT INTO t1(t1, rank) VALUES('secure-delete', 1);
+ BEGIN;
+ INSERT INTO t1 VALUES('the start');
+}
+do_test 2.1 {
+ for {set i 0} {$i < 1000} {incr i} {
+ execsql { INSERT INTO t1 VALUES('the ' || hex(randomblob(3))) }
+ }
+ execsql {
+ INSERT INTO t1 VALUES('the end');
+ COMMIT;
+ }
+} {}
+
+do_execsql_test 2.2 {
+ DELETE FROM t1 WHERE rowid BETWEEN 2 AND 1000;
+}
+
+do_execsql_test 2.3 {
+ INSERT INTO t1(t1) VALUES('integrity-check');
+}
+
+do_execsql_test 2.6 {
+ INSERT INTO t1(rowid, x) VALUES(500, 'middle');
+ INSERT INTO t1(rowid, x) VALUES(501, 'value');
+ SELECT * FROM t1('the middle');
+}
+
+do_execsql_test 2.7 {
+ INSERT INTO t1(t1) VALUES('optimize');
+}
+
+do_execsql_test 2.8 {
+ SELECT count(*) FROM t1_data
+} 4
+
+#execsql_pp { SELECT id, quote(block), fts5_decode(id, block) FROM t1_data; }
+
+#-------------------------------------------------------------------------
+# Tests with large/small rowid values.
+#
+
+foreach {tn cfg} {
+ 1 ""
+ 2 "INSERT INTO fff(fff, rank) VALUES('secure-delete', 1)"
+} {
+ reset_db
+
+ expr srand(0)
+
+ set vocab {
+ Popper Poppins Popsicle Porfirio Porrima Porsche
+ Porter Portia Portland Portsmouth Portugal Portuguese
+ Poseidon Post PostgreSQL Potemkin Potomac Potsdam
+ Pottawatomie Potter Potts Pound Poussin Powell
+ PowerPC PowerPoint Powers Powhatan Poznan Prada
+ Prado Praetorian Prague Praia Prakrit Pratchett
+ Pratt Pravda Praxiteles Preakness Precambrian Preminger
+ Premyslid Prensa Prentice Pres Presbyterian Presbyterianism
+ }
+ proc newdoc {} {
+ for {set i 0} {$i<8} {incr i} {
+ lappend ret [lindex $::vocab [expr int(abs(rand()) * [llength $::vocab])]]
+ }
+ set ret
+ }
+ db func newdoc newdoc
+
+ do_execsql_test 3.$tn.0 {
+ CREATE VIRTUAL TABLE fff USING fts5(y);
+ INSERT INTO fff(fff, rank) VALUES('pgsz', 64);
+
+ WITH s(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM s WHERE x<1000 )
+ INSERT INTO fff(rowid, y) SELECT random() , newdoc() FROM s;
+
+ WITH s(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM s WHERE x<1000 )
+ INSERT INTO fff(rowid, y) SELECT random() , newdoc() FROM s;
+
+ WITH s(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM s WHERE x<1000 )
+ INSERT INTO fff(rowid, y) SELECT random() , newdoc() FROM s;
+ }
+
+ execsql $cfg
+
+ proc lshuffle {in} {
+ set out [list]
+ while {[llength $in]>0} {
+ set idx [expr int(abs(rand()) * [llength $in])]
+ lappend out [lindex $in $idx]
+ set in [lreplace $in $idx $idx]
+ }
+ set out
+ }
+
+ #dump fff
+
+ set iTest 1
+ foreach ii [lshuffle [db eval {SELECT rowid FROM fff}]] {
+ #if {$iTest==1} { dump fff }
+ #if {$iTest==1} { breakpoint }
+ do_execsql_test 3.$tn.1.$iTest.$ii {
+ DELETE FROM fff WHERE rowid=$ii;
+ }
+ #if {$iTest==1} { dump fff }
+ if {($iTest % 20)==0} {
+ do_execsql_test 3.$tn.1.$iTest.$ii.ic {
+ INSERT INTO fff(fff) VALUES('integrity-check');
+ }
+ }
+ #if {$iTest==1} { break }
+ incr iTest
+ }
+}
+
+#execsql_pp { SELECT rowid FROM fff('post') ORDER BY rowid ASC }
+#breakpoint
+#execsql_pp {
+# SELECT rowid FROM fff('post') ORDER BY rowid DESC
+#}
+#
+#dump fff
+
+
+finish_test
+