Snapshot of upstream SQLite 3.40.1
[sqlcipher.git] / ext / fts5 / test / fts5misc.test
blob416b4c808594bebbbf3a871e3473e624ce71a507
1 # 2019 September 02
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #*************************************************************************
11 # This file implements regression tests for SQLite library.  The
12 # focus of this script is testing the FTS5 module.
15 source [file join [file dirname [info script]] fts5_common.tcl]
16 set testprefix fts5misc
18 # If SQLITE_ENABLE_FTS5 is not defined, omit this file.
19 ifcapable !fts5 {
20   finish_test
21   return
24 do_execsql_test 1.0 {
25   CREATE VIRTUAL TABLE t1 USING fts5(a);
28 do_catchsql_test 1.1.1 { 
29   SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*'); 
30 } {1 {unknown special query: }}
31 do_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: }}
36 do_catchsql_test 1.2.1 { 
37   SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*id'); 
38 } {0 {{}}}
40 do_catchsql_test 1.2.2 {
41   SELECT a FROM t1
42     WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*id'));
43 } {0 {}}
45 do_catchsql_test 1.3.1 { 
46   SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*reads'); 
47 } {1 {no such cursor: 1}}
49 do_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}}
54 db close
55 sqlite3 db test.db
57 do_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}}
62 #-------------------------------------------------------------------------
63 reset_db
64 do_execsql_test 2.0 {
65   CREATE TABLE t0(c0);
66   CREATE VIRTUAL TABLE vt0 USING fts5(c0);
68 do_execsql_test 2.1.1 {
69   BEGIN TRANSACTION;
70   INSERT INTO vt0(c0) VALUES ('xyz');
72 do_execsql_test 2.1.2 {
73   ALTER TABLE t0 ADD COLUMN c5;
75 do_execsql_test 2.1.3 {
76   INSERT INTO vt0(vt0) VALUES('integrity-check');
78 do_execsql_test 2.1.4 {
79   INSERT INTO vt0(c0) VALUES ('abc');
80   COMMIT
82 do_execsql_test 2.1.5 {
83   INSERT INTO vt0(vt0) VALUES('integrity-check');
86 reset_db
87 do_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');
94 breakpoint
95 do_execsql_test 2.2.2 {
96   ALTER TABLE t0 RENAME TO t1;
98 do_execsql_test 2.2.3 {
99   INSERT INTO vt0(vt0) VALUES('integrity-check');
101 do_execsql_test 2.2.4 {
102   INSERT INTO vt0(c0) VALUES ('abc');
103   COMMIT;
105 do_execsql_test 2.2.5 {
106   INSERT INTO vt0(vt0) VALUES('integrity-check');
109 #-------------------------------------------------------------------------
110 reset_db
111 do_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');
117 do_execsql_test 3.1 {
118   UPDATE vt0 SET a = 399905135; -- unexpected: database disk image is malformed
120 do_execsql_test 3.2 {
121   INSERT INTO vt0(vt0) VALUES('integrity-check');
124 #-------------------------------------------------------------------------
125 reset_db
126 do_execsql_test 4.0 {
127   CREATE VIRTUAL TABLE vt0 USING fts5(c0);
128   INSERT INTO vt0(c0) VALUES ('xyz');
131 do_execsql_test 4.1 {
132   BEGIN;
133     INSERT INTO vt0(c0) VALUES ('abc');
134     INSERT INTO vt0(vt0) VALUES('rebuild');
135   COMMIT;
138 do_execsql_test 4.2 {
139   INSERT INTO vt0(vt0) VALUES('integrity-check');
142 do_execsql_test 4.3 {
143   BEGIN;
144     INSERT INTO vt0(vt0) VALUES('rebuild');
145     INSERT INTO vt0(vt0) VALUES('rebuild');
146   COMMIT;
149 do_execsql_test 4.4 {
150   INSERT INTO vt0(vt0) VALUES('integrity-check');
153 #-------------------------------------------------------------------------
154 # Ticket [81a7f7b9].
156 reset_db
157 do_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 } {}
166 do_execsql_test 5.1 {
167   UPDATE vt0 SET c1 = 'T,D&p^y/7#3*v<b<4j7|f';
170 do_execsql_test 5.2 {
171   INSERT INTO vt0(vt0) VALUES('integrity-check');
174 do_catchsql_test 5.3 {
175   INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65537');
176 } {1 {SQL logic error}}
178 #-------------------------------------------------------------------------
179 # Ticket [d392017c].
181 reset_db
182 do_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 } {}
192 do_execsql_test 6.1 {
193   INSERT INTO vt0(vt0) VALUES('rebuild');
196 #-------------------------------------------------------------------------
198 reset_db
199 do_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');
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');
213 do_execsql_test 7.1 {
214   SELECT rowid FROM t1 WHERE (rowid, x) IN (SELECT a, b FROM t2); 
217 do_execsql_test 7.2 {
218   SELECT rowid FROM t1 WHERE rowid=2 AND t1 = 'hello';
221 #-------------------------------------------------------------------------
223 reset_db
224 do_execsql_test 8.0 {
225   CREATE VIRTUAL TABLE vt0 USING fts5(c0, tokenize = "ascii", prefix = 1);
226   INSERT INTO vt0(c0) VALUES (x'd1');
229 do_execsql_test 8.1 {
230   INSERT INTO vt0(vt0) VALUES('integrity-check');
233 #-------------------------------------------------------------------------
235 reset_db
236 do_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');
243 do_execsql_test 9.1 {
244   INSERT INTO t1(t1) VALUES('integrity-check');
247 do_execsql_test 9.2 {
248   SELECT rowid FROM t1('upgrade');
249 } {
250   -4764623217061966105 8324454597464624651
253 #-------------------------------------------------------------------------
255 reset_db
256 do_execsql_test 10.0 {
257   CREATE VIRTUAL TABLE vt1 USING fts5(c1, c2, prefix = 1, tokenize = "ascii");
258   INSERT INTO vt1 VALUES (x'e4', '䔬');
261 do_execsql_test 10.1 {
262   SELECT quote(CAST(c1 AS blob)), quote(CAST(c2 AS blob)) FROM vt1
263 } {X'E4' X'E494AC'}
265 do_execsql_test 10.2 {
266   INSERT INTO vt1(vt1) VALUES('integrity-check');
269 #-------------------------------------------------------------------------
271 reset_db
272 do_execsql_test 11.0 {
273   CREATE VIRTUAL TABLE vt0 USING fts5(
274       c0, prefix = 71, tokenize = "porter ascii", prefix = 9
275   );
276 } {}
277 do_execsql_test 11.1 {
278   BEGIN;
279   INSERT INTO vt0(c0) VALUES (x'e8');
281 do_execsql_test 11.2 {
282   INSERT INTO vt0(vt0) VALUES('integrity-check');
285 #-------------------------------------------------------------------------
286 # Ticket [752fdbf6] 
288 reset_db
289 do_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);
295 do_execsql_test 11.1 {
296   INSERT INTO vt0(vt0) VALUES('integrity-check');
299 #-------------------------------------------------------------------------
300 # Ticket [7c0e06b16] 
302 do_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', '');
307   CREATE VIRTUAL TABLE ft USING fts5(a);
308   INSERT INTO ft VALUES('b');
309   INSERT INTO ft VALUES('y');
311   CREATE TABLE t2(x, y, ft);
312   INSERT INTO t2 VALUES(1, 2, 'x');
313   INSERT INTO t2 VALUES(3, 4, 'b');
316 do_execsql_test 12.1 {
317   SELECT * FROM t1 NATURAL JOIN ft WHERE ft MATCH('b')
318 } {b world {}}
319 do_execsql_test 12.2 {
320   SELECT * FROM ft NATURAL JOIN t1 WHERE ft MATCH('b')
321 } {b world {}}
322 do_execsql_test 12.3 {
323   SELECT * FROM t2 JOIN ft USING (ft)
324 } {3 4 b b}
326 #-------------------------------------------------------------------------
327 # Forum post https://sqlite.org/forum/forumpost/21127c1160
329 reset_db
330 sqlite3_db_config db DEFENSIVE 1
332 do_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;
340 do_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}
347 do_test 13.2 {
348   sqlite3_finalize $::STMT
349 } {SQLITE_OK}
351 do_test 13.3 {
352   sqlite3_errmsg db
353 } {not an error}
355 #-------------------------------------------------------------------------
356 reset_db
357 db close
358 sqlite3 db test.db -uri 1
360 do_execsql_test 14.0 {
361   PRAGMA locking_mode=EXCLUSIVE;
362   BEGIN;
363   ATTACH 'file:/one?vfs=memdb' AS aux1;
364   ATTACH 'file:/one?vfs=memdb' AS aux2;
365   CREATE VIRTUAL TABLE t1 USING fts5(x);
366 } {exclusive}
367 do_catchsql_test 14.1 {
368   ANALYZE;
369 } {1 {database is locked}}
370 do_catchsql_test 14.2 {
371   COMMIT;
372 } {1 {database is locked}}
373 do_catchsql_test 14.3 {
374   COMMIT;
375 } {1 {database is locked}}
376 do_catchsql_test 14.4 {
377   ROLLBACK;
378 } {0 {}}
380 #-------------------------------------------------------------------------
381 reset_db
382 sqlite3 db2 test.db
384 do_execsql_test 15.0 {
385   CREATE TABLE t1(a, b);
386   BEGIN;
387     SELECT * FROM t1;
390 do_execsql_test -db db2 15.1 {
391   BEGIN; 
392     CREATE VIRTUAL TABLE x1 USING fts5(y);
394 do_test 15.2 {
395   list [catch { db2 eval COMMIT } msg] $msg
396 } {1 {database is locked}}
397 do_execsql_test -db db2 15.3 {
398   SAVEPOINT one;
399 } {}
400 do_execsql_test 15.4 END
401 do_test 15.4 {
402   list [catch { db2 eval COMMIT } msg] $msg
403 } {0 {}}
405 #-------------------------------------------------------------------------
406 reset_db
407 forcedelete test.db2
408 sqlite3 db2 test.db
409 do_execsql_test 16.0 {
411   ATTACH 'test.db2' AS aux;
412   CREATE TABLE aux.t2(x,y);
413   INSERT INTO t2 VALUES(1, 2);
414   CREATE VIRTUAL TABLE x1 USING fts5(a);
415   BEGIN;
416     INSERT INTO x1 VALUES('abc');
417     INSERT INTO t2 VALUES(3, 4);
420 do_execsql_test -db db2 16.1 {
421   ATTACH 'test.db2' AS aux;
422   BEGIN;
423     SELECT * FROM t2
424 } {1 2}
426 do_catchsql_test 16.2 {
427   COMMIT;
428 } {1 {database is locked}}
430 do_execsql_test 16.3 {
431   INSERT INTO x1 VALUES('def');
434 do_execsql_test -db db2 16.4 { 
435   END 
438 do_execsql_test 16.5 {
439   COMMIT
442 do_execsql_test -db db2 16.6 {
443   SELECT * FROM x1
444 } {abc def}
446 finish_test