xref: /sqlite-3.40.0/test/fts3misc.test (revision fc7f3174)
1624edacfSdan# 2017 March 22
2624edacfSdan#
3624edacfSdan# The author disclaims copyright to this source code.  In place of
4624edacfSdan# a legal notice, here is a blessing:
5624edacfSdan#
6624edacfSdan#    May you do good and not evil.
7624edacfSdan#    May you find forgiveness for yourself and forgive others.
8624edacfSdan#    May you share freely, never taking more than you give.
9624edacfSdan#
10624edacfSdan#*************************************************************************
11624edacfSdan# This file implements regression tests for SQLite library.  The
12624edacfSdan# focus of this script is testing the FTS3 module.
13624edacfSdan#
14624edacfSdan
15624edacfSdanset testdir [file dirname $argv0]
16624edacfSdansource $testdir/tester.tcl
17624edacfSdanset testprefix fts3misc
18624edacfSdan
19624edacfSdan# If SQLITE_ENABLE_FTS3 is defined, omit this file.
20624edacfSdanifcapable !fts3 {
21624edacfSdan  finish_test
22624edacfSdan  return
23624edacfSdan}
24624edacfSdan
25624edacfSdan#-------------------------------------------------------------------------
26624edacfSdan# A self-join.
27624edacfSdan#
28624edacfSdando_execsql_test 1.0 {
29624edacfSdan  CREATE VIRTUAL TABLE t1 USING fts3(a, b);
30624edacfSdan  INSERT INTO t1 VALUES('one', 'i');
31624edacfSdan  INSERT INTO t1 VALUES('one', 'ii');
32624edacfSdan  INSERT INTO t1 VALUES('two', 'i');
33624edacfSdan  INSERT INTO t1 VALUES('two', 'ii');
34624edacfSdan}
35624edacfSdan
36624edacfSdando_execsql_test 1.1 {
37624edacfSdan  SELECT a.a, b.b FROM t1 a, t1 b WHERE a.t1 MATCH 'two' AND b.t1 MATCH 'i'
38624edacfSdan} {two i two i two i two i}
39624edacfSdan
40624edacfSdan#-------------------------------------------------------------------------
41624edacfSdan# FTS tables with 128 or more columns.
42624edacfSdan#
43624edacfSdanproc v1 {v} {
44624edacfSdan  set vector [list a b c d e f g h]
45624edacfSdan  set res [list]
46624edacfSdan  for {set i 0} {$i<8} {incr i} {
47624edacfSdan    if {$v & (1 << $i)} { lappend res [lindex $vector $i] }
48624edacfSdan  }
49624edacfSdan  set res
50624edacfSdan}
51624edacfSdanproc v2 {v} {
52624edacfSdan  set vector [list d e f g h i j k]
53624edacfSdan  set res [list]
54624edacfSdan  for {set i 0} {$i<8} {incr i} {
55624edacfSdan    if {$v & (1 << $i)} { lappend res [lindex $vector $i] }
56624edacfSdan  }
57624edacfSdan  set res
58624edacfSdan}
59624edacfSdandb func v1 v1
60624edacfSdandb func v2 v2
61624edacfSdan
62624edacfSdando_test 2.0 {
63624edacfSdan  set cols [list]
64624edacfSdan  for {set i 0} {$i<200} {incr i} {
65624edacfSdan    lappend cols "c$i"
66624edacfSdan  }
67624edacfSdan  execsql "CREATE VIRTUAL TABLE t2 USING fts3([join $cols ,])"
68624edacfSdan  execsql {
69624edacfSdan    WITH data(i) AS (
70624edacfSdan      SELECT 1 UNION ALL SELECT i+1 FROM data WHERE i<200
71624edacfSdan    )
72624edacfSdan    INSERT INTO t2(c198, c199) SELECT v1(i), v2(i) FROM data;
73624edacfSdan  }
74624edacfSdan} {}
75624edacfSdando_execsql_test 2.1 {
76624edacfSdan  SELECT rowid FROM t2 WHERE t2 MATCH '"a b c"'
77624edacfSdan} {
78624edacfSdan  7 15 23 31 39 47 55 63 71 79 87 95 103 111
79624edacfSdan  119 127 135 143 151 159 167 175 183 191 199
80624edacfSdan}
81624edacfSdando_execsql_test 2.2 {
82624edacfSdan  SELECT rowid FROM t2 WHERE t2 MATCH '"g h i"'
83624edacfSdan} {
84624edacfSdan  56 57 58 59 60 61 62 63 120 121 122 123 124
85624edacfSdan  125 126 127 184 185 186 187 188 189 190 191
86624edacfSdan}
87624edacfSdando_execsql_test 2.3 {
88624edacfSdan  SELECT rowid FROM t2 WHERE t2 MATCH '"i h"'
89624edacfSdan} {
90624edacfSdan}
91624edacfSdando_execsql_test 2.4 {
92624edacfSdan  SELECT rowid FROM t2 WHERE t2 MATCH '"f e"'
93624edacfSdan} {
94624edacfSdan}
95624edacfSdando_execsql_test 2.5 {
96624edacfSdan  SELECT rowid FROM t2 WHERE t2 MATCH '"e f"'
97624edacfSdan} {
98624edacfSdan  6 7 14 15 22 23 30 31 38 39 46 47 48 49 50 51 52 53 54 55 56
99624edacfSdan  57 58 59 60 61 62 63 70 71 78 79 86 87 94 95 102 103 110
100624edacfSdan  111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
101624edacfSdan  134 135 142 143 150 151 158 159 166 167 174 175 176 177 178 179 180
102624edacfSdan  181 182 183 184 185 186 187 188 189 190 191 198 199
103624edacfSdan}
104624edacfSdan
105a059e99cSdan#-------------------------------------------------------------------------
106624edacfSdan# Range constraints on the docid using non-integer values.
107624edacfSdan#
108624edacfSdando_execsql_test 2.6 {
109624edacfSdan  SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN NULL AND 45;
110624edacfSdan} {}
111624edacfSdando_execsql_test 2.7 {
112624edacfSdan  SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN 11.5 AND 48.2;
113624edacfSdan} {
114624edacfSdan  14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
115624edacfSdan  29 30 31 34 35 38 39 42 43 46 47 48
116624edacfSdan}
117624edacfSdando_execsql_test 2.8 {
118624edacfSdan  SELECT rowid FROM t2 WHERE t2 MATCH 'e' AND rowid BETWEEN '11.5' AND '48.2';
119624edacfSdan} {
120624edacfSdan  14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
121624edacfSdan  29 30 31 34 35 38 39 42 43 46 47 48
122624edacfSdan}
123624edacfSdan
124a059e99cSdan#-------------------------------------------------------------------------
125a059e99cSdan# Phrase query tests.
126a059e99cSdan#
127a059e99cSdando_execsql_test 3.1.1 {
128a059e99cSdan  CREATE VIRTUAL TABLE t3 USING fts3;
129a059e99cSdan  INSERT INTO t3 VALUES('a b c');
130a059e99cSdan  INSERT INTO t3 VALUES('d e f');
131a059e99cSdan  INSERT INTO t3 VALUES('a b d');
132a059e99cSdan  INSERT INTO t3 VALUES('1 2 3 4 5 6 7 8 9 10 11');
133a059e99cSdan}
134a059e99cSdando_execsql_test 3.1.2 {
135a059e99cSdan  SELECT * FROM t3 WHERE t3 MATCH '"a b x y"' ORDER BY docid DESC
136a059e99cSdan}
137a059e99cSdando_execsql_test 3.1.3 {
138a059e99cSdan  SELECT * FROM t3 WHERE t3 MATCH '"a b c" OR "a b x y"' ORDER BY docid DESC
139a059e99cSdan} {{a b c}}
140a059e99cSdando_execsql_test 3.1.4 {
141a059e99cSdan  SELECT * FROM t3 WHERE t3 MATCH '"a* b* x* a*"'
142a059e99cSdan}
143a059e99cSdando_execsql_test 3.1.5 {
144a059e99cSdan  SELECT rowid FROM t3 WHERE t3 MATCH '"2 3 4 5 6 7 8 9"'
145a059e99cSdan} {4}
146a059e99cSdan
147a059e99cSdan#-------------------------------------------------------------------------
148a059e99cSdan#
149a059e99cSdanreset_db
1507b458519Sdanifcapable fts4_deferred {
151a059e99cSdan  do_execsql_test 4.0 {
152a059e99cSdan    PRAGMA page_size = 512;
153a059e99cSdan    CREATE VIRTUAL TABLE t4 USING fts4;
154a059e99cSdan    WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<8000 )
155a059e99cSdan    INSERT INTO t4 SELECT 'a b c a b c a b c' FROM s;
156a059e99cSdan  }
157a059e99cSdan  do_execsql_test 4.1 {
158a059e99cSdan    SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"'
159a059e99cSdan  } {8000}
160a059e99cSdan  do_execsql_test 4.2 {
161a059e99cSdan    SELECT quote(value) from t4_stat where id=0
162a059e99cSdan  } {X'C03EC0B204C0A608'}
1630f0d3ddfSdrh  sqlite3_db_config db DEFENSIVE 0
164a059e99cSdan  do_execsql_test 4.3 {
165a059e99cSdan    UPDATE t4_stat SET value = X'C03EC0B204C0A60800' WHERE id=0;
166a059e99cSdan  }
167a059e99cSdan  do_catchsql_test 4.4 {
168a059e99cSdan    SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"'
169a059e99cSdan  } {1 {database disk image is malformed}}
170a059e99cSdan  do_execsql_test 4.5 {
171a059e99cSdan    UPDATE t4_stat SET value = X'00C03EC0B204C0A608' WHERE id=0;
172a059e99cSdan  }
173a059e99cSdan  do_catchsql_test 4.6 {
174a059e99cSdan    SELECT count(*) FROM t4 WHERE t4 MATCH '"a b c" OR "c a b"'
175a059e99cSdan  } {1 {database disk image is malformed}}
1767b458519Sdan}
177a059e99cSdan
178dc62dacaSdan#-------------------------------------------------------------------------
179dc62dacaSdan#
180dc62dacaSdanreset_db
181dc62dacaSdando_execsql_test 5.0 {
182dc62dacaSdan  CREATE VIRTUAL TABLE t5 USING fts4;
183dc62dacaSdan  INSERT INTO t5 VALUES('a x x x x b x x x x c');
184dc62dacaSdan  INSERT INTO t5 VALUES('a x x x x b x x x x c');
185dc62dacaSdan  INSERT INTO t5 VALUES('a x x x x b x x x x c');
186dc62dacaSdan}
187dc62dacaSdando_execsql_test 5.1 {
188dc62dacaSdan  SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/4 b NEAR/4 c'
189dc62dacaSdan} {1 2 3}
190dc62dacaSdando_execsql_test 5.2 {
191dc62dacaSdan  SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/3 b NEAR/4 c'
192dc62dacaSdan} {}
193dc62dacaSdando_execsql_test 5.3 {
194dc62dacaSdan  SELECT rowid FROM t5 WHERE t5 MATCH 'a NEAR/4 b NEAR/3 c'
195dc62dacaSdan} {}
196dc62dacaSdando_execsql_test 5.4 {
197dc62dacaSdan  SELECT rowid FROM t5 WHERE t5 MATCH 'y NEAR/4 b NEAR/4 c'
198dc62dacaSdan} {}
199dc62dacaSdando_execsql_test 5.5 {
200dc62dacaSdan  SELECT rowid FROM t5 WHERE t5 MATCH 'x OR a NEAR/3 b NEAR/3 c'
201dc62dacaSdan} {1 2 3}
202dc62dacaSdando_execsql_test 5.5 {
203dc62dacaSdan  SELECT rowid FROM t5 WHERE t5 MATCH 'x OR y NEAR/3 b NEAR/3 c'
204dc62dacaSdan} {1 2 3}
205dc62dacaSdan
206dc62dacaSdan#-------------------------------------------------------------------------
207dc62dacaSdan#
208dc62dacaSdanreset_db
209dc62dacaSdando_execsql_test 6.0 {
210dc62dacaSdan  CREATE VIRTUAL TABLE t6 USING fts4;
211dc62dacaSdan
212dc62dacaSdan  BEGIN;
213dc62dacaSdan  WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000)
214dc62dacaSdan    INSERT INTO t6 SELECT 'x x x x x x x x x x x' FROM s;
215dc62dacaSdan
216dc62dacaSdan  INSERT INTO t6 VALUES('x x x x x x x x x x x A');
217dc62dacaSdan  INSERT INTO t6 VALUES('x x x x x x x x x x x B');
218dc62dacaSdan  INSERT INTO t6 VALUES('x x x x x x x x x x x A');
219dc62dacaSdan  INSERT INTO t6 VALUES('x x x x x x x x x x x B');
220dc62dacaSdan
221dc62dacaSdan  WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000)
222dc62dacaSdan    INSERT INTO t6 SELECT 'x x x x x x x x x x x' FROM s;
223dc62dacaSdan  COMMIT;
224dc62dacaSdan}
225dc62dacaSdando_execsql_test 6.1 {
226dc62dacaSdan  SELECT rowid FROM t6 WHERE t6 MATCH 'b OR "x a"'
227dc62dacaSdan} {50001 50002 50003 50004}
228dc62dacaSdan
229cd790109Sdan#-------------------------------------------------------------------------
230cd790109Sdan#
231cd790109Sdanreset_db
232cd790109Sdando_execsql_test 7.0 {
233cd790109Sdan  CREATE VIRTUAL TABLE vt0 USING fts3(c0);
234cd790109Sdan  INSERT INTO vt0 VALUES (x'00');
235cd790109Sdan}
236cd790109Sdando_execsql_test 7.1 {
237cd790109Sdan  INSERT INTO vt0(vt0) VALUES('integrity-check');
238cd790109Sdan}
239cd790109Sdan
2409613c9f4Sdan#-------------------------------------------------------------------------
2418b4d0e2cSdan# Ticket [8a6fa2bb].
2429613c9f4Sdan#
2439613c9f4Sdanreset_db
2449613c9f4Sdando_execsql_test 7.0.1 {
2459613c9f4Sdan  CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=DESC);
2469613c9f4Sdan  INSERT INTO vt0(c0) VALUES (0), (0);
2479613c9f4Sdan}
2489613c9f4Sdando_execsql_test 7.0.2 {
2499613c9f4Sdan  INSERT INTO vt0(vt0) VALUES('integrity-check');
2509613c9f4Sdan}
2519613c9f4Sdanreset_db
2529613c9f4Sdando_execsql_test 7.1.1 {
2539613c9f4Sdan  CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=ASC);
2549613c9f4Sdan  INSERT INTO vt0(c0) VALUES (0), (0);
2559613c9f4Sdan}
2569613c9f4Sdando_execsql_test 7.1.2 {
2579613c9f4Sdan  INSERT INTO vt0(vt0) VALUES('integrity-check');
2589613c9f4Sdan}
2599613c9f4Sdando_execsql_test 7.2.1 {
2609613c9f4Sdan  CREATE VIRTUAL TABLE ft USING fts4(c0, c1, order=DESC, prefix=1);
2619613c9f4Sdan  INSERT INTO ft VALUES('a b c d', 'hello world');
2629613c9f4Sdan  INSERT INTO ft VALUES('negative', 'positive');
2639613c9f4Sdan  INSERT INTO ft VALUES('hello world', 'a b c d');
2649613c9f4Sdan}
2659613c9f4Sdando_execsql_test 7.2.2 {
2669613c9f4Sdan  INSERT INTO vt0(vt0) VALUES('integrity-check');
2679613c9f4Sdan}
2689613c9f4Sdan
2698b4d0e2cSdan#-------------------------------------------------------------------------
2708b4d0e2cSdan# Ticket [745f1abc].
2718b4d0e2cSdan#
2728b4d0e2cSdanreset_db
2738b4d0e2cSdando_execsql_test 8.1 {
2748b4d0e2cSdan  CREATE VIRTUAL TABLE vt0 USING fts4(c0, prefix=1);
2758b4d0e2cSdan}
2768b4d0e2cSdando_execsql_test 8.2 {
2778b4d0e2cSdan  BEGIN;
2788b4d0e2cSdan    INSERT INTO vt0 VALUES (0);
2798b4d0e2cSdan    INSERT INTO vt0(vt0) VALUES('optimize');
2808b4d0e2cSdan  COMMIT;
2818b4d0e2cSdan}
2828b4d0e2cSdando_execsql_test 8.3 {
2838b4d0e2cSdan  INSERT INTO vt0(vt0) VALUES('integrity-check');
2848b4d0e2cSdan}
285624edacfSdan
2869930cfe8Sdan#-------------------------------------------------------------------------
2879930cfe8Sdan#
2889930cfe8Sdanreset_db
2899930cfe8Sdando_execsql_test 9.0 {
2909930cfe8Sdan  CREATE VIRTUAL TABLE t1 using fts4(mailcontent);
2919930cfe8Sdan  insert into t1(rowid, mailcontent) values
2929930cfe8Sdan      (-4764623217061966105, 'we are going to upgrade'),
2939930cfe8Sdan      (8324454597464624651, 'we are going to upgrade');
2949930cfe8Sdan}
2959930cfe8Sdan
2969930cfe8Sdando_execsql_test 9.1 {
2979930cfe8Sdan  INSERT INTO t1(t1) VALUES('integrity-check');
2989930cfe8Sdan}
2999930cfe8Sdan
3009930cfe8Sdando_execsql_test 9.2 {
3019930cfe8Sdan  SELECT rowid FROM t1 WHERE t1 MATCH 'upgrade';
3029930cfe8Sdan} {
3039930cfe8Sdan  -4764623217061966105 8324454597464624651
3049930cfe8Sdan}
3059930cfe8Sdan
306ec8e689aSdan#-------------------------------------------------------------------------
307ec8e689aSdanreset_db
308ec8e689aSdando_execsql_test 10.0 {
309ec8e689aSdan  CREATE VIRTUAL TABLE f USING fts3(a,b);
310ec8e689aSdan  CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB);
311ec8e689aSdan  INSERT INTO f_stat VALUES (1,x'3b3b3b3b3b3b3b28ffffffffffffffffff1807f9073481f1d43bc93b3b3b3b3b3b3b3b3b3b18073b3b3b3b3b3b3b9b003b');
312ec8e689aSdan} {}
313ec8e689aSdan
314ec8e689aSdando_catchsql_test 10.1 {
315ec8e689aSdan  INSERT INTO f(f) VALUES ('merge=69,59');
316ec8e689aSdan} {1 {database disk image is malformed}}
317ec8e689aSdan
318*fc7f3174Sdan#-------------------------------------------------------------------------
319*fc7f3174Sdando_execsql_test 11.0 {
320*fc7f3174Sdan  CREATE VIRTUAL TABLE xyz USING fts3();
321*fc7f3174Sdan}
322*fc7f3174Sdando_execsql_test 11.1 {
323*fc7f3174Sdan  SELECT * FROM xyz WHERE xyz MATCH 'a NEAR/4294836224 a';
324*fc7f3174Sdan}
325*fc7f3174Sdan
326624edacfSdanfinish_test
327