xref: /sqlite-3.40.0/test/fts3first.test (revision 97439483)
13f1ea8d1Sdan# 2011 October 18
23f1ea8d1Sdan#
33f1ea8d1Sdan# The author disclaims copyright to this source code.  In place of
43f1ea8d1Sdan# a legal notice, here is a blessing:
53f1ea8d1Sdan#
63f1ea8d1Sdan#    May you do good and not evil.
73f1ea8d1Sdan#    May you find forgiveness for yourself and forgive others.
83f1ea8d1Sdan#    May you share freely, never taking more than you give.
93f1ea8d1Sdan#
103f1ea8d1Sdan#***********************************************************************
113f1ea8d1Sdan
123f1ea8d1Sdanset testdir [file dirname $argv0]
133f1ea8d1Sdansource $testdir/tester.tcl
143f1ea8d1Sdansource $testdir/malloc_common.tcl
153f1ea8d1Sdan
163f1ea8d1Sdanifcapable !fts3 {
173f1ea8d1Sdan  finish_test
183f1ea8d1Sdan  return
193f1ea8d1Sdan}
203f1ea8d1Sdan
21*97439483Sdanset testprefix fts3first
22*97439483Sdan
2350a7544dSdanproc lreverse {L} {
2450a7544dSdan  set res [list]
2550a7544dSdan  for {set ii [expr [llength $L]-1]} {$ii>=0} {incr ii -1} {
2650a7544dSdan    lappend res [lindex $L $ii]
2750a7544dSdan  }
2850a7544dSdan  set res
2950a7544dSdan}
3050a7544dSdan
318653fa85Sdanproc mit {blob} {
328653fa85Sdan  set scan(littleEndian) i*
338653fa85Sdan  set scan(bigEndian) I*
348653fa85Sdan  binary scan $blob $scan($::tcl_platform(byteOrder)) r
358653fa85Sdan  return $r
368653fa85Sdan}
378653fa85Sdandb func mit mit
388653fa85Sdan
393f1ea8d1Sdando_execsql_test 1.0 {
403f1ea8d1Sdan  CREATE VIRTUAL TABLE x1 USING FTS4(a, b, c);
413f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(0, 'K H D S T', 'V M N Y K', 'S Z N Q S');
423f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(1, 'K N J L W', 'S Z W J Q', 'D U W S E');
433f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(2, 'B P M O I', 'R P H W S', 'R J L L E');
443f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(3, 'U R Q M L', 'M J K A V', 'Q W J T J');
453f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(4, 'N J C Y N', 'R U D X V', 'B O U A Q');
463f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(5, 'Q L X L U', 'I F N X S', 'U Q A N Y');
473f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(6, 'M R G U T', 'U V I Q P', 'X Y D L S');
483f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(7, 'D Y P O I', 'X J P K R', 'V O T H V');
493f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(8, 'R Y D L R', 'U U E S J', 'N W L M R');
503f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(9, 'Z P F N P', 'W A X D U', 'V A E Q A');
513f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(10, 'Q I A Q M', 'N D K H C', 'A H T Q Z');
523f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(11, 'T E R Q B', 'C I B C B', 'F Z U W R');
533f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(12, 'E S V U W', 'T P F W H', 'A M D J Q');
5450a7544dSdan  INSERT INTO x1(docid,a,b,c) VALUES(13, 'X S B X Y', 'U D N D P', 'X Z Y G F');
553f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(14, 'K H A B L', 'S R C C Z', 'D W E H J');
563f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(15, 'C E U C C', 'W F M N M', 'T Z U X T');
573f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(16, 'Q G C G H', 'H N N B H', 'B Q I H Y');
583f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(17, 'Q T S K B', 'W B D Y N', 'V J P E C');
593f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(18, 'A J M O Q', 'L G Y Y A', 'G N M R N');
603f1ea8d1Sdan  INSERT INTO x1(docid,a,b,c) VALUES(19, 'T R Y P Y', 'N V Y B X', 'L Z T N T');
613f1ea8d1Sdan
623f1ea8d1Sdan  CREATE VIRTUAL TABLE x2 USING FTS4(a, b, c, order=DESC);
633f1ea8d1Sdan  INSERT INTO x2(docid, a, b, c) SELECT docid, a, b, c FROM x1;
643f1ea8d1Sdan}
653f1ea8d1Sdan
6650a7544dSdan
678653fa85Sdan# Test queries.
688653fa85Sdan#
693f1ea8d1Sdanforeach x {1 2} {
703f1ea8d1Sdan  foreach {tn match res} {
713f1ea8d1Sdan    1  "^K"              {0 1 14}
723f1ea8d1Sdan    2  "^S"              {0 1 14}
733f1ea8d1Sdan    3  "^W"              {9 15 17}
743f1ea8d1Sdan    4  "^J"              {}
753f1ea8d1Sdan    5  "^E"              {12}
763f1ea8d1Sdan    6  "V ^-E"           {0 3 4 6 7 9 17 19}
773f1ea8d1Sdan    7  "V -^E"           {0 3 4 6 7 9 17 19}
783f1ea8d1Sdan    8  "^-E V"           {0 3 4 6 7 9 17 19}
793f1ea8d1Sdan    9  "-^E V"           {0 3 4 6 7 9 17 19}
803f1ea8d1Sdan    10 "V"               {0 3 4 6 7 9 12 17 19}
813f1ea8d1Sdan
823f1ea8d1Sdan    11 {"^K H"}          {0 14}
833f1ea8d1Sdan    12 {"K H"}           {0 10 14}
843f1ea8d1Sdan    13 {"K ^H"}          {}
853f1ea8d1Sdan  } {
8650a7544dSdan    set rev [lreverse $res]
873f1ea8d1Sdan    do_execsql_test 1.$x.$tn.1 {SELECT docid FROM x1 WHERE x1 MATCH $match} $res
883f1ea8d1Sdan    do_execsql_test 1.$x.$tn.2 {SELECT docid FROM x2 WHERE x2 MATCH $match} $rev
893f1ea8d1Sdan  }
903f1ea8d1Sdan
913f1ea8d1Sdan  do_execsql_test 1.$x.[expr $tn+1] {
923f1ea8d1Sdan    INSERT INTO x1(x1) VALUES('optimize');
933f1ea8d1Sdan    INSERT INTO x2(x2) VALUES('optimize');
943f1ea8d1Sdan  } {}
953f1ea8d1Sdan}
963f1ea8d1Sdan
978653fa85Sdan# Test the snippet() function.
988653fa85Sdan#
9950a7544dSdanforeach {tn match res} {
10050a7544dSdan  1  {^K}    {{[K] H D S T} {[K] N J L W} {[K] H A B L}}
10150a7544dSdan  2  {^X}    {{[X] Y D L S} {[X] J P K R} {[X] S B X Y}}
10250a7544dSdan  3  {^X Y}  {{[X] [Y] D L S} {D [Y] P O I...[X] J P K R} {[X] S B X [Y]}}
10350a7544dSdan} {
10450a7544dSdan  set rev [lreverse $res]
10550a7544dSdan
10650a7544dSdan  do_execsql_test 1.3.$tn.1 {
10750a7544dSdan    SELECT snippet(x1, '[', ']', '...') FROM x1 WHERE x1 MATCH $match
10850a7544dSdan  } $res
1098653fa85Sdan
11050a7544dSdan  do_execsql_test 1.3.$tn.2 {
11150a7544dSdan    SELECT snippet(x2, '[', ']', '...') FROM x2 WHERE x2 MATCH $match
11250a7544dSdan  } $rev
11350a7544dSdan}
11450a7544dSdan
1158653fa85Sdan# Test matchinfo().
1168653fa85Sdan#
1178653fa85Sdanforeach {tn match res} {
1188653fa85Sdan  1  {^K}    {
1198653fa85Sdan                {1 3 3 0 0 0 0 0 0}
1208653fa85Sdan                {1 3 3 0 0 0 0 0 0}
1218653fa85Sdan                {1 3 3 0 0 0 0 0 0}
1228653fa85Sdan             }
1238653fa85Sdan  2  {^X}    {
1248653fa85Sdan                {0 1 1 0 1 1 1 2 2}
1258653fa85Sdan                {0 1 1 1 1 1 0 2 2}
1268653fa85Sdan                {1 1 1 0 1 1 1 2 2}
1278653fa85Sdan             }
1288653fa85Sdan  3  {^X Y}  {
1298653fa85Sdan                {0 1 1 0 1 1 1 2 2 0 6 5 0 5 4 1 4 4}
1308653fa85Sdan                {0 1 1 1 1 1 0 2 2 1 6 5 0 5 4 0 4 4}
1318653fa85Sdan                {1 1 1 0 1 1 1 2 2 1 6 5 0 5 4 1 4 4}
1328653fa85Sdan             }
1338653fa85Sdan} {
1348653fa85Sdan  set rev [lreverse $res]
1358653fa85Sdan
1368653fa85Sdan  do_execsql_test 1.3.$tn.1 {
1378653fa85Sdan    SELECT mit(matchinfo(x1, 'x')) FROM x1 WHERE x1 MATCH $match
1388653fa85Sdan  } $res
1398653fa85Sdan  do_execsql_test 1.3.$tn.2 {
1408653fa85Sdan    SELECT mit(matchinfo(x2, 'x')) FROM x2 WHERE x2 MATCH $match
1418653fa85Sdan  } $rev
1428653fa85Sdan}
1438653fa85Sdan
144*97439483Sdan# Test that ^ is ignored for FTS3 tables.
145*97439483Sdan#
146*97439483Sdando_execsql_test 2.1 {
147*97439483Sdan  CREATE VIRTUAL TABLE x3 USING fts3;
148*97439483Sdan  INSERT INTO x3 VALUES('A B C');
149*97439483Sdan  INSERT INTO x3 VALUES('B A C');
150*97439483Sdan
151*97439483Sdan  CREATE VIRTUAL TABLE x4 USING fts4;
152*97439483Sdan  INSERT INTO x4 VALUES('A B C');
153*97439483Sdan  INSERT INTO x4 VALUES('B A C');
154*97439483Sdan}
155*97439483Sdan
156*97439483Sdando_execsql_test 2.2.1 {
157*97439483Sdan  SELECT * FROM x3 WHERE x3 MATCH '^A';
158*97439483Sdan} {{A B C} {B A C}}
159*97439483Sdando_execsql_test 2.2.2 {
160*97439483Sdan  SELECT * FROM x4 WHERE x4 MATCH '^A';
161*97439483Sdan} {{A B C}}
162*97439483Sdan
1633f1ea8d1Sdanfinish_test
164