summaryrefslogtreecommitdiffstats
path: root/test/fts3misc.test
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--test/fts3misc.test326
1 files changed, 326 insertions, 0 deletions
diff --git a/test/fts3misc.test b/test/fts3misc.test
new file mode 100644
index 0000000..a1bec42
--- /dev/null
+++ b/test/fts3misc.test
@@ -0,0 +1,326 @@
+# 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'}
+ sqlite3_db_config db DEFENSIVE 0
+ 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}
+
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 7.0 {
+ CREATE VIRTUAL TABLE vt0 USING fts3(c0);
+ INSERT INTO vt0 VALUES (x'00');
+}
+do_execsql_test 7.1 {
+ INSERT INTO vt0(vt0) VALUES('integrity-check');
+}
+
+#-------------------------------------------------------------------------
+# Ticket [8a6fa2bb].
+#
+reset_db
+do_execsql_test 7.0.1 {
+ CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=DESC);
+ INSERT INTO vt0(c0) VALUES (0), (0);
+}
+do_execsql_test 7.0.2 {
+ INSERT INTO vt0(vt0) VALUES('integrity-check');
+}
+reset_db
+do_execsql_test 7.1.1 {
+ CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=ASC);
+ INSERT INTO vt0(c0) VALUES (0), (0);
+}
+do_execsql_test 7.1.2 {
+ INSERT INTO vt0(vt0) VALUES('integrity-check');
+}
+do_execsql_test 7.2.1 {
+ CREATE VIRTUAL TABLE ft USING fts4(c0, c1, order=DESC, prefix=1);
+ INSERT INTO ft VALUES('a b c d', 'hello world');
+ INSERT INTO ft VALUES('negative', 'positive');
+ INSERT INTO ft VALUES('hello world', 'a b c d');
+}
+do_execsql_test 7.2.2 {
+ INSERT INTO vt0(vt0) VALUES('integrity-check');
+}
+
+#-------------------------------------------------------------------------
+# Ticket [745f1abc].
+#
+reset_db
+do_execsql_test 8.1 {
+ CREATE VIRTUAL TABLE vt0 USING fts4(c0, prefix=1);
+}
+do_execsql_test 8.2 {
+ BEGIN;
+ INSERT INTO vt0 VALUES (0);
+ INSERT INTO vt0(vt0) VALUES('optimize');
+ COMMIT;
+}
+do_execsql_test 8.3 {
+ INSERT INTO vt0(vt0) VALUES('integrity-check');
+}
+
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 9.0 {
+ CREATE VIRTUAL TABLE t1 using fts4(mailcontent);
+ insert into t1(rowid, mailcontent) values
+ (-4764623217061966105, 'we are going to upgrade'),
+ (8324454597464624651, 'we are going to upgrade');
+}
+
+do_execsql_test 9.1 {
+ INSERT INTO t1(t1) VALUES('integrity-check');
+}
+
+do_execsql_test 9.2 {
+ SELECT rowid FROM t1 WHERE t1 MATCH 'upgrade';
+} {
+ -4764623217061966105 8324454597464624651
+}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 10.0 {
+ CREATE VIRTUAL TABLE f USING fts3(a,b);
+ CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB);
+ INSERT INTO f_stat VALUES (1,x'3b3b3b3b3b3b3b28ffffffffffffffffff1807f9073481f1d43bc93b3b3b3b3b3b3b3b3b3b18073b3b3b3b3b3b3b9b003b');
+} {}
+
+do_catchsql_test 10.1 {
+ INSERT INTO f(f) VALUES ('merge=69,59');
+} {1 {database disk image is malformed}}
+
+#-------------------------------------------------------------------------
+do_execsql_test 11.0 {
+ CREATE VIRTUAL TABLE xyz USING fts3();
+}
+do_execsql_test 11.1 {
+ SELECT * FROM xyz WHERE xyz MATCH 'a NEAR/4294836224 a';
+}
+
+finish_test