123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- # 2014 Dec 20
- #
- # 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.
- #
- #***********************************************************************
- #
- # This file contains tests for the content= and content_rowid= options.
- #
- source [file join [file dirname [info script]] fts5_common.tcl]
- set testprefix fts5contentless
- # If SQLITE_ENABLE_FTS5 is not defined, omit this file.
- ifcapable !fts5 {
- finish_test
- return
- }
- # Check that it is not possible to specify "contentless_delete=1" for
- # anything other than a contentless table.
- #
- set res(0) {0 {}}
- set res(1) {1 {contentless_delete=1 requires a contentless table}}
- foreach {tn sql bError} {
- 1 "(a, b, contentless_delete=1)" 1
- 2 "(a, b, contentless_delete=1, content=abc)" 1
- 3 "(a, b, contentless_delete=1, content=)" 0
- 4 "(content=, contentless_delete=1, a)" 0
- 5 "(content='', contentless_delete=1, hello)" 0
- } {
- execsql { BEGIN }
- do_catchsql_test 1.$tn "CREATE VIRTUAL TABLE t1 USING fts5 $sql" $res($bError)
- execsql { ROLLBACK }
- }
- # Check that it is not possible to specify "contentless_delete=1"
- # along with columnsize=1.
- #
- set res(0) {0 {}}
- set res(1) {1 {contentless_delete=1 is incompatible with columnsize=0}}
- foreach {tn sql bError} {
- 2 "(a, b, content='', contentless_delete=1, columnsize=0)" 1
- } {
- execsql { BEGIN }
- do_catchsql_test 1.$tn "CREATE VIRTUAL TABLE t1 USING fts5 $sql" $res($bError)
- execsql { ROLLBACK }
- }
- # Check that if contentless_delete=1 is specified, then the "origin"
- # column is added to the %_docsize table.
- reset_db
- do_execsql_test 3.0 {
- CREATE VIRTUAL TABLE x1 USING fts5(c, content='');
- CREATE VIRTUAL TABLE x2 USING fts5(c, content='', contentless_delete=1);
- }
- do_execsql_test 3.1 {
- SELECT sql FROM sqlite_schema WHERE name IN ('x1_docsize', 'x2_docsize');
- } {
- {CREATE TABLE 'x1_docsize'(id INTEGER PRIMARY KEY, sz BLOB)}
- {CREATE TABLE 'x2_docsize'(id INTEGER PRIMARY KEY, sz BLOB, origin INTEGER)}
- }
- do_execsql_test 3.2.1 {
- SELECT hex(block) FROM x1_data WHERE id=10
- } {00000000000000}
- do_execsql_test 3.2.2 {
- SELECT hex(block) FROM x2_data WHERE id=10
- } {00000000FF000001000000}
- do_execsql_test 3.3 {
- INSERT INTO x2 VALUES('first text');
- INSERT INTO x2 VALUES('second text');
- }
- do_execsql_test 3.4 {
- SELECT id, origin FROM x2_docsize
- } {1 1 2 2}
- do_execsql_test 3.5 {
- SELECT level, segment, loc1, loc2 FROM fts5_structure(
- (SELECT block FROM x2_data WHERE id=10)
- )
- } {
- 0 0 1 1
- 0 1 2 2
- }
- do_execsql_test 3.6 {
- INSERT INTO x2(x2) VALUES('optimize');
- }
- do_execsql_test 3.7 {
- SELECT level, segment, loc1, loc2 FROM fts5_structure(
- (SELECT block FROM x2_data WHERE id=10)
- )
- } {
- 1 0 1 2
- }
- do_execsql_test 3.8 {
- DELETE FROM x2 WHERE rowid=2;
- }
- do_execsql_test 3.9 {
- SELECT rowid FROM x2('text')
- } {1}
- #--------------------------------------------------------------------------
- reset_db
- 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
- }
- set nRow 1000
- do_execsql_test 4.0 {
- CREATE TABLE t1(x);
- CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1);
- INSERT INTO ft(ft, rank) VALUES('pgsz', 100);
- }
- do_test 4.1 {
- for {set ii 0} {$ii < $nRow} {incr ii} {
- set doc [document 6]
- execsql {
- INSERT INTO t1 VALUES($doc);
- INSERT INTO ft VALUES($doc);
- }
- }
- } {}
- foreach v {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 L1 [execsql {SELECT rowid FROM t1 WHERE x LIKE '%'||$v||'%'}]
- set L2 [execsql {SELECT rowid FROM ft($v)}]
- do_test 4.2.$v { set L1 } $L2
- }
- do_test 4.3 {
- for {set ii 1} {$ii < $nRow} {incr ii 2} {
- execsql {
- DELETE FROM ft WHERE rowid=$ii;
- DELETE FROM t1 WHERE rowid=$ii;
- }
- }
- } {}
- foreach v {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 L1 [execsql {SELECT rowid FROM t1 WHERE x LIKE '%'||$v||'%'}]
- set L2 [execsql {SELECT rowid FROM ft($v)}]
- do_test 4.4.$v { set L1 } $L2
- }
- do_execsql_test 4.5 {
- INSERT INTO ft(ft) VALUES('optimize');
- } {}
- foreach v {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 L1 [execsql {SELECT rowid FROM t1 WHERE x LIKE '%'||$v||'%'}]
- set L2 [execsql {SELECT rowid FROM ft($v)}]
- do_test 4.6.$v { set L1 } $L2
- }
- #execsql_pp { SELECT fts5_decode(id, block) FROM ft_data }
- #-------------------------------------------------------------------------
- reset_db
- do_execsql_test 5.0 {
- CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1);
- INSERT INTO ft(rowid, x) VALUES(1, 'one two three');
- INSERT INTO ft(rowid, x) VALUES(2, 'one two four');
- INSERT INTO ft(rowid, x) VALUES(3, 'one two five');
- INSERT INTO ft(rowid, x) VALUES(4, 'one two seven');
- INSERT INTO ft(rowid, x) VALUES(5, 'one two eight');
- }
- do_execsql_test 5.1 {
- DELETE FROM ft WHERE rowid=2
- }
- do_execsql_test 5.2 {
- SELECT rowid FROM ft
- } {1 3 4 5}
- do_catchsql_test 5.3 {
- UPDATE ft SET x='four six' WHERE rowid=3
- } {0 {}}
- do_execsql_test 5.4 {
- SELECT rowid FROM ft('one');
- } {1 4 5}
- do_execsql_test 5.5 {
- REPLACE INTO ft(rowid, x) VALUES(3, 'four six');
- SELECT rowid FROM ft('one');
- } {1 4 5}
- do_execsql_test 5.6 {
- REPLACE INTO ft(rowid, x) VALUES(6, 'one two eleven');
- SELECT rowid FROM ft('one');
- } {1 4 5 6}
- #-------------------------------------------------------------------------
- reset_db
- do_execsql_test 6.0 {
- CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1);
- INSERT INTO ft(rowid, x) VALUES(1, 'one two three');
- INSERT INTO ft(rowid, x) VALUES(2, 'one two four');
- }
- do_test 6.1 {
- db eval { SELECT rowid FROM ft('one two') } {
- if {$rowid==1} {
- db eval { INSERT INTO ft(rowid, x) VALUES(3, 'one two four') }
- }
- }
- } {}
- #-------------------------------------------------------------------------
- reset_db
- do_execsql_test 7.0 {
- CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1);
- }
- set lRowid [list -450 0 1 2 42]
- do_test 7.1 {
- execsql BEGIN
- foreach r $lRowid {
- execsql { INSERT INTO ft(rowid, x) VALUES($r, 'one one one'); }
- }
- execsql COMMIT
- } {}
- do_test 7.2 {
- execsql BEGIN
- foreach r $lRowid {
- execsql { REPLACE INTO ft(rowid, x) VALUES($r, 'two two two'); }
- }
- execsql COMMIT
- } {}
- do_execsql_test 7.3 { SELECT rowid FROM ft('one'); } {}
- do_execsql_test 7.4 { SELECT rowid FROM ft('two'); } $lRowid
- #-------------------------------------------------------------------------
- reset_db
- do_execsql_test 8.0 {
- CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1);
- INSERT INTO ft VALUES('hello world');
- INSERT INTO ft VALUES('one two three');
- }
- do_catchsql_test 8.1 {
- INSERT INTO ft(ft, rowid, x) VALUES('delete', 1, 'hello world');
- } {1 {'delete' may not be used with a contentless_delete=1 table}}
- do_execsql_test 8.2 {
- BEGIN;
- INSERT INTO ft(rowid, x) VALUES(3, 'four four four');
- DELETE FROM ft WHERE rowid=3;
- COMMIT;
- SELECT rowid FROM ft('four');
- } {}
- #-------------------------------------------------------------------------
- reset_db
- do_execsql_test 9.0 {
- CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=0);
- INSERT INTO ft VALUES('hello world');
- INSERT INTO ft VALUES('one two three');
- }
- do_catchsql_test 9.1 {
- INSERT INTO ft(ft, rowid, x) VALUES('delete', 1, 'hello world');
- } {0 {}}
- do_catchsql_test 9.2 {
- CREATE VIRTUAL TABLE ft2 USING fts5(x, content='', contentless_delete=2);
- } {1 {malformed contentless_delete=... directive}}
- do_catchsql_test 9.3 {
- CREATE VIRTUAL TABLE ft2 USING fts5(x, content='', contentless_delete=11);
- } {1 {malformed contentless_delete=... directive}}
- finish_test
|