xref: /sqlite-3.40.0/test/fts3join.test (revision c583719b)
142899543Sdan# 2014 January 4
242899543Sdan#
342899543Sdan# The author disclaims copyright to this source code.  In place of
442899543Sdan# a legal notice, here is a blessing:
542899543Sdan#
642899543Sdan#    May you do good and not evil.
742899543Sdan#    May you find forgiveness for yourself and forgive others.
842899543Sdan#    May you share freely, never taking more than you give.
942899543Sdan#
1042899543Sdan#*************************************************************************
1142899543Sdan# This file implements regression tests for SQLite library.  The
1242899543Sdan# focus of this script is testing the FTS3 module.
1342899543Sdan#
1442899543Sdan
1542899543Sdanset testdir [file dirname $argv0]
1642899543Sdansource $testdir/tester.tcl
1742899543Sdanset ::testprefix fts3join
1842899543Sdan
1942899543Sdan# If SQLITE_ENABLE_FTS3 is defined, omit this file.
2042899543Sdanifcapable !fts3 {
2142899543Sdan  finish_test
2242899543Sdan  return
2342899543Sdan}
2442899543Sdan
2542899543Sdando_execsql_test 1.0 {
2642899543Sdan  CREATE VIRTUAL TABLE ft1 USING fts4(x);
2742899543Sdan  INSERT INTO ft1 VALUES('aaa aaa');
2842899543Sdan  INSERT INTO ft1 VALUES('aaa bbb');
2942899543Sdan  INSERT INTO ft1 VALUES('bbb aaa');
3042899543Sdan  INSERT INTO ft1 VALUES('bbb bbb');
3142899543Sdan
3242899543Sdan  CREATE TABLE t1(id, y);
3342899543Sdan  INSERT INTO t1 VALUES(1, 'aaa');
3442899543Sdan  INSERT INTO t1 VALUES(2, 'bbb');
3542899543Sdan}
3642899543Sdan
3742899543Sdando_execsql_test 1.1 {
3842899543Sdan  SELECT docid FROM ft1, t1 WHERE ft1 MATCH y AND id=1;
3942899543Sdan} {1 2 3}
4042899543Sdan
4142899543Sdando_execsql_test 1.2 {
4242899543Sdan  SELECT docid FROM ft1, t1 WHERE ft1 MATCH y AND id=1 ORDER BY docid;
4342899543Sdan} {1 2 3}
4442899543Sdan
4542899543Sdando_execsql_test 2.0 {
4642899543Sdan  CREATE VIRTUAL TABLE ft2 USING fts4(x);
4742899543Sdan  CREATE VIRTUAL TABLE ft3 USING fts4(y);
4842899543Sdan
4942899543Sdan  INSERT INTO ft2 VALUES('abc');
5042899543Sdan  INSERT INTO ft2 VALUES('def');
5142899543Sdan  INSERT INTO ft3 VALUES('ghi');
5242899543Sdan  INSERT INTO ft3 VALUES('abc');
5342899543Sdan}
5442899543Sdan
5542899543Sdando_execsql_test 2.1 { SELECT * FROM ft2, ft3 WHERE x MATCH y; } {abc abc}
5642899543Sdando_execsql_test 2.2 { SELECT * FROM ft2, ft3 WHERE y MATCH x; } {abc abc}
5742899543Sdando_execsql_test 2.3 { SELECT * FROM ft3, ft2 WHERE x MATCH y; } {abc abc}
5842899543Sdando_execsql_test 2.4 { SELECT * FROM ft3, ft2 WHERE y MATCH x; } {abc abc}
5942899543Sdan
6042899543Sdando_catchsql_test 2.5 {
6142899543Sdan  SELECT * FROM ft3, ft2 WHERE y MATCH x AND x MATCH y;
6269014393Sdan} {1 {unable to use function MATCH in the requested context}}
6342899543Sdan
64210ec4c8Sdando_execsql_test 3.0 {
65210ec4c8Sdan  CREATE VIRTUAL TABLE vt USING fts3(x);
66210ec4c8Sdan  INSERT INTO vt VALUES('abc');
67210ec4c8Sdan  INSERT INTO vt VALUES('xyz');
68210ec4c8Sdan
69210ec4c8Sdan  CREATE TABLE tt(a INTEGER PRIMARY KEY);
70210ec4c8Sdan  INSERT INTO tt VALUES(1), (2);
71210ec4c8Sdan}
72210ec4c8Sdan
73210ec4c8Sdando_execsql_test 3.1 {
74210ec4c8Sdan  SELECT * FROM tt LEFT JOIN (
75210ec4c8Sdan    SELECT rowid AS rrr, * FROM vt WHERE vt MATCH 'abc'
76210ec4c8Sdan  ) ON tt.a = rrr
77210ec4c8Sdan} {1 1 abc 2 {} {}}
78210ec4c8Sdan
79210ec4c8Sdando_execsql_test 3.2 {
80210ec4c8Sdan  SELECT * FROM tt LEFT JOIN vt ON (vt MATCH 'abc')
81210ec4c8Sdan} {1 abc 2 abc}
82210ec4c8Sdan
8346133d98Sdan#-------------------------------------------------------------------------
8446133d98Sdan# Test that queries of the form found in test case 4.2 use an automatic
8546133d98Sdan# index to avoid running multiple fts queries.
8646133d98Sdan#
8746133d98Sdando_execsql_test 4.1 {
8846133d98Sdan  CREATE VIRTUAL TABLE ft4 USING fts3(x);
8946133d98Sdan  CREATE TABLE t4(y, z);
9046133d98Sdan  CREATE INDEX t4y ON t1(y);
9146133d98Sdan}
9246133d98Sdan
9346133d98Sdando_eqp_test 4.2 {
9446133d98Sdan  SELECT * FROM t4 LEFT JOIN (
9546133d98Sdan      SELECT docid, * FROM ft4 WHERE ft4 MATCH ?
9646133d98Sdan  ) AS rr ON t4.rowid=rr.docid
9746133d98Sdan  WHERE t4.y = ?;
9846133d98Sdan} {
99b3f0276bSdrh  QUERY PLAN
1008210233cSdrh  |--MATERIALIZE rr
1018210233cSdrh  |  `--SCAN ft4 VIRTUAL TABLE INDEX 3:
1028210233cSdrh  |--SCAN t4
103*c583719bSdrh  `--SEARCH rr USING AUTOMATIC COVERING INDEX (docid=?) LEFT-JOIN
10446133d98Sdan}
105210ec4c8Sdan
10642899543Sdanfinish_test
107