mirror of
https://github.com/sqlite/sqlite.git
synced 2024-11-24 16:18:08 +01:00
68c0da6f66
FossilOrigin-Name: 4d3f27ba90aa59837e49ceaae9f36cad426af3a33707d85d1bb848fc1bda6fed
171 lines
4.6 KiB
Plaintext
171 lines
4.6 KiB
Plaintext
# 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
|
|
|