885f410472
FossilOrigin-Name: d14fc621e918915bbf8e04597eb238ea78dff3d9c5eb4402cb88692d00dbdfee
230 lines
6.5 KiB
Plaintext
230 lines
6.5 KiB
Plaintext
# 2017 March 22
|
|
#
|
|
# 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 implements regression tests for SQLite library. The
|
|
# focus of this script is testing the FTS3 module.
|
|
#
|
|
|
|
set testdir [file dirname $argv0]
|
|
source $testdir/tester.tcl
|
|
set testprefix fts3misc
|
|
|
|
# If SQLITE_ENABLE_FTS3 is defined, omit this file.
|
|
ifcapable !fts3 {
|
|
finish_test
|
|
return
|
|
}
|
|
|
|
#-------------------------------------------------------------------------
|
|
# A self-join.
|
|
#
|
|
do_execsql_test 1.0 {
|
|
CREATE VIRTUAL TABLE t1 USING fts3(a, b);
|
|
INSERT INTO t1 VALUES('one', 'i');
|
|
INSERT INTO t1 VALUES('one', 'ii');
|
|
INSERT INTO t1 VALUES('two', 'i');
|
|
INSERT INTO t1 VALUES('two', 'ii');
|
|
}
|
|
|
|
do_execsql_test 1.1 {
|
|
SELECT a.a, b.b FROM t1 a, t1 b WHERE a.t1 MATCH 'two' AND b.t1 MATCH 'i'
|
|
} {two i two i two i two i}
|
|
|
|
#-------------------------------------------------------------------------
|
|
# FTS tables with 128 or more columns.
|
|
#
|
|
proc v1 {v} {
|
|
set vector [list a b c d e f g h]
|
|
set res [list]
|
|
for {set i 0} {$i<8} {incr i} {
|
|
if {$v & (1 << $i)} { lappend res [lindex $vector $i] }
|
|
}
|
|
set res
|
|
}
|
|
proc v2 {v} {
|
|
set vector [list d e f g h i j k]
|
|
set res [list]
|
|
for {set i 0} {$i<8} {incr i} {
|
|
if {$v & (1 << $i)} { lappend res [lindex $vector $i] }
|
|
}
|
|
set res
|
|
}
|
|
db func v1 v1
|
|
db func v2 v2
|
|
|
|
do_test 2.0 {
|
|
set cols [list]
|
|
for {set i 0} {$i<200} {incr i} {
|
|
lappend cols "c$i"
|
|
}
|
|
execsql "CREATE VIRTUAL TABLE t2 USING fts3([join $cols ,])"
|
|
execsql {
|
|
WITH data(i) AS (
|
|
SELECT 1 UNION ALL SELECT i+1 FROM data WHERE i<200
|
|
)
|
|
INSERT INTO t2(c198, c199) SELECT v1(i), v2(i) FROM data;
|
|
}
|
|
} {}
|
|
do_execsql_test 2.1 {
|
|
SELECT rowid FROM t2 WHERE t2 MATCH '"a b c"'
|
|
} {
|
|
7 15 23 31 39 47 55 63 71 79 87 95 103 111
|
|
119 127 135 143 151 159 167 175 183 191 199
|
|
}
|
|
do_execsql_test 2.2 {
|
|
SELECT rowid FROM t2 WHERE t2 MATCH '"g h i"'
|
|
} {
|
|
56 57 58 59 60 61 62 63 120 121 122 123 124
|
|
125 126 127 184 185 186 187 188 189 190 191
|
|
}
|
|
do_execsql_test 2.3 {
|
|
SELECT rowid FROM t2 WHERE t2 MATCH '"i h"'
|
|
} {
|
|
}
|
|
do_execsql_test 2.4 {
|
|
SELECT rowid FROM t2 WHERE t2 MATCH '"f e"'
|
|
} {
|
|
}
|
|
do_execsql_test 2.5 {
|
|
SELECT rowid FROM t2 WHERE t2 MATCH '"e f"'
|
|
} {
|
|
6 7 14 15 22 23 30 31 38 39 46 47 48 49 50 51 52 53 54 55 56
|
|
57 58 59 60 61 62 63 70 71 78 79 86 87 94 95 102 103 110
|
|
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
|
134 135 142 143 150 151 158 159 166 167 174 175 176 177 178 179 180
|
|
181 182 183 184 185 186 187 188 189 190 191 198 199
|
|
}
|
|
|
|
#-------------------------------------------------------------------------
|
|
# Range constraints on the docid using non-integer values.
|
|
#
|
|
do_execsql_test 2.6 {
|
|
SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN NULL AND 45;
|
|
} {}
|
|
do_execsql_test 2.7 {
|
|
SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN 11.5 AND 48.2;
|
|
} {
|
|
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
|
29 30 31 34 35 38 39 42 43 46 47 48
|
|
}
|
|
do_execsql_test 2.8 {
|
|
SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN '11.5' AND '48.2';
|
|
} {
|
|
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
|
29 30 31 34 35 38 39 42 43 46 47 48
|
|
}
|
|
|
|
#-------------------------------------------------------------------------
|
|
# Phrase query tests.
|
|
#
|
|
do_execsql_test 3.1.1 {
|
|
CREATE VIRTUAL TABLE t3 USING fts3;
|
|
INSERT INTO t3 VALUES('a b c');
|
|
INSERT INTO t3 VALUES('d e f');
|
|
INSERT INTO t3 VALUES('a b d');
|
|
INSERT INTO t3 VALUES('1 2 3 4 5 6 7 8 9 10 11');
|
|
}
|
|
do_execsql_test 3.1.2 {
|
|
SELECT * FROM t3 WHERE t3 MATCH '"a b x y"' ORDER BY docid DESC
|
|
}
|
|
do_execsql_test 3.1.3 {
|
|
SELECT * FROM t3 WHERE t3 MATCH '"a b c" OR "a b x y"' ORDER BY docid DESC
|
|
} {{a b c}}
|
|
do_execsql_test 3.1.4 {
|
|
SELECT * FROM t3 WHERE t3 MATCH '"a* b* x* a*"'
|
|
}
|
|
do_execsql_test 3.1.5 {
|
|
SELECT rowid FROM t3 WHERE t3 MATCH '"2 3 4 5 6 7 8 9"'
|
|
} {4}
|
|
|
|
#-------------------------------------------------------------------------
|
|
#
|
|
reset_db
|
|
ifcapable fts4_deferred {
|
|
do_execsql_test 4.0 {
|
|
PRAGMA page_size = 512;
|
|
CREATE VIRTUAL TABLE t4 USING fts4;
|
|
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<8000 )
|
|
INSERT INTO t4 SELECT 'a b c a b c a b c' FROM s;
|
|
}
|
|
do_execsql_test 4.1 {
|
|
SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"'
|
|
} {8000}
|
|
do_execsql_test 4.2 {
|
|
SELECT quote(value) from t4_stat where id=0
|
|
} {X'C03EC0B204C0A608'}
|
|
do_execsql_test 4.3 {
|
|
UPDATE t4_stat SET value = X'C03EC0B204C0A60800' WHERE id=0;
|
|
}
|
|
do_catchsql_test 4.4 {
|
|
SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"'
|
|
} {1 {database disk image is malformed}}
|
|
do_execsql_test 4.5 {
|
|
UPDATE t4_stat SET value = X'00C03EC0B204C0A608' WHERE id=0;
|
|
}
|
|
do_catchsql_test 4.6 {
|
|
SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"'
|
|
} {1 {database disk image is malformed}}
|
|
}
|
|
|
|
#-------------------------------------------------------------------------
|
|
#
|
|
reset_db
|
|
do_execsql_test 5.0 {
|
|
CREATE VIRTUAL TABLE t5 USING fts4;
|
|
INSERT INTO t5 VALUES('a x x x x b x x x x c');
|
|
INSERT INTO t5 VALUES('a x x x x b x x x x c');
|
|
INSERT INTO t5 VALUES('a x x x x b x x x x c');
|
|
}
|
|
do_execsql_test 5.1 {
|
|
SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/4 b NEAR/4 c'
|
|
} {1 2 3}
|
|
do_execsql_test 5.2 {
|
|
SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/3 b NEAR/4 c'
|
|
} {}
|
|
do_execsql_test 5.3 {
|
|
SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/4 b NEAR/3 c'
|
|
} {}
|
|
do_execsql_test 5.4 {
|
|
SELECT rowid FROM t5 WHERE t5 MATCH 'y NEAR/4 b NEAR/4 c'
|
|
} {}
|
|
do_execsql_test 5.5 {
|
|
SELECT rowid FROM t5 WHERE t5 MATCH 'x OR a NEAR/3 b NEAR/3 c'
|
|
} {1 2 3}
|
|
do_execsql_test 5.5 {
|
|
SELECT rowid FROM t5 WHERE t5 MATCH 'x OR y NEAR/3 b NEAR/3 c'
|
|
} {1 2 3}
|
|
|
|
#-------------------------------------------------------------------------
|
|
#
|
|
reset_db
|
|
do_execsql_test 6.0 {
|
|
CREATE VIRTUAL TABLE t6 USING fts4;
|
|
|
|
BEGIN;
|
|
WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000)
|
|
INSERT INTO t6 SELECT 'x x x x x x x x x x x' FROM s;
|
|
|
|
INSERT INTO t6 VALUES('x x x x x x x x x x x A');
|
|
INSERT INTO t6 VALUES('x x x x x x x x x x x B');
|
|
INSERT INTO t6 VALUES('x x x x x x x x x x x A');
|
|
INSERT INTO t6 VALUES('x x x x x x x x x x x B');
|
|
|
|
WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000)
|
|
INSERT INTO t6 SELECT 'x x x x x x x x x x x' FROM s;
|
|
COMMIT;
|
|
}
|
|
do_execsql_test 6.1 {
|
|
SELECT rowid FROM t6 WHERE t6 MATCH 'b OR "x a"'
|
|
} {50001 50002 50003 50004}
|
|
|
|
|
|
finish_test
|