Fixes default log output to console for macOS
[sqlcipher.git] / ext / fts5 / test / fts5misc.test
blob4e4fe4ba2de3082de85b1db947a3c7b497da9671
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: 2}}
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: 2}}
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 do_execsql_test 2.2.2 {
95   ALTER TABLE t0 RENAME TO t1;
97 do_execsql_test 2.2.3 {
98   INSERT INTO vt0(vt0) VALUES('integrity-check');
100 do_execsql_test 2.2.4 {
101   INSERT INTO vt0(c0) VALUES ('abc');
102   COMMIT;
104 do_execsql_test 2.2.5 {
105   INSERT INTO vt0(vt0) VALUES('integrity-check');
108 #-------------------------------------------------------------------------
109 reset_db
110 do_execsql_test 3.0 {
111   CREATE VIRTUAL TABLE vt0 USING fts5(a);
112   PRAGMA reverse_unordered_selects = true;
113   INSERT INTO vt0 VALUES('365062398'), (0), (0);
114   INSERT INTO vt0(vt0, rank) VALUES('pgsz', '38');
116 do_execsql_test 3.1 {
117   UPDATE vt0 SET a = 399905135; -- unexpected: database disk image is malformed
119 do_execsql_test 3.2 {
120   INSERT INTO vt0(vt0) VALUES('integrity-check');
123 #-------------------------------------------------------------------------
124 reset_db
125 do_execsql_test 4.0 {
126   CREATE VIRTUAL TABLE vt0 USING fts5(c0);
127   INSERT INTO vt0(c0) VALUES ('xyz');
130 do_execsql_test 4.1 {
131   BEGIN;
132     INSERT INTO vt0(c0) VALUES ('abc');
133     INSERT INTO vt0(vt0) VALUES('rebuild');
134   COMMIT;
137 do_execsql_test 4.2 {
138   INSERT INTO vt0(vt0) VALUES('integrity-check');
141 do_execsql_test 4.3 {
142   BEGIN;
143     INSERT INTO vt0(vt0) VALUES('rebuild');
144     INSERT INTO vt0(vt0) VALUES('rebuild');
145   COMMIT;
148 do_execsql_test 4.4 {
149   INSERT INTO vt0(vt0) VALUES('integrity-check');
152 #-------------------------------------------------------------------------
153 # Ticket [81a7f7b9].
155 reset_db
156 do_execsql_test 5.0 {
157   CREATE VIRTUAL TABLE vt0 USING fts5(c0, c1);
158   INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65536');
159   WITH s(i) AS (
160     SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1236
161   )
162   INSERT INTO vt0(c0) SELECT '0' FROM s;
163 } {}
165 do_execsql_test 5.1 {
166   UPDATE vt0 SET c1 = 'T,D&p^y/7#3*v<b<4j7|f';
169 do_execsql_test 5.2 {
170   INSERT INTO vt0(vt0) VALUES('integrity-check');
173 do_catchsql_test 5.3 {
174   INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65537');
175 } {1 {SQL logic error}}
177 #-------------------------------------------------------------------------
178 # Ticket [d392017c].
180 reset_db
181 do_execsql_test 6.0 {
182   CREATE VIRTUAL TABLE vt0 USING fts5(c0);
183   WITH s(i) AS (
184     SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10000
185   )
186   INSERT INTO vt0(c0) SELECT '0' FROM s;
187   INSERT INTO vt0(vt0, rank) VALUES('crisismerge', 2000);
188   INSERT INTO vt0(vt0, rank) VALUES('automerge', 0);
189 } {}
191 do_execsql_test 6.1 {
192   INSERT INTO vt0(vt0) VALUES('rebuild');
195 #-------------------------------------------------------------------------
197 reset_db
198 do_execsql_test 7.0 {
199   CREATE VIRTUAL TABLE t1 USING fts5(x);
200   INSERT INTO t1(rowid, x) VALUES(1, 'hello world');
201   INSERT INTO t1(rowid, x) VALUES(2, 'well said');
202   INSERT INTO t1(rowid, x) VALUES(3, 'hello said');
203   INSERT INTO t1(rowid, x) VALUES(4, 'well world');
205   CREATE TABLE t2 (a, b);
206   INSERT INTO t2 VALUES(1, 'hello');
207   INSERT INTO t2 VALUES(2, 'world');
208   INSERT INTO t2 VALUES(3, 'said');
209   INSERT INTO t2 VALUES(4, 'hello');
212 do_execsql_test 7.1 {
213   SELECT rowid FROM t1 WHERE (rowid, x) IN (SELECT a, b FROM t2); 
216 do_execsql_test 7.2 {
217   SELECT rowid FROM t1 WHERE rowid=2 AND t1 = 'hello';
220 #-------------------------------------------------------------------------
222 reset_db
223 do_execsql_test 8.0 {
224   CREATE VIRTUAL TABLE vt0 USING fts5(c0, tokenize = "ascii", prefix = 1);
225   INSERT INTO vt0(c0) VALUES (x'd1');
228 do_execsql_test 8.1 {
229   INSERT INTO vt0(vt0) VALUES('integrity-check');
232 #-------------------------------------------------------------------------
234 reset_db
235 do_execsql_test 9.0 {
236   CREATE VIRTUAL TABLE t1 using FTS5(mailcontent);
237   insert into t1(rowid, mailcontent) values
238       (-4764623217061966105, 'we are going to upgrade'),
239       (8324454597464624651, 'we are going to upgrade');
242 do_execsql_test 9.1 {
243   INSERT INTO t1(t1) VALUES('integrity-check');
246 do_execsql_test 9.2 {
247   SELECT rowid FROM t1('upgrade');
248 } {
249   -4764623217061966105 8324454597464624651
252 #-------------------------------------------------------------------------
254 reset_db
255 do_execsql_test 10.0 {
256   CREATE VIRTUAL TABLE vt1 USING fts5(c1, c2, prefix = 1, tokenize = "ascii");
257   INSERT INTO vt1 VALUES (x'e4', '䔬');
260 do_execsql_test 10.1 {
261   SELECT quote(CAST(c1 AS blob)), quote(CAST(c2 AS blob)) FROM vt1
262 } {X'E4' X'E494AC'}
264 do_execsql_test 10.2 {
265   INSERT INTO vt1(vt1) VALUES('integrity-check');
268 #-------------------------------------------------------------------------
270 reset_db
271 do_execsql_test 11.0 {
272   CREATE VIRTUAL TABLE vt0 USING fts5(
273       c0, prefix = 71, tokenize = "porter ascii", prefix = 9
274   );
275 } {}
276 do_execsql_test 11.1 {
277   BEGIN;
278   INSERT INTO vt0(c0) VALUES (x'e8');
280 do_execsql_test 11.2 {
281   INSERT INTO vt0(vt0) VALUES('integrity-check');
284 #-------------------------------------------------------------------------
285 # Ticket [752fdbf6] 
287 reset_db
288 do_execsql_test 11.0 {
289   PRAGMA encoding = 'UTF-16';
290   CREATE VIRTUAL TABLE vt0 USING fts5(c0, c1);
291   INSERT INTO vt0(vt0, rank) VALUES('pgsz', '37');
292   INSERT INTO vt0(c0, c1) VALUES (0.66077, 1957391816);
294 do_execsql_test 11.1 {
295   INSERT INTO vt0(vt0) VALUES('integrity-check');
298 #-------------------------------------------------------------------------
299 # Ticket [7c0e06b16] 
301 do_execsql_test 12.0 {
302   CREATE TABLE t1(a, b, rank);
303   INSERT INTO t1 VALUES('a', 'hello', '');
304   INSERT INTO t1 VALUES('b', 'world', '');
306   CREATE VIRTUAL TABLE ft USING fts5(a);
307   INSERT INTO ft VALUES('b');
308   INSERT INTO ft VALUES('y');
310   CREATE TABLE t2(x, y, ft);
311   INSERT INTO t2 VALUES(1, 2, 'x');
312   INSERT INTO t2 VALUES(3, 4, 'b');
315 do_execsql_test 12.1 {
316   SELECT * FROM t1 NATURAL JOIN ft WHERE ft MATCH('b')
317 } {b world {}}
318 do_execsql_test 12.2 {
319   SELECT * FROM ft NATURAL JOIN t1 WHERE ft MATCH('b')
320 } {b world {}}
321 do_execsql_test 12.3 {
322   SELECT * FROM t2 JOIN ft USING (ft)
323 } {3 4 b b}
325 #-------------------------------------------------------------------------
326 # Forum post https://sqlite.org/forum/forumpost/21127c1160
328 reset_db
329 sqlite3_db_config db DEFENSIVE 1
331 do_execsql_test 13.1.0 {
332   CREATE TABLE a (id INTEGER PRIMARY KEY, name TEXT);
333   CREATE VIRTUAL TABLE b USING fts5(name);
334   CREATE TRIGGER a_trigger AFTER INSERT ON a BEGIN 
335     INSERT INTO b (name) VALUES ('foo');
336   END;
339 do_test 13.1.1 {
340   set ::STMT [
341     sqlite3_prepare db "INSERT INTO a VALUES (1, 'foo') RETURNING id;" -1 dummy
342   ]
343   sqlite3_step $::STMT
344 } {SQLITE_ROW}
346 do_test 13.1.2 {
347   sqlite3_finalize $::STMT
348 } {SQLITE_OK}
350 do_test 13.1.3 {
351   sqlite3_errmsg db
352 } {not an error}
354 reset_db
355 sqlite3_db_config db DEFENSIVE 1
356 do_execsql_test 13.2.0 {
357   BEGIN;
358   CREATE TABLE a (id INTEGER PRIMARY KEY, name TEXT);
359   CREATE VIRTUAL TABLE b USING fts5(name);
360   CREATE TRIGGER a_trigger AFTER INSERT ON a BEGIN 
361     INSERT INTO b (name) VALUES ('foo');
362   END;
365 do_test 13.2.1 {
366   set ::STMT [
367     sqlite3_prepare db "INSERT INTO a VALUES (1, 'foo') RETURNING id;" -1 dummy
368   ]
369   sqlite3_step $::STMT
370 } {SQLITE_ROW}
372 do_test 13.2.2 {
373   sqlite3_finalize $::STMT
374 } {SQLITE_OK}
376 do_test 13.2.3 {
377   sqlite3_errmsg db
378 } {not an error}
380 #-------------------------------------------------------------------------
381 reset_db
382 db close
383 sqlite3 db test.db -uri 1
385 do_execsql_test 14.0 {
386   PRAGMA locking_mode=EXCLUSIVE;
387   BEGIN;
388   ATTACH 'file:/one?vfs=memdb' AS aux1;
389   ATTACH 'file:/one?vfs=memdb' AS aux2;
390   CREATE VIRTUAL TABLE t1 USING fts5(x);
391 } {exclusive}
392 do_catchsql_test 14.1 {
393   ANALYZE;
394 } {1 {database is locked}}
395 do_catchsql_test 14.2 {
396   COMMIT;
397 } {1 {database is locked}}
398 do_catchsql_test 14.3 {
399   COMMIT;
400 } {1 {database is locked}}
401 do_catchsql_test 14.4 {
402   ROLLBACK;
403 } {0 {}}
405 #-------------------------------------------------------------------------
406 reset_db
407 sqlite3 db2 test.db
409 do_execsql_test 15.0 {
410   CREATE TABLE t1(a, b);
411   BEGIN;
412     SELECT * FROM t1;
415 do_execsql_test -db db2 15.1 {
416   BEGIN; 
417     CREATE VIRTUAL TABLE x1 USING fts5(y);
419 do_test 15.2 {
420   list [catch { db2 eval COMMIT } msg] $msg
421 } {1 {database is locked}}
422 do_execsql_test -db db2 15.3 {
423   SAVEPOINT one;
424 } {}
425 do_execsql_test 15.4 END
426 do_test 15.5 {
427   list [catch { db2 eval COMMIT } msg] $msg
428 } {0 {}}
430 db2 close
432 #-------------------------------------------------------------------------
433 reset_db
434 forcedelete test.db2
435 sqlite3 db2 test.db
436 do_execsql_test 16.0 {
438   ATTACH 'test.db2' AS aux;
439   CREATE TABLE aux.t2(x,y);
440   INSERT INTO t2 VALUES(1, 2);
441   CREATE VIRTUAL TABLE x1 USING fts5(a);
442   BEGIN;
443     INSERT INTO x1 VALUES('abc');
444     INSERT INTO t2 VALUES(3, 4);
447 do_execsql_test -db db2 16.1 {
448   ATTACH 'test.db2' AS aux;
449   BEGIN;
450     SELECT * FROM t2
451 } {1 2}
453 do_catchsql_test 16.2 {
454   COMMIT;
455 } {1 {database is locked}}
457 do_execsql_test 16.3 {
458   INSERT INTO x1 VALUES('def');
461 do_execsql_test -db db2 16.4 { 
462   END 
465 do_execsql_test 16.5 {
466   COMMIT
469 do_execsql_test -db db2 16.6 {
470   SELECT * FROM x1
471 } {abc def}
473 db2 close
475 #-------------------------------------------------------------------------
476 reset_db
477 do_execsql_test 17.1 {
478   CREATE VIRTUAL TABLE ft USING fts5(x, tokenize="unicode61 separators 'X'");
480 do_execsql_test 17.2 {
481   SELECT 0 FROM ft WHERE ft MATCH 'X' AND ft MATCH 'X'
483 do_execsql_test 17.3 {
484   SELECT 0 FROM ft('X')
487 do_execsql_test 17.4 {
488   CREATE VIRTUAL TABLE t0 USING fts5(c0, t="trigram");
489   INSERT INTO t0 VALUES('assertionfaultproblem');
491 do_execsql_test 17.5 {
492   SELECT 0 FROM t0(0) WHERE c0 GLOB 0;
493 } {}
495 do_execsql_test 17.5 {
496   SELECT c0 FROM t0 WHERE c0 GLOB '*f*';
497 } {assertionfaultproblem}
498 do_execsql_test 17.5 {
499   SELECT c0 FROM t0 WHERE c0 GLOB '*faul*';
500 } {assertionfaultproblem}
502 #-------------------------------------------------------------------------
503 reset_db
504 do_execsql_test 18.0 {
505   BEGIN;
506     CREATE VIRTUAL TABLE t1 USING fts5(text);
507     ALTER TABLE t1 RENAME TO t2;
510 do_execsql_test 18.1 {
511     DROP TABLE t2;
514 do_execsql_test 18.2 {
515   COMMIT;
518 #-------------------------------------------------------------------------
519 reset_db
520 do_execsql_test 19.0 {
521   CREATE VIRTUAL TABLE t1 USING fts5(text);
522   CREATE TABLE t2(text);
523   BEGIN;
524     INSERT INTO t1 VALUES('one');
525     INSERT INTO t1 VALUES('two');
526     INSERT INTO t1 VALUES('three');
527     INSERT INTO t1 VALUES('one');
528     INSERT INTO t1 VALUES('two');
529     INSERT INTO t1 VALUES('three');
530     SAVEPOINT one;
531       INSERT INTO t2 VALUES('one');
532       INSERT INTO t2 VALUES('two');
533       INSERT INTO t2 VALUES('three');
534     ROLLBACK TO one;
535   COMMIT;
538 finish_test