| # 2023 April 14 |
| # |
| # 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] |
| return_if_no_fts5 |
| set ::testprefix fts5secure4 |
| |
| #------------------------------------------------------------------------- |
| # Test using the 'delete' command to attempt to delete a token that |
| # is not present in the index in secure-delete mode. |
| # |
| do_execsql_test 1.0 { |
| CREATE VIRTUAL TABLE t1 USING fts5(a, b, content=x1); |
| |
| CREATE TABLE x1(rowid INTEGER PRIMARY KEY, a, b); |
| INSERT INTO x1 VALUES |
| (1, 'hello world', 'today xyz'), |
| (2, 'not the day', 'crunch crumble and chomp'), |
| (3, 'one', 'two'); |
| INSERT INTO t1(t1) VALUES('rebuild'); |
| } |
| |
| do_execsql_test 1.1 { |
| INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); |
| } |
| |
| do_execsql_test 1.2 { |
| INSERT INTO t1(t1, rowid, a, b) VALUES('delete', 4, 'nosuchtoken', ''); |
| } |
| |
| do_execsql_test 1.3 { |
| INSERT INTO t1(t1) VALUES('integrity-check'); |
| } |
| |
| do_execsql_test 1.4 { |
| INSERT INTO t1(t1, rowid, a, b) VALUES('delete', 1, 'crunch', ''); |
| } |
| |
| do_execsql_test 1.5 { |
| INSERT INTO t1(t1, rowid, a, b) VALUES('delete', 3, 'crunch', ''); |
| } |
| |
| do_execsql_test 1.6 { |
| INSERT INTO t1(t1) VALUES('integrity-check'); |
| } |
| |
| do_execsql_test 1.7 { |
| CREATE VIRTUAL TABLE y1 USING fts5(xx, prefix='1,2'); |
| INSERT INTO y1(y1, rank) VALUES('pgsz', 64); |
| INSERT INTO y1(y1, rank) VALUES('secure-delete', 1); |
| } |
| do_execsql_test 1.8 { |
| BEGIN; |
| INSERT INTO y1(rowid, xx) VALUES(1, 'abc def'); |
| INSERT INTO y1(rowid, xx) VALUES(2, 'reallyreallylongtoken'); |
| COMMIT; |
| } |
| do_execsql_test 1.9 { |
| DELETE FROM y1 WHERE rowid=1; |
| INSERT INTO y1(y1) VALUES('integrity-check'); |
| } |
| |
| do_execsql_test 1.10 { |
| CREATE VIRTUAL TABLE w1 USING fts5(ww, content=""); |
| INSERT INTO w1(rowid, ww) VALUES(123, ''); |
| } |
| do_catchsql_test 1.11 { |
| INSERT INTO w1(w1, rowid, ww) VALUES('delete', 123, 'xyz'); |
| } {1 {database disk image is malformed}} |
| do_catchsql_test 1.12 { |
| DROP TABLE w1; |
| CREATE VIRTUAL TABLE w1 USING fts5(ww, content=""); |
| INSERT INTO w1(rowid, ww) VALUES(123, ''); |
| DELETE FROM w1_data WHERE id>10; |
| INSERT INTO w1(w1, rowid, ww) VALUES('delete', 123, 'xyz'); |
| } {1 {database disk image is malformed}} |
| |
| #------------------------------------------------------------------------- |
| # Test using secure-delete with detail=none or detail=col. |
| # |
| foreach {tn d} {1 full 2 none 3 column} { |
| reset_db |
| do_execsql_test 2.$tn.1 " |
| CREATE VIRTUAL TABLE x1 USING fts5(xx, yy, zz, detail=$d, prefix='10,20'); |
| INSERT INTO x1(x1, rank) VALUES('pgsz', 64); |
| INSERT INTO x1(x1, rank) VALUES('secure-delete', 1); |
| " |
| |
| do_execsql_test 2.$tn.2 { |
| BEGIN; |
| INSERT INTO x1(xx, yy, zz) VALUES('a b c', 'd e f', 'a b c'); |
| INSERT INTO x1(xx, yy, zz) VALUES('a b c', 'd e f', 'a b c'); |
| INSERT INTO x1(xx, yy, zz) VALUES('a b c', 'd e f', 'a b c'); |
| INSERT INTO x1(xx, yy, zz) VALUES('a b c', 'd e f', 'a b c'); |
| INSERT INTO x1(xx, yy, zz) VALUES('a b c', 'd e f', 'a b c'); |
| COMMIT; |
| INSERT INTO x1(x1) VALUES('integrity-check'); |
| } |
| |
| do_execsql_test 2.$tn.3 { |
| DELETE FROM x1 WHERE rowid IN (2, 4, 6); |
| INSERT INTO x1(x1) VALUES('integrity-check'); |
| } |
| |
| do_execsql_test 2.$tn.4 { |
| DELETE FROM x1 WHERE rowid IN (1, 3, 5); |
| INSERT INTO x1(x1) VALUES('integrity-check'); |
| } |
| |
| do_execsql_test 2.$tn.5 { |
| WITH s(i) AS ( |
| SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 |
| ) |
| INSERT INTO x1 |
| SELECT 'seems to be', 'used brew to', 'everything is working' FROM s |
| UNION ALL |
| SELECT 'used brew to', 'everything is working', 'seems to be' FROM s |
| UNION ALL |
| SELECT 'everything is working', 'seems to be', 'used brew to' FROM s |
| UNION ALL |
| SELECT 'abc', 'zzz', 'a b c d' |
| UNION ALL |
| SELECT 'z', 'z', 'z' FROM s |
| } |
| |
| do_test 2.$tn.6 { |
| for {set i 300} {$i > 200} {incr i -1} { |
| execsql { |
| DELETE FROM x1 WHERE rowid=$i; |
| INSERT INTO x1(x1) VALUES('integrity-check'); |
| } |
| } |
| } {} |
| |
| do_test 2.$tn.7 { |
| for {set i 1} {$i < 100} {incr i} { |
| execsql { |
| DELETE FROM x1 WHERE rowid=$i; |
| INSERT INTO x1(x1) VALUES('integrity-check'); |
| } |
| } |
| } {} |
| |
| do_test 2.$tn.8 { |
| foreach i [db eval {SELECT rowid FROM x1}] { |
| execsql { |
| DELETE FROM x1 WHERE rowid=$i; |
| INSERT INTO x1(x1) VALUES('integrity-check'); |
| } |
| } |
| } {} |
| |
| do_execsql_test 2.$tn.9 { |
| SELECT * FROM x1 |
| } {} |
| } |
| |
| |
| |
| finish_test |
| |