|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
source [file join [file dirname [info script]] fts5_common.tcl] |
|
|
set testprefix fts5contentless2 |
|
|
|
|
|
|
|
|
ifcapable !fts5 { |
|
|
finish_test |
|
|
return |
|
|
} |
|
|
|
|
|
proc vocab {} { |
|
|
list aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn ooo ppp |
|
|
} |
|
|
|
|
|
proc document {nToken} { |
|
|
set doc [list] |
|
|
set vocab [vocab] |
|
|
for {set ii 0} {$ii < $nToken} {incr ii} { |
|
|
lappend doc [lindex $vocab [expr int(rand()*[llength $vocab])]] |
|
|
} |
|
|
set doc |
|
|
} |
|
|
db func document document |
|
|
|
|
|
proc contains {doc token} { |
|
|
expr {[lsearch $doc $token]>=0} |
|
|
} |
|
|
db func contains contains |
|
|
|
|
|
proc do_compare_tables_test {tn} { |
|
|
uplevel [list do_test $tn { |
|
|
foreach v [vocab] { |
|
|
set l1 [execsql { SELECT rowid FROM t1 WHERE contains(doc, $v) }] |
|
|
set l2 [execsql { SELECT rowid FROM t2($v) }] |
|
|
if {$l1!=$l2} { error "1: query mismatch ($l1) ($l2)" } |
|
|
|
|
|
set w "[string range $v 0 1]*" |
|
|
set l1 [execsql { SELECT rowid FROM t1 WHERE contains(doc, $w) }] |
|
|
set l2 [execsql { SELECT rowid FROM t2($w) }] |
|
|
if {$l1!=$l2} { error "2: query mismatch ($l1) ($l2)" } |
|
|
|
|
|
set w "[string range $v 0 0]*" |
|
|
set l1 [execsql { SELECT rowid FROM t1 WHERE contains(doc, $w) }] |
|
|
set l2 [execsql { SELECT rowid FROM t2($w) }] |
|
|
if {$l1!=$l2} { error "2: query mismatch ($l1) ($l2)" } |
|
|
|
|
|
set l1 [execsql { |
|
|
SELECT rowid FROM t1 WHERE contains(doc, $v) ORDER BY rowid DESC |
|
|
}] |
|
|
set l2 [execsql { SELECT rowid FROM t2($v) ORDER BY rowid DESC }] |
|
|
if {$l1!=$l2} { error "1: query mismatch ($l1) ($l2)" } |
|
|
} |
|
|
set {} {} |
|
|
} {}] |
|
|
} |
|
|
|
|
|
proc lshuffle {in} { |
|
|
set L [list] |
|
|
set ret [list] |
|
|
foreach elem $in { lappend L [list [expr rand()] $elem] } |
|
|
foreach pair [lsort -index 0 $L] { lappend ret [lindex $pair 1] } |
|
|
set ret |
|
|
} |
|
|
|
|
|
expr srand(0) |
|
|
|
|
|
do_execsql_test 1.0 { |
|
|
CREATE VIRTUAL TABLE t2 USING fts5( |
|
|
doc, prefix=2, content=, contentless_delete=1 |
|
|
); |
|
|
|
|
|
CREATE TABLE t1(doc); |
|
|
CREATE TRIGGER tr1 AFTER DELETE ON t1 BEGIN |
|
|
DELETE FROM t2 WHERE rowid = old.rowid; |
|
|
END; |
|
|
} |
|
|
|
|
|
set SMALLEST64 -9223372036854775808 |
|
|
set LARGEST64 9223372036854775807 |
|
|
|
|
|
foreach {tn r1 r2} { |
|
|
1 0 50 |
|
|
2 $SMALLEST64 $SMALLEST64+50 |
|
|
3 $LARGEST64-50 $LARGEST64 |
|
|
4 -50 -1 |
|
|
} { |
|
|
set r1 [expr $r1] |
|
|
set r2 [expr $r2] |
|
|
|
|
|
do_test 1.1.$tn { |
|
|
execsql BEGIN |
|
|
for {set ii $r1} {$ii <= $r2} {incr ii} { |
|
|
execsql { INSERT INTO t1(rowid, doc) VALUES ($ii, document(8)); } |
|
|
} |
|
|
execsql COMMIT |
|
|
} {} |
|
|
} |
|
|
do_test 1.2 { |
|
|
db eval { SELECT rowid, doc FROM t1 } { |
|
|
execsql { INSERT INTO t2(rowid, doc) VALUES($rowid, $doc) } |
|
|
} |
|
|
} {} |
|
|
|
|
|
foreach {tn rowid} { |
|
|
1 $SMALLEST64 |
|
|
2 0 |
|
|
3 -5 |
|
|
4 -30 |
|
|
5 $LARGEST64 |
|
|
6 $LARGEST64-1 |
|
|
} { |
|
|
set rowid [expr $rowid] |
|
|
do_execsql_test 1.3.$tn.1 { |
|
|
DELETE FROM t1 WHERE rowid=$rowid |
|
|
} |
|
|
do_compare_tables_test 1.3.$tn.2 |
|
|
} |
|
|
|
|
|
set iTest 1 |
|
|
foreach r [lshuffle [execsql {SELECT rowid FROM t1}]] { |
|
|
if {($iTest % 50)==0} { |
|
|
execsql { INSERT INTO t2(t2) VALUES('optimize') } |
|
|
} |
|
|
if {($iTest % 5)==0} { |
|
|
execsql { INSERT INTO t2(t2, rank) VALUES('merge', 5) } |
|
|
} |
|
|
do_execsql_test 1.4.$iTest.1($r) { |
|
|
DELETE FROM t1 WHERE rowid=$r |
|
|
} |
|
|
do_compare_tables_test 1.4.$iTest.2 |
|
|
incr iTest |
|
|
} |
|
|
|
|
|
do_execsql_test 1.5 { |
|
|
SELECT * FROM t1 |
|
|
} {} |
|
|
|
|
|
|
|
|
reset_db |
|
|
db func document document |
|
|
|
|
|
do_execsql_test 2.0 { |
|
|
CREATE VIRTUAL TABLE t2 USING fts5(doc, content=, contentless_delete=1); |
|
|
WITH s(i) AS ( |
|
|
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 |
|
|
) |
|
|
INSERT INTO t2(rowid, doc) SELECT i, i || ' ' || i FROM s; |
|
|
} |
|
|
|
|
|
do_execsql_test 2.1 { |
|
|
BEGIN; |
|
|
DELETE FROM t2 WHERE rowid=32; |
|
|
DELETE FROM t2 WHERE rowid=64; |
|
|
DELETE FROM t2 WHERE rowid=96; |
|
|
DELETE FROM t2 WHERE rowid=128; |
|
|
DELETE FROM t2 WHERE rowid=160; |
|
|
DELETE FROM t2 WHERE rowid=192; |
|
|
COMMIT; |
|
|
} |
|
|
|
|
|
do_execsql_test 2.2 { |
|
|
SELECT * FROM t2('128'); |
|
|
} {} |
|
|
|
|
|
|
|
|
|
|
|
foreach {tn step} { |
|
|
1 3 |
|
|
2 7 |
|
|
3 15 |
|
|
} { |
|
|
set step [expr $step] |
|
|
|
|
|
reset_db |
|
|
db func document document |
|
|
do_execsql_test 3.$tn.0 { |
|
|
CREATE VIRTUAL TABLE t2 USING fts5(doc, content=, contentless_delete=1); |
|
|
INSERT INTO t2(t2, rank) VALUES('pgsz', 100); |
|
|
WITH s(i) AS ( |
|
|
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 |
|
|
) |
|
|
INSERT INTO t2(rowid, doc) SELECT i, i || ' ' || i FROM s; |
|
|
} |
|
|
do_execsql_test 3.$tn.1 { |
|
|
DELETE FROM t2 WHERE (rowid % $step)==0 |
|
|
} |
|
|
do_execsql_test 3.$tn.2 { |
|
|
SELECT * FROM t2( $step * 5 ) |
|
|
} {} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
finish_test |
|
|
|