xref: /sqlite-3.40.0/ext/fts5/test/fts5misc.test (revision 73983658)
1# 2019 September 02
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# This file implements regression tests for SQLite library.  The
12# focus of this script is testing the FTS5 module.
13#
14
15source [file join [file dirname [info script]] fts5_common.tcl]
16set testprefix fts5misc
17
18# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
19ifcapable !fts5 {
20  finish_test
21  return
22}
23
24do_execsql_test 1.0 {
25  CREATE VIRTUAL TABLE t1 USING fts5(a);
26}
27
28do_catchsql_test 1.1.1 {
29  SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*');
30} {1 {unknown special query: }}
31do_catchsql_test 1.1.2 {
32  SELECT a FROM t1
33    WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*'));
34} {1 {unknown special query: }}
35
36do_catchsql_test 1.2.1 {
37  SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*id');
38} {0 {{}}}
39
40do_catchsql_test 1.2.2 {
41  SELECT a FROM t1
42    WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*id'));
43} {0 {}}
44
45do_catchsql_test 1.3.1 {
46  SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*reads');
47} {1 {no such cursor: 1}}
48
49do_catchsql_test 1.3.2 {
50  SELECT a FROM t1
51    WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*reads'));
52} {1 {no such cursor: 1}}
53
54db close
55sqlite3 db test.db
56
57do_catchsql_test 1.3.3 {
58  SELECT a FROM t1
59    WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*reads'));
60} {1 {no such cursor: 1}}
61
62#-------------------------------------------------------------------------
63reset_db
64do_execsql_test 2.0 {
65  CREATE TABLE t0(c0);
66  CREATE VIRTUAL TABLE vt0 USING fts5(c0);
67}
68do_execsql_test 2.1.1 {
69  BEGIN TRANSACTION;
70  INSERT INTO vt0(c0) VALUES ('xyz');
71}
72do_execsql_test 2.1.2 {
73  ALTER TABLE t0 ADD COLUMN c5;
74}
75do_execsql_test 2.1.3 {
76  INSERT INTO vt0(vt0) VALUES('integrity-check');
77}
78do_execsql_test 2.1.4 {
79  INSERT INTO vt0(c0) VALUES ('abc');
80  COMMIT
81}
82do_execsql_test 2.1.5 {
83  INSERT INTO vt0(vt0) VALUES('integrity-check');
84}
85
86reset_db
87do_execsql_test 2.2.1 {
88  CREATE TABLE t0(c0);
89  CREATE VIRTUAL TABLE vt0 USING fts5(c0);
90  BEGIN TRANSACTION;
91  INSERT INTO vt0(c0) VALUES ('xyz');
92}
93
94breakpoint
95do_execsql_test 2.2.2 {
96  ALTER TABLE t0 RENAME TO t1;
97}
98do_execsql_test 2.2.3 {
99  INSERT INTO vt0(vt0) VALUES('integrity-check');
100}
101do_execsql_test 2.2.4 {
102  INSERT INTO vt0(c0) VALUES ('abc');
103  COMMIT;
104}
105do_execsql_test 2.2.5 {
106  INSERT INTO vt0(vt0) VALUES('integrity-check');
107}
108
109#-------------------------------------------------------------------------
110reset_db
111do_execsql_test 3.0 {
112  CREATE VIRTUAL TABLE vt0 USING fts5(a);
113  PRAGMA reverse_unordered_selects = true;
114  INSERT INTO vt0 VALUES('365062398'), (0), (0);
115  INSERT INTO vt0(vt0, rank) VALUES('pgsz', '38');
116}
117do_execsql_test 3.1 {
118  UPDATE vt0 SET a = 399905135; -- unexpected: database disk image is malformed
119}
120do_execsql_test 3.2 {
121  INSERT INTO vt0(vt0) VALUES('integrity-check');
122}
123
124#-------------------------------------------------------------------------
125reset_db
126do_execsql_test 4.0 {
127  CREATE VIRTUAL TABLE vt0 USING fts5(c0);
128  INSERT INTO vt0(c0) VALUES ('xyz');
129}
130
131do_execsql_test 4.1 {
132  BEGIN;
133    INSERT INTO vt0(c0) VALUES ('abc');
134    INSERT INTO vt0(vt0) VALUES('rebuild');
135  COMMIT;
136}
137
138do_execsql_test 4.2 {
139  INSERT INTO vt0(vt0) VALUES('integrity-check');
140}
141
142do_execsql_test 4.3 {
143  BEGIN;
144    INSERT INTO vt0(vt0) VALUES('rebuild');
145    INSERT INTO vt0(vt0) VALUES('rebuild');
146  COMMIT;
147}
148
149do_execsql_test 4.4 {
150  INSERT INTO vt0(vt0) VALUES('integrity-check');
151}
152
153#-------------------------------------------------------------------------
154# Ticket [81a7f7b9].
155#
156reset_db
157do_execsql_test 5.0 {
158  CREATE VIRTUAL TABLE vt0 USING fts5(c0, c1);
159  INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65536');
160  WITH s(i) AS (
161    SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1236
162  )
163  INSERT INTO vt0(c0) SELECT '0' FROM s;
164} {}
165
166do_execsql_test 5.1 {
167  UPDATE vt0 SET c1 = 'T,D&p^y/7#3*v<b<4j7|f';
168}
169
170do_execsql_test 5.2 {
171  INSERT INTO vt0(vt0) VALUES('integrity-check');
172}
173
174do_catchsql_test 5.3 {
175  INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65537');
176} {1 {SQL logic error}}
177
178#-------------------------------------------------------------------------
179# Ticket [d392017c].
180#
181reset_db
182do_execsql_test 6.0 {
183  CREATE VIRTUAL TABLE vt0 USING fts5(c0);
184  WITH s(i) AS (
185    SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10000
186  )
187  INSERT INTO vt0(c0) SELECT '0' FROM s;
188  INSERT INTO vt0(vt0, rank) VALUES('crisismerge', 2000);
189  INSERT INTO vt0(vt0, rank) VALUES('automerge', 0);
190} {}
191
192do_execsql_test 6.1 {
193  INSERT INTO vt0(vt0) VALUES('rebuild');
194}
195
196#-------------------------------------------------------------------------
197#
198reset_db
199do_execsql_test 7.0 {
200  CREATE VIRTUAL TABLE t1 USING fts5(x);
201  INSERT INTO t1(rowid, x) VALUES(1, 'hello world');
202  INSERT INTO t1(rowid, x) VALUES(2, 'well said');
203  INSERT INTO t1(rowid, x) VALUES(3, 'hello said');
204  INSERT INTO t1(rowid, x) VALUES(4, 'well world');
205
206  CREATE TABLE t2 (a, b);
207  INSERT INTO t2 VALUES(1, 'hello');
208  INSERT INTO t2 VALUES(2, 'world');
209  INSERT INTO t2 VALUES(3, 'said');
210  INSERT INTO t2 VALUES(4, 'hello');
211}
212
213do_execsql_test 7.1 {
214  SELECT rowid FROM t1 WHERE (rowid, x) IN (SELECT a, b FROM t2);
215}
216
217do_execsql_test 7.2 {
218  SELECT rowid FROM t1 WHERE rowid=2 AND t1 = 'hello';
219}
220
221#-------------------------------------------------------------------------
222#
223reset_db
224do_execsql_test 8.0 {
225  CREATE VIRTUAL TABLE vt0 USING fts5(c0, tokenize = "ascii", prefix = 1);
226  INSERT INTO vt0(c0) VALUES (x'd1');
227}
228
229do_execsql_test 8.1 {
230  INSERT INTO vt0(vt0) VALUES('integrity-check');
231}
232
233#-------------------------------------------------------------------------
234#
235reset_db
236do_execsql_test 9.0 {
237  CREATE VIRTUAL TABLE t1 using FTS5(mailcontent);
238  insert into t1(rowid, mailcontent) values
239      (-4764623217061966105, 'we are going to upgrade'),
240      (8324454597464624651, 'we are going to upgrade');
241}
242
243do_execsql_test 9.1 {
244  INSERT INTO t1(t1) VALUES('integrity-check');
245}
246
247do_execsql_test 9.2 {
248  SELECT rowid FROM t1('upgrade');
249} {
250  -4764623217061966105 8324454597464624651
251}
252
253#-------------------------------------------------------------------------
254#
255reset_db
256do_execsql_test 10.0 {
257  CREATE VIRTUAL TABLE vt1 USING fts5(c1, c2, prefix = 1, tokenize = "ascii");
258  INSERT INTO vt1 VALUES (x'e4', '䔬');
259}
260
261do_execsql_test 10.1 {
262  SELECT quote(CAST(c1 AS blob)), quote(CAST(c2 AS blob)) FROM vt1
263} {X'E4' X'E494AC'}
264
265do_execsql_test 10.2 {
266  INSERT INTO vt1(vt1) VALUES('integrity-check');
267}
268
269#-------------------------------------------------------------------------
270#
271reset_db
272do_execsql_test 11.0 {
273  CREATE VIRTUAL TABLE vt0 USING fts5(
274      c0, prefix = 71, tokenize = "porter ascii", prefix = 9
275  );
276} {}
277do_execsql_test 11.1 {
278  BEGIN;
279  INSERT INTO vt0(c0) VALUES (x'e8');
280}
281do_execsql_test 11.2 {
282  INSERT INTO vt0(vt0) VALUES('integrity-check');
283}
284
285#-------------------------------------------------------------------------
286# Ticket [752fdbf6]
287#
288reset_db
289do_execsql_test 11.0 {
290  PRAGMA encoding = 'UTF-16';
291  CREATE VIRTUAL TABLE vt0 USING fts5(c0, c1);
292  INSERT INTO vt0(vt0, rank) VALUES('pgsz', '37');
293  INSERT INTO vt0(c0, c1) VALUES (0.66077, 1957391816);
294}
295do_execsql_test 11.1 {
296  INSERT INTO vt0(vt0) VALUES('integrity-check');
297}
298
299#-------------------------------------------------------------------------
300# Ticket [7c0e06b16]
301#
302do_execsql_test 12.0 {
303  CREATE TABLE t1(a, b, rank);
304  INSERT INTO t1 VALUES('a', 'hello', '');
305  INSERT INTO t1 VALUES('b', 'world', '');
306
307  CREATE VIRTUAL TABLE ft USING fts5(a);
308  INSERT INTO ft VALUES('b');
309  INSERT INTO ft VALUES('y');
310
311  CREATE TABLE t2(x, y, ft);
312  INSERT INTO t2 VALUES(1, 2, 'x');
313  INSERT INTO t2 VALUES(3, 4, 'b');
314}
315
316do_execsql_test 12.1 {
317  SELECT * FROM t1 NATURAL JOIN ft WHERE ft MATCH('b')
318} {b world {}}
319do_execsql_test 12.2 {
320  SELECT * FROM ft NATURAL JOIN t1 WHERE ft MATCH('b')
321} {b world {}}
322do_execsql_test 12.3 {
323  SELECT * FROM t2 JOIN ft USING (ft)
324} {3 4 b b}
325
326#-------------------------------------------------------------------------
327# Forum post https://sqlite.org/forum/forumpost/21127c1160
328#
329reset_db
330sqlite3_db_config db DEFENSIVE 1
331
332do_execsql_test 13.0 {
333  CREATE TABLE a (id INTEGER PRIMARY KEY, name TEXT);
334  CREATE VIRTUAL TABLE b USING fts5(name);
335  CREATE TRIGGER a_trigger AFTER INSERT ON a BEGIN
336    INSERT INTO b (name) VALUES ('foo');
337  END;
338}
339
340do_test 13.1 {
341  set ::STMT [
342    sqlite3_prepare db "INSERT INTO a VALUES (1, 'foo') RETURNING id;" -1 dummy
343  ]
344  sqlite3_step $::STMT
345} {SQLITE_ROW}
346
347do_test 13.2 {
348  sqlite3_finalize $::STMT
349} {SQLITE_OK}
350
351do_test 13.3 {
352  sqlite3_errmsg db
353} {not an error}
354
355finish_test
356
357