123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- # 2014 November 24
- #
- # The author disclaims copyright to this source code. In place of
- # a legal notice, here is a blessing:
- #
- # May you do good and not evil.
- # May you find forgiveness for yourself and forgive others.
- # May you share freely, never taking more than you give.
- #
- #*************************************************************************
- # This file implements regression tests for SQLite library. The
- # focus of this script is testing the FTS5 module.
- #
- # Specifically, the auxiliary function "highlight".
- #
- source [file join [file dirname [info script]] fts5_common.tcl]
- set testprefix fts5ak
- # If SQLITE_ENABLE_FTS5 is not defined, omit this file.
- ifcapable !fts5 {
- finish_test
- return
- }
- foreach_detail_mode $testprefix {
- do_execsql_test 1.1 {
- CREATE VIRTUAL TABLE ft1 USING fts5(x, detail=%DETAIL%);
- INSERT INTO ft1 VALUES('i d d a g i b g d d');
- INSERT INTO ft1 VALUES('h d b j c c g a c a');
- INSERT INTO ft1 VALUES('e j a e f h b f h h');
- INSERT INTO ft1 VALUES('j f h d g h i b d f');
- INSERT INTO ft1 VALUES('d c j d c j b c g e');
- INSERT INTO ft1 VALUES('i a d e g j g d a a');
- INSERT INTO ft1 VALUES('j f c e d a h j d b');
- INSERT INTO ft1 VALUES('i c c f a d g h j e');
- INSERT INTO ft1 VALUES('i d i g c d c h b f');
- INSERT INTO ft1 VALUES('g d a e h a b c f j');
- CREATE VIRTUAL TABLE ft2 USING fts5(x, detail=%DETAIL%);
- INSERT INTO ft2 VALUES('a b c d e f g h i j');
- }
- do_execsql_test 1.2 {
- SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'e';
- } {
- {[e] j a [e] f h b f h h}
- {d c j d c j b c g [e]}
- {i a d [e] g j g d a a}
- {j f c [e] d a h j d b}
- {i c c f a d g h j [e]}
- {g d a [e] h a b c f j}
- }
- do_execsql_test 1.3 {
- SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'e e e'
- } {
- {[e] j a [e] f h b f h h}
- {d c j d c j b c g [e]}
- {i a d [e] g j g d a a}
- {j f c [e] d a h j d b}
- {i c c f a d g h j [e]}
- {g d a [e] h a b c f j}
- }
- do_execsql_test 1.4 {
- SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'f d'
- } {
- {a b c [d] e [f] g h i j}
- }
- do_execsql_test 1.5 {
- SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'd f'
- } {
- {a b c [d] e [f] g h i j}
- }
- #-------------------------------------------------------------------------
- # Tests below this point require detail=full.
- #-------------------------------------------------------------------------
- if {[detail_is_full]==0} continue
- do_execsql_test 2.1 {
- SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'h + d';
- } {
- {[h d] b j c c g a c a}
- {j f [h d] g h i b d f}
- }
- do_execsql_test 2.2 {
- SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'd + d';
- } {
- {i [d d] a g i b g [d d]}
- }
- do_execsql_test 2.3 {
- SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'd + d d + d';
- } {
- {i [d d] a g i b g [d d]}
- }
- do_execsql_test 2.4 {
- SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'b+c+d c+d+e'
- } {{a [b c d e] f g h i j}}
- do_execsql_test 2.5 {
- SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'b+c+d e+f+g'
- } {
- {a [b c d] [e f g] h i j}
- }
- do_execsql_test 2.6 {
- SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'b+c+d c'
- } {
- {a [b c d] e f g h i j}
- }
- do_execsql_test 2.7 {
- SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'b+c c+d+e'
- } {
- {a [b c d e] f g h i j}
- }
- #-------------------------------------------------------------------------
- # The example from the docs.
- #
- do_execsql_test 3.1 {
- -- Assuming this:
- CREATE VIRTUAL TABLE ft USING fts5(a, detail=%DETAIL%);
- INSERT INTO ft VALUES('a b c x c d e');
- INSERT INTO ft VALUES('a b c c d e');
- INSERT INTO ft VALUES('a b c d e');
- -- The following SELECT statement returns these three rows:
- -- '[a b c] x [c d e]'
- -- '[a b c] [c d e]'
- -- '[a b c d e]'
- SELECT highlight(ft, 0, '[', ']') FROM ft WHERE ft MATCH 'a+b+c AND c+d+e';
- } {
- {[a b c] x [c d e]}
- {[a b c] [c d e]}
- {[a b c d e]}
- }
- do_execsql_test 3.2 {
- SELECT highlight(ft, 0, NULL, NULL) FROM ft WHERE ft MATCH 'a+b+c AND c+d+e';
- } {
- {a b c x c d e}
- {a b c c d e}
- {a b c d e}
- }
- }
- # 2023-04-06 https://sqlite.org/forum/forumpost/cae4367d9b
- #
- # This is not a test of FTS5, but rather a test of the of what happens to
- # prepared statements that encounter SQLITE_SCHEMA while other prepared
- # statements are running. The original problem POC used FTS5, and so
- # is seems reasonable to put the test here.
- #
- # The vdbeaux24.test module in TH3 also tests this same behavior but
- # without requiring FTS5 or an other extension.
- #
- reset_db
- db null NULL
- do_execsql_test 4.0 {
- CREATE TABLE t5(a PRIMARY KEY);
- INSERT INTO t5 VALUES(0);
- CREATE VIRTUAL TABLE t6 USING fts5(0);
- DELETE FROM t6;
- CREATE TABLE t7(x);
- WITH cte(a) AS (
- SELECT a FROM t5
- WHERE ((0,0) IN (SELECT 0, LAG(0) OVER (PARTITION BY 0) FROM t6), 0)
- < (a,0)
- )
- SELECT max(a) FROM cte;
- } NULL
- finish_test
|