|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
source [file join [file dirname [info script]] fts5_common.tcl] |
|
|
set testprefix fts5contentless4 |
|
|
|
|
|
|
|
|
ifcapable !fts5 { |
|
|
finish_test |
|
|
return |
|
|
} |
|
|
|
|
|
proc document {n} { |
|
|
set vocab [list A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] |
|
|
set ret [list] |
|
|
for {set ii 0} {$ii < $n} {incr ii} { |
|
|
lappend ret [lindex $vocab [expr int(rand()*[llength $vocab])]] |
|
|
} |
|
|
set ret |
|
|
} |
|
|
db func document document |
|
|
|
|
|
do_execsql_test 1.0 { |
|
|
CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1); |
|
|
INSERT INTO ft(ft, rank) VALUES('pgsz', 240); |
|
|
WITH s(i) AS ( |
|
|
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 |
|
|
) |
|
|
INSERT INTO ft SELECT document(12) FROM s; |
|
|
} |
|
|
|
|
|
do_execsql_test 1.1 { |
|
|
INSERT INTO ft(ft) VALUES('optimize'); |
|
|
} |
|
|
|
|
|
do_execsql_test 1.2 { |
|
|
SELECT level, segment, nentry, nentrytombstone FROM fts5_structure(( |
|
|
SELECT block FROM ft_data WHERE id=10 |
|
|
)) |
|
|
} {0 0 1000 0} |
|
|
|
|
|
do_execsql_test 1.3 { |
|
|
DELETE FROM ft WHERE rowid < 50 |
|
|
} |
|
|
|
|
|
do_execsql_test 1.4 { |
|
|
SELECT level, segment, nentry, nentrytombstone FROM fts5_structure(( |
|
|
SELECT block FROM ft_data WHERE id=10 |
|
|
)) |
|
|
} {0 0 1000 49} |
|
|
|
|
|
do_execsql_test 1.5 { |
|
|
DELETE FROM ft WHERE rowid < 1000 |
|
|
} |
|
|
|
|
|
do_execsql_test 1.6 { |
|
|
SELECT level, segment, nentry, nentrytombstone FROM fts5_structure(( |
|
|
SELECT block FROM ft_data WHERE id=10 |
|
|
)) |
|
|
} {1 0 1 0} |
|
|
|
|
|
|
|
|
reset_db |
|
|
db func document document |
|
|
|
|
|
do_execsql_test 2.0 { |
|
|
CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1); |
|
|
} |
|
|
|
|
|
do_test 2.1 { |
|
|
for {set ii 0} {$ii < 5000} {incr ii} { |
|
|
execsql { INSERT INTO ft VALUES( document(12) ) } |
|
|
} |
|
|
} {} |
|
|
|
|
|
do_execsql_test 2.2 { |
|
|
SELECT sum(nentry) - sum(nentrytombstone) FROM fts5_structure(( |
|
|
SELECT block FROM ft_data WHERE id=10 |
|
|
)) |
|
|
} {5000} |
|
|
|
|
|
for {set ii 5000} {$ii >= 0} {incr ii -100} { |
|
|
do_execsql_test 2.3.$ii { |
|
|
DELETE FROM ft WHERE rowid > $ii |
|
|
} |
|
|
do_execsql_test 2.3.$ii.2 { |
|
|
SELECT |
|
|
CAST((total(nentry) - total(nentrytombstone)) AS integer) |
|
|
FROM |
|
|
fts5_structure( (SELECT block FROM ft_data WHERE id=10) ) |
|
|
} $ii |
|
|
} |
|
|
|
|
|
execsql_pp { |
|
|
SELECT * FROM fts5_structure(( |
|
|
SELECT block FROM ft_data WHERE id=10 |
|
|
)) |
|
|
} |
|
|
|
|
|
do_test 2.4 { |
|
|
for {set ii 0} {$ii < 5000} {incr ii} { |
|
|
execsql { INSERT INTO ft VALUES( document(12) ) } |
|
|
} |
|
|
} {} |
|
|
|
|
|
for {set ii 1} {$ii <= 5000} {incr ii 10} { |
|
|
do_execsql_test 2.3.$ii { |
|
|
DELETE FROM ft WHERE rowid = $ii; |
|
|
INSERT INTO ft VALUES( document(12) ); |
|
|
INSERT INTO ft(ft, rank) VALUES('merge', -10); |
|
|
} |
|
|
|
|
|
do_execsql_test 2.3.$ii.2 { |
|
|
SELECT |
|
|
CAST((total(nentry) - total(nentrytombstone)) AS integer) |
|
|
FROM |
|
|
fts5_structure( (SELECT block FROM ft_data WHERE id=10) ) |
|
|
} 5000 |
|
|
} |
|
|
|
|
|
|
|
|
reset_db |
|
|
db func document document |
|
|
do_execsql_test 3.0 { |
|
|
CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1); |
|
|
WITH s(i) AS ( |
|
|
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 |
|
|
) |
|
|
INSERT INTO ft SELECT document(12) FROM s; |
|
|
} |
|
|
|
|
|
do_catchsql_test 3.1 { |
|
|
INSERT INTO ft(ft, rank) VALUES('deletemerge', 'text'); |
|
|
} {1 {SQL logic error}} |
|
|
do_catchsql_test 3.2 { |
|
|
INSERT INTO ft(ft, rank) VALUES('deletemerge', 50); |
|
|
} {0 {}} |
|
|
do_execsql_test 3.3 { |
|
|
SELECT * FROM ft_config WHERE k='deletemerge' |
|
|
} {deletemerge 50} |
|
|
do_catchsql_test 3.4 { |
|
|
INSERT INTO ft(ft, rank) VALUES('deletemerge', 101); |
|
|
} {0 {}} |
|
|
do_execsql_test 3.5 { |
|
|
SELECT * FROM ft_config WHERE k='deletemerge' |
|
|
} {deletemerge 101} |
|
|
|
|
|
do_execsql_test 3.6 { |
|
|
DELETE FROM ft WHERE rowid<95 |
|
|
} |
|
|
|
|
|
do_execsql_test 3.7 { |
|
|
SELECT nentrytombstone, nentry FROM fts5_structure(( |
|
|
SELECT block FROM ft_data WHERE id=10 |
|
|
)) |
|
|
} {94 100} |
|
|
|
|
|
do_execsql_test 3.8 { |
|
|
DELETE FROM ft WHERE rowid=95 |
|
|
} |
|
|
|
|
|
do_execsql_test 3.9 { |
|
|
SELECT nentrytombstone, nentry FROM fts5_structure(( |
|
|
SELECT block FROM ft_data WHERE id=10 |
|
|
)) |
|
|
} {95 100} |
|
|
|
|
|
do_execsql_test 3.10 { |
|
|
DELETE FROM ft; |
|
|
WITH s(i) AS ( |
|
|
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 |
|
|
) |
|
|
INSERT INTO ft SELECT document(12) FROM s; |
|
|
INSERT INTO ft(ft, rank) VALUES('deletemerge', 50); |
|
|
} |
|
|
|
|
|
do_execsql_test 3.11 { |
|
|
DELETE FROM ft WHERE rowid<95 |
|
|
} |
|
|
|
|
|
do_execsql_test 3.12 { |
|
|
SELECT nentrytombstone, nentry FROM fts5_structure(( |
|
|
SELECT block FROM ft_data WHERE id=10 |
|
|
)) |
|
|
} {0 6} |
|
|
|
|
|
|
|
|
reset_db |
|
|
db func document document |
|
|
do_execsql_test 4.0 { |
|
|
CREATE VIRTUAL TABLE x1 USING fts5(x, content='', contentless_delete=1); |
|
|
INSERT INTO x1(x1, rank) VALUES('usermerge', 16); |
|
|
INSERT INTO x1(x1, rank) VALUES('deletemerge', 40); |
|
|
INSERT INTO x1 VALUES('one'); |
|
|
INSERT INTO x1 VALUES('two'); |
|
|
INSERT INTO x1 VALUES('three'); |
|
|
INSERT INTO x1 VALUES('four'); |
|
|
INSERT INTO x1 VALUES('five'); |
|
|
INSERT INTO x1 VALUES('six'); |
|
|
INSERT INTO x1 VALUES('seven'); |
|
|
INSERT INTO x1 VALUES('eight'); |
|
|
INSERT INTO x1 VALUES('nine'); |
|
|
INSERT INTO x1 VALUES('ten'); |
|
|
} |
|
|
|
|
|
do_execsql_test 4.1 { |
|
|
SELECT level, segment FROM fts5_structure(( |
|
|
SELECT block FROM x1_data WHERE id=10 |
|
|
)) |
|
|
} { |
|
|
0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 |
|
|
} |
|
|
|
|
|
for {set ii 1} {$ii < 4} {incr ii} { |
|
|
do_execsql_test 4.2.$ii { |
|
|
DELETE FROM x1 WHERE rowid = $ii; |
|
|
INSERT INTO x1(x1, rank) VALUES('merge', 5); |
|
|
SELECT level, segment FROM fts5_structure(( |
|
|
SELECT block FROM x1_data WHERE id=10 |
|
|
)) |
|
|
} { |
|
|
0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 |
|
|
} |
|
|
} |
|
|
|
|
|
do_execsql_test 4.3 { |
|
|
DELETE FROM x1 WHERE rowid = $ii; |
|
|
INSERT INTO x1(x1, rank) VALUES('merge', 5); |
|
|
SELECT level, segment, nentry FROM fts5_structure(( |
|
|
SELECT block FROM x1_data WHERE id=10 |
|
|
)) |
|
|
} { |
|
|
1 0 6 |
|
|
} |
|
|
|
|
|
finish_test |
|
|
|