blob: 7d5ae991f70da1ae8f9d63834253ef6f42ae49a4 [file] [log] [blame]
dane61fc3b2009-12-20 15:00:19 +00001# 2009 December 20
2#
3# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
5#
6# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12# This file contains tests of fts3 queries that have been useful during
13# the development process as well as some that have been useful in tracking
14# down bugs. They are not focused on any particular functionality.
15#
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
20# If this build does not include FTS3, skip the tests in this file.
21#
22ifcapable !fts3 { finish_test ; return }
danef378022010-05-04 11:06:03 +000023source $testdir/malloc_common.tcl
dane61fc3b2009-12-20 15:00:19 +000024source $testdir/fts3_common.tcl
25set DO_MALLOC_TEST 0
26
danddf80eb2010-10-25 12:47:43 +000027set testprefix fts3query
28
dane61fc3b2009-12-20 15:00:19 +000029do_test fts3query-1.1 {
30 execsql {
31 CREATE VIRTUAL TABLE t1 USING fts3(x);
32 BEGIN;
33 INSERT INTO t1 VALUES('The source code for SQLite is in the public');
34 }
35} {}
36
37do_select_test fts3query-1.2 {
38 SELECT * FROM t1;
39} {{The source code for SQLite is in the public}}
40do_select_test fts3query-1.3 {
41 SELECT * FROM t1 WHERE t1 MATCH 'sqlite'
42} {{The source code for SQLite is in the public}}
43
44do_test fts3query-1.4 { execsql {COMMIT} } {}
45
46do_select_test fts3query-1.5 {
47 SELECT * FROM t1;
48} {{The source code for SQLite is in the public}}
49do_select_test fts3query-1.6 {
50 SELECT * FROM t1 WHERE t1 MATCH 'sqlite'
51} {{The source code for SQLite is in the public}}
52
53
54set sqlite_fts3_enable_parentheses 1
55do_test fts3query-2.1 {
56 execsql {
57 CREATE VIRTUAL TABLE zoink USING fts3;
58 INSERT INTO zoink VALUES('The apple falls far from the tree');
59 }
60} {}
61do_test fts3query-2.2 {
62 execsql {
63 SELECT docid FROM zoink WHERE zoink MATCH '(apple oranges) AND apple'
64 }
65} {}
66do_test fts3query-2.3 {
67 execsql {
68 SELECT docid FROM zoink WHERE zoink MATCH 'apple AND (oranges apple)'
69 }
70} {}
71set sqlite_fts3_enable_parentheses 0
72
73do_test fts3query-3.1 {
74 execsql {
75 CREATE VIRTUAL TABLE foobar using FTS3(description, tokenize porter);
76 INSERT INTO foobar (description) values ('
77 Filed under: Emerging Technologies, EV/Plug-in, Hybrid, Chevrolet, GM,
78 ZENN 2011 Chevy Volt - Click above for high-res image gallery There are
79 16 days left in the month of December. Besides being time for most
80 Americans to kick their Christmas shopping sessions into high gear and
81 start planning their resolutions for 2010, it also means that there''s
82 precious little time for EEStor to "deliver functional technology" to
83 Zenn Motors as promised. Still, the promises held out by the secretive
84 company are too great for us to forget about entirely. We''d love for
85 EEStor''s claims to be independently verified and proven accurate, as
86 would just about anyone else looking to break free of petroleum in fav
87 ');
88 }
89} {}
90
91do_test fts3query-3.2 {
92 execsql { SELECT docid FROM foobar WHERE description MATCH '"high sp d"' }
93} {}
94
dan3540c1f2009-12-22 18:56:19 +000095proc mit {blob} {
96 set scan(littleEndian) i*
97 set scan(bigEndian) I*
98 binary scan $blob $scan($::tcl_platform(byteOrder)) r
99 return $r
100}
101db func mit mit
102
103do_test fts3query-3.3 {
104 execsql { SELECT mit(matchinfo(foobar)) FROM foobar WHERE foobar MATCH 'the' }
danf596da52010-01-12 17:57:30 +0000105} {{1 1 3 3 1}}
dan3540c1f2009-12-22 18:56:19 +0000106
danc26c0042010-03-27 09:44:42 +0000107# The following tests check that ticket 775b39dd3c has been fixed.
108#
danc26c0042010-03-27 09:44:42 +0000109do_test fts3query-4.1 {
110 execsql {
111 DROP TABLE IF EXISTS t1;
112 CREATE TABLE t1(number INTEGER PRIMARY KEY, date);
113 CREATE INDEX i1 ON t1(date);
114 CREATE VIRTUAL TABLE ft USING fts3(title);
115 CREATE TABLE bt(title);
116 }
117} {}
dan39854792010-11-15 16:12:58 +0000118do_eqp_test fts3query-4.2 {
119 SELECT t1.number FROM t1, ft WHERE t1.number=ft.rowid ORDER BY t1.date
120} {
drh5822d6f2013-06-10 23:30:09 +0000121 0 0 0 {SCAN TABLE t1 USING COVERING INDEX i1}
122 0 1 1 {SCAN TABLE ft VIRTUAL TABLE INDEX 1:}
dan39854792010-11-15 16:12:58 +0000123}
124do_eqp_test fts3query-4.3 {
125 SELECT t1.number FROM ft, t1 WHERE t1.number=ft.rowid ORDER BY t1.date
126} {
drh5822d6f2013-06-10 23:30:09 +0000127 0 0 1 {SCAN TABLE t1 USING COVERING INDEX i1}
128 0 1 0 {SCAN TABLE ft VIRTUAL TABLE INDEX 1:}
dan39854792010-11-15 16:12:58 +0000129}
130do_eqp_test fts3query-4.4 {
131 SELECT t1.number FROM t1, bt WHERE t1.number=bt.rowid ORDER BY t1.date
132} {
drh5822d6f2013-06-10 23:30:09 +0000133 0 0 0 {SCAN TABLE t1 USING COVERING INDEX i1}
134 0 1 1 {SEARCH TABLE bt USING INTEGER PRIMARY KEY (rowid=?)}
dan39854792010-11-15 16:12:58 +0000135}
136do_eqp_test fts3query-4.5 {
137 SELECT t1.number FROM bt, t1 WHERE t1.number=bt.rowid ORDER BY t1.date
138} {
drh5822d6f2013-06-10 23:30:09 +0000139 0 0 1 {SCAN TABLE t1 USING COVERING INDEX i1}
140 0 1 0 {SEARCH TABLE bt USING INTEGER PRIMARY KEY (rowid=?)}
dan39854792010-11-15 16:12:58 +0000141}
danc26c0042010-03-27 09:44:42 +0000142
143
danddf80eb2010-10-25 12:47:43 +0000144# Test that calling matchinfo() with the wrong number of arguments, or with
145# an invalid argument returns an error.
146#
147do_execsql_test 5.1 {
148 CREATE VIRTUAL TABLE t2 USING FTS4;
149 INSERT INTO t2 VALUES('it was the first time in history');
150}
151do_select_tests 5.2 -errorformat {
152 wrong number of arguments to function %s()
153} {
154 1 "SELECT matchinfo() FROM t2 WHERE t2 MATCH 'history'" matchinfo
danddf80eb2010-10-25 12:47:43 +0000155 3 "SELECT snippet(t2, 1, 2, 3, 4, 5, 6) FROM t2 WHERE t2 MATCH 'history'"
156 snippet
157}
158do_select_tests 5.3 -errorformat {
159 illegal first argument to %s
160} {
161 1 "SELECT matchinfo(content) FROM t2 WHERE t2 MATCH 'history'" matchinfo
162 2 "SELECT offsets(content) FROM t2 WHERE t2 MATCH 'history'" offsets
163 3 "SELECT snippet(content) FROM t2 WHERE t2 MATCH 'history'" snippet
164 4 "SELECT optimize(content) FROM t2 WHERE t2 MATCH 'history'" optimize
165}
166do_execsql_test 5.4.0 { UPDATE t2_content SET c0content = X'1234' }
167do_select_tests 5.4 -errorformat {
168 illegal first argument to %s
169} {
170 1 "SELECT matchinfo(content) FROM t2 WHERE t2 MATCH 'history'" matchinfo
171 2 "SELECT offsets(content) FROM t2 WHERE t2 MATCH 'history'" offsets
172 3 "SELECT snippet(content) FROM t2 WHERE t2 MATCH 'history'" snippet
173 4 "SELECT optimize(content) FROM t2 WHERE t2 MATCH 'history'" optimize
174}
dan1e66e402010-11-23 19:16:47 +0000175do_catchsql_test 5.5.1 {
dan99eaf392015-05-05 20:39:53 +0000176 SELECT matchinfo(t2, 'abcd') FROM t2 WHERE t2 MATCH 'history'
177} {1 {unrecognized matchinfo request: d}}
dan1e66e402010-11-23 19:16:47 +0000178
danddf80eb2010-10-25 12:47:43 +0000179do_execsql_test 5.5 { DROP TABLE t2 }
180
dan1e66e402010-11-23 19:16:47 +0000181
danddf80eb2010-10-25 12:47:43 +0000182# Test the snippet() function with 1 to 6 arguments.
183#
184do_execsql_test 6.1 {
185 CREATE VIRTUAL TABLE t3 USING FTS4(a, b);
186 INSERT INTO t3 VALUES('no gestures', 'another intriguing discovery by observing the hand gestures (called beats) people make while speaking. Research has shown that such gestures do more than add visual emphasis to our words (many people gesture while they''re on the telephone, for example); it seems they actually help our brains find words');
187}
danddf80eb2010-10-25 12:47:43 +0000188do_select_tests 6.2 {
189 1 "SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'gestures'"
190 {{<b>...</b>hand <b>gestures</b> (called beats) people make while speaking. Research has shown that such <b>gestures</b> do<b>...</b>}}
191
192 2 "SELECT snippet(t3, 'XXX') FROM t3 WHERE t3 MATCH 'gestures'"
193 {{<b>...</b>hand XXXgestures</b> (called beats) people make while speaking. Research has shown that such XXXgestures</b> do<b>...</b>}}
194
195 3 "SELECT snippet(t3, 'XXX', 'YYY') FROM t3 WHERE t3 MATCH 'gestures'"
196 {{<b>...</b>hand XXXgesturesYYY (called beats) people make while speaking. Research has shown that such XXXgesturesYYY do<b>...</b>}}
197
198 4 "SELECT snippet(t3, 'XXX', 'YYY', 'ZZZ') FROM t3 WHERE t3 MATCH 'gestures'"
199 {{ZZZhand XXXgesturesYYY (called beats) people make while speaking. Research has shown that such XXXgesturesYYY doZZZ}}
200
201 5 "SELECT snippet(t3, 'XXX', 'YYY', 'ZZZ', 1) FROM t3 WHERE t3 MATCH 'gestures'"
202 {{ZZZhand XXXgesturesYYY (called beats) people make while speaking. Research has shown that such XXXgesturesYYY doZZZ}}
203
204 6 "SELECT snippet(t3, 'XXX', 'YYY', 'ZZZ', 0) FROM t3 WHERE t3 MATCH 'gestures'"
205 {{no XXXgesturesYYY}}
206
207 7 "SELECT snippet(t3, 'XXX', 'YYY', 'ZZZ', 1, 5) FROM t3 WHERE t3 MATCH 'gestures'"
208 {{ZZZthe hand XXXgesturesYYY (called beatsZZZ}}
209}
210
dan88392bf2015-01-29 11:52:22 +0000211# Test some range queries on the rowid field.
212#
213do_execsql_test 7.1 {
214 CREATE VIRTUAL TABLE ft4 USING fts4(x);
215 CREATE TABLE t4(x);
216}
217
218set SMALLINT -9223372036854775808
219set LARGEINT 9223372036854775807
220do_test 7.2 {
221 db transaction {
222 foreach {iFirst nEntry} [subst {
223 0 100
224 $SMALLINT 100
225 [expr $LARGEINT - 99] 100
226 }] {
227 for {set i 0} {$i < $nEntry} {incr i} {
228 set iRowid [expr $i + $iFirst]
229 execsql {
230 INSERT INTO ft4(rowid, x) VALUES($iRowid, 'x y z');
231 INSERT INTO t4(rowid, x) VALUES($iRowid, 'x y z');
232 }
233 }
234 }
235 }
236} {}
237
238foreach {tn iFirst iLast} [subst {
239 1 5 10
240 2 $SMALLINT [expr $SMALLINT+5]
241 3 $SMALLINT [expr $SMALLINT+50]
242 4 [expr $LARGEINT-5] $LARGEINT
243 5 $LARGEINT $LARGEINT
244 6 $SMALLINT $LARGEINT
245 7 $SMALLINT $SMALLINT
246 8 $LARGEINT $SMALLINT
247}] {
248 set res [db eval {
249 SELECT rowid FROM t4 WHERE rowid BETWEEN $iFirst AND $iLast
250 } ]
251
252 do_execsql_test 7.2.$tn.1.[llength $res] {
253 SELECT rowid FROM ft4 WHERE rowid BETWEEN $iFirst AND $iLast
254 } $res
drh07b38952015-03-16 17:07:09 +0000255 set res [db eval {
256 SELECT rowid FROM t4 WHERE rowid BETWEEN $iFirst AND $iLast
257 ORDER BY +rowid DESC
258 } ]
dan88392bf2015-01-29 11:52:22 +0000259 do_execsql_test 7.2.$tn.2.[llength $res] {
260 SELECT rowid FROM ft4 WHERE rowid BETWEEN $iFirst AND $iLast
261 ORDER BY rowid DESC
drh07b38952015-03-16 17:07:09 +0000262 } $res
dan88392bf2015-01-29 11:52:22 +0000263}
264
265foreach ii [db eval {SELECT rowid FROM t4}] {
266 set res1 [db eval {SELECT rowid FROM t4 WHERE rowid > $ii}]
267 set res2 [db eval {SELECT rowid FROM t4 WHERE rowid < $ii}]
drh07b38952015-03-16 17:07:09 +0000268 set res1s [db eval {SELECT rowid FROM t4 WHERE rowid > $ii ORDER BY +rowid DESC}]
269 set res2s [db eval {SELECT rowid FROM t4 WHERE rowid < $ii ORDER BY +rowid DESC}]
dan88392bf2015-01-29 11:52:22 +0000270
271 do_execsql_test 7.3.$ii.1 {
272 SELECT rowid FROM ft4 WHERE rowid > $ii
273 } $res1
274
275 do_execsql_test 7.3.$ii.2 {
276 SELECT rowid FROM ft4 WHERE rowid < $ii
277 } $res2
278
279 do_execsql_test 7.3.$ii.3 {
280 SELECT rowid FROM ft4 WHERE rowid > $ii ORDER BY rowid DESC
drh07b38952015-03-16 17:07:09 +0000281 } $res1s
dan88392bf2015-01-29 11:52:22 +0000282
283 do_execsql_test 7.3.$ii.4 {
284 SELECT rowid FROM ft4 WHERE rowid < $ii ORDER BY rowid DESC
drh07b38952015-03-16 17:07:09 +0000285 } $res2s
dan88392bf2015-01-29 11:52:22 +0000286}
dane25ac092010-10-25 19:01:25 +0000287
dane61fc3b2009-12-20 15:00:19 +0000288finish_test