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