xref: /sqlite-3.40.0/ext/fts5/test/fts5colset.test (revision 832aa023)
1# 2016 August 10
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 fts5colset
17
18# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
19ifcapable !fts5 {
20  finish_test
21  return
22}
23
24foreach_detail_mode $::testprefix {
25  if {[detail_is_none]} continue
26
27  do_execsql_test 1.0 {
28    CREATE VIRTUAL TABLE t1 USING fts5(a, b, c, d, detail=%DETAIL%);
29    INSERT INTO t1 VALUES('a', 'b', 'c', 'd');  -- 1
30    INSERT INTO t1 VALUES('d', 'a', 'b', 'c');  -- 2
31    INSERT INTO t1 VALUES('c', 'd', 'a', 'b');  -- 3
32    INSERT INTO t1 VALUES('b', 'c', 'd', 'a');  -- 4
33  }
34
35  foreach {tn q res} {
36    1 "a"          {1 2 3 4}
37    2 "{a}   : a"  {1}
38    3 "-{a}   : a" {2 3 4}
39    4 "- {a c} : a" {2 4}
40    5 " - {d d c} : a" {1 2}
41    6 "- {d c b a} : a" {}
42    7 "-{\"a\"} : b" {1 2 3}
43    8 "- c : a" {1 2 4}
44    9 "-c : a"  {1 2 4}
45    10 "-\"c\" : a"  {1 2 4}
46  } {
47    do_execsql_test 1.$tn {
48      SELECT rowid FROM t1($q)
49    } $res
50  }
51
52  foreach {tn q res} {
53    0 {{a} : (a AND ":")}     {}
54    1 "{a b c} : (a AND d)"   {2 3}
55    2 "{a b c} : (a AND b:d)" {3}
56    3 "{a b c} : (a AND d:d)" {}
57    4 "{b} : ( {b a} : ( {c b a} : ( {d b c a} : ( d OR c ) ) ) )" {3 4}
58    5 "{a} : ( {b a} : ( {c b a} : ( {d b c a} : ( d OR c ) ) ) )" {2 3}
59    6 "{a} : ( {b a} : ( {c b} : ( {d b c a} : ( d OR c ) ) ) )" {}
60    7 "{a b c} : (b:a AND c:b)" {2}
61  } {
62    do_execsql_test 2.$tn {
63      SELECT rowid FROM t1($q)
64    } $res
65  }
66
67  foreach {tn w res} {
68    0 "a MATCH 'a'" {1}
69    1 "b MATCH 'a'" {2}
70    2 "b MATCH '{a b c} : a'" {2}
71    3 "b MATCH 'a OR b'"      {1 2}
72    4 "b MATCH 'a OR a:b'"    {2}
73    5 "b MATCH 'a OR b:b'"    {1 2}
74  } {
75    do_execsql_test 3.$tn "
76      SELECT rowid FROM t1 WHERE $w
77    " $res
78  }
79
80  do_catchsql_test 4.1 {
81    SELECT * FROM t1 WHERE rowid MATCH 'a'
82  } {1 {unable to use function MATCH in the requested context}}
83}
84
85#-------------------------------------------------------------------------
86# Confirm that the expression parser creates the same expression tree
87# for:
88#
89#     {a b} : (abc AND def)
90#    -{c d} : (abc AND def)
91#
92# Assuming that the table columns are (a, b, c, d).
93#
94do_execsql_test 5.1 {
95  SELECT fts5_expr('abcd AND cdef');
96} {{"abcd" AND "cdef"}}
97do_execsql_test 5.2 {
98  SELECT fts5_expr('{a b} : (abcd AND cdef)', 'a', 'b', 'c', 'd');
99} {{{a b} : "abcd" AND {a b} : "cdef"}}
100do_execsql_test 5.3 {
101  SELECT fts5_expr('-{c d} : (abcd AND cdef)', 'a', 'b', 'c', 'd');
102} {{{a b} : "abcd" AND {a b} : "cdef"}}
103
104
105finish_test
106