xref: /sqlite-3.40.0/ext/fts5/test/fts5multi.test (revision 685b2ee0)
1# 2014 September 13
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 fts5multi
17
18# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
19ifcapable !fts5 {
20  finish_test
21  return
22}
23
24fts5_aux_test_functions db
25
26do_execsql_test 1.0 {
27  CREATE VIRTUAL TABLE t1 USING fts5(a, b, c);
28  INSERT INTO t1 VALUES('gg bb bb'   ,'gg ff gg'   ,'ii ii');
29  INSERT INTO t1 VALUES('dd dd hh kk','jj'         ,'aa');
30  INSERT INTO t1 VALUES('kk gg ee'   ,'hh cc'      ,'hh jj aa cc');
31  INSERT INTO t1 VALUES('hh'         ,'bb jj cc'   ,'kk ii');
32  INSERT INTO t1 VALUES('kk dd kk ii','aa ee aa'   ,'ee');
33  INSERT INTO t1 VALUES('ee'         ,'ff gg kk aa','ee ff ee');
34  INSERT INTO t1 VALUES('ff jj'      ,'gg ee'      ,'kk ee gg kk');
35  INSERT INTO t1 VALUES('ff ee dd hh','kk ee'      ,'gg dd');
36  INSERT INTO t1 VALUES('bb'         ,'aa'         ,'bb aa');
37  INSERT INTO t1 VALUES('hh cc bb'   ,'ff bb'      ,'cc');
38  INSERT INTO t1 VALUES('jj'         ,'ff dd bb aa','dd dd ff ff');
39  INSERT INTO t1 VALUES('ff dd gg dd','gg aa bb ff','cc');
40  INSERT INTO t1 VALUES('ff aa cc jj','kk'         ,'ii dd');
41  INSERT INTO t1 VALUES('jj dd'      ,'cc'         ,'ii hh ee aa');
42  INSERT INTO t1 VALUES('ff ii hh'   ,'dd'         ,'gg');
43  INSERT INTO t1 VALUES('ff dd gg hh','hh'         ,'ff dd');
44  INSERT INTO t1 VALUES('cc cc'      ,'ff dd ff'   ,'bb');
45  INSERT INTO t1 VALUES('ii'         ,'bb ii'      ,'jj kk');
46  INSERT INTO t1 VALUES('ff hh'      ,'hh bb'      ,'bb dd ee');
47  INSERT INTO t1 VALUES('jj kk'      ,'jj'         ,'gg ff cc');
48  INSERT INTO t1 VALUES('dd kk'      ,'ii gg'      ,'dd');
49  INSERT INTO t1 VALUES('cc'         ,'aa ff'      ,'ii');
50  INSERT INTO t1 VALUES('bb ff bb ii','bb kk bb aa','hh ff ii dd');
51  INSERT INTO t1 VALUES('aa'         ,'ee bb jj jj','dd');
52  INSERT INTO t1 VALUES('kk dd cc'   ,'aa jj'      ,'ee aa ff');
53  INSERT INTO t1 VALUES('aa gg aa'   ,'jj'         ,'ii kk hh gg');
54  INSERT INTO t1 VALUES('ff hh aa'   ,'jj ii'      ,'hh dd bb jj');
55  INSERT INTO t1 VALUES('hh'         ,'aa gg kk'   ,'bb ee');
56  INSERT INTO t1 VALUES('bb'         ,'ee'         ,'gg');
57  INSERT INTO t1 VALUES('dd kk'      ,'kk bb aa'   ,'ee');
58}
59
60foreach {tn c1 e1 c2 e2} {
61  1     t1 aa     t1 bb
62  2     a  aa     b  bb
63  3     a  "aa OR bb OR cc"    b  "jj OR ii OR hh"
64  4     t1  "aa AND bb"       t1  "cc"
65  5     c   "kk"               b  "aa OR bb OR cc OR dd OR ee"
66} {
67  if {$c1=="t1"} {
68    set lhs "( $e1 )"
69  } else {
70    set lhs "$c1 : ( $e1 )"
71  }
72  if {$c2=="t1"} {
73    set rhs "( $e2 )"
74  } else {
75    set rhs "$c2 : ( $e2 )"
76  }
77
78  set q1 "t1 MATCH '($lhs) AND ($rhs)'"
79  set q2 "$c1 MATCH '$e1' AND $c2 MATCH '$e2'"
80
81  set ret [execsql "SELECT rowid FROM t1 WHERE $q1"]
82  set N [llength $ret]
83  do_execsql_test 1.$tn.1.($N) "SELECT rowid FROM t1 WHERE $q2" $ret
84
85  set ret [execsql "SELECT fts5_test_poslist(t1) FROM t1 WHERE $q1"]
86  do_execsql_test 1.$tn.2.($N) "
87    SELECT fts5_test_poslist(t1) FROM t1 WHERE $q2
88  " $ret
89}
90
91do_catchsql_test 2.1.1 {
92  SELECT rowid FROM t1 WHERE t1 MATCH '(NOT' AND t1 MATCH 'aa bb';
93} {1 {fts5: syntax error near "NOT"}}
94do_catchsql_test 2.1.2 {
95  SELECT rowid FROM t1 WHERE t1 MATCH 'aa bb' AND t1 MATCH '(NOT';
96} {1 {fts5: syntax error near "NOT"}}
97
98finish_test
99
100