aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/fts3/fts3_snippet.c55
-rw-r--r--manifest16
-rw-r--r--manifest.uuid2
-rw-r--r--test/fts3matchinfo.test63
4 files changed, 127 insertions, 9 deletions
diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c
index 84f0079fb..6abb169eb 100644
--- a/ext/fts3/fts3_snippet.c
+++ b/ext/fts3/fts3_snippet.c
@@ -27,6 +27,7 @@
#define FTS3_MATCHINFO_LENGTH 'l' /* nCol values */
#define FTS3_MATCHINFO_LCS 's' /* nCol values */
#define FTS3_MATCHINFO_HITS 'x' /* 3*nCol*nPhrase values */
+#define FTS3_MATCHINFO_LHITS 'y' /* nCol*nPhrase values */
/*
** The default value for the second argument to matchinfo().
@@ -809,6 +810,51 @@ static int fts3ExprLocalHitsCb(
return rc;
}
+/*
+** fts3ExprIterate() callback used to gather information for the matchinfo
+** directive 'y'.
+*/
+static int fts3ExprLHitsCb(
+ Fts3Expr *pExpr, /* Phrase expression node */
+ int iPhrase, /* Phrase number */
+ void *pCtx /* Pointer to MatchInfo structure */
+){
+ MatchInfo *p = (MatchInfo *)pCtx;
+ Fts3Table *pTab = (Fts3Table *)p->pCursor->base.pVtab;
+ int rc = SQLITE_OK;
+ int iStart = iPhrase * p->nCol;
+ Fts3Expr *pEof; /* Ancestor node already at EOF */
+
+ /* This must be a phrase */
+ assert( pExpr->pPhrase );
+
+ /* Initialize all output integers to zero. */
+ memset(&p->aMatchinfo[iStart], 0, sizeof(u32) * p->nCol);
+
+ /* Check if this or any parent node is at EOF. If so, then all output
+ ** values are zero. */
+ for(pEof=pExpr; pEof && pEof->bEof==0; pEof=pEof->pParent);
+
+ if( pEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
+ char *pIter = pPhrase->doclist.pList;
+ int iCol = 0;
+
+ while( 1 ){
+ int nHit = fts3ColumnlistCount(&pIter);
+ if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){
+ p->aMatchinfo[iStart + iCol] = (u32)nHit;
+ }
+ assert( *pIter==0x00 || *pIter==0x01 );
+ if( *pIter!=0x01 ) break;
+ pIter++;
+ pIter += fts3GetVarint32(pIter, &iCol);
+ }
+ }
+
+ return rc;
+}
+
static int fts3MatchinfoCheck(
Fts3Table *pTab,
char cArg,
@@ -821,6 +867,7 @@ static int fts3MatchinfoCheck(
|| (cArg==FTS3_MATCHINFO_LENGTH && pTab->bHasDocsize)
|| (cArg==FTS3_MATCHINFO_LCS)
|| (cArg==FTS3_MATCHINFO_HITS)
+ || (cArg==FTS3_MATCHINFO_LHITS)
){
return SQLITE_OK;
}
@@ -844,6 +891,10 @@ static int fts3MatchinfoSize(MatchInfo *pInfo, char cArg){
nVal = pInfo->nCol;
break;
+ case FTS3_MATCHINFO_LHITS:
+ nVal = pInfo->nCol * pInfo->nPhrase;
+ break;
+
default:
assert( cArg==FTS3_MATCHINFO_HITS );
nVal = pInfo->nCol * pInfo->nPhrase * 3;
@@ -1098,6 +1149,10 @@ static int fts3MatchinfoValues(
}
break;
+ case FTS3_MATCHINFO_LHITS:
+ (void)fts3ExprIterate(pCsr->pExpr, fts3ExprLHitsCb, (void*)pInfo);
+ break;
+
default: {
Fts3Expr *pExpr;
assert( zArg[i]==FTS3_MATCHINFO_HITS );
diff --git a/manifest b/manifest
index 048dee03a..5a6a6d5db 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Improvements\sto\sfuzzershell:\sAvoid\sexcess\smemory\sallocations\swhen\sloading\nmany\sfiles.\s\sShow\sthe\stotal\sruntime\son\sfinal\soutput.\s\sShow\sindividual\sfilenames\nas\sthey\sare\sprocessed\seven\sif\sthey\sare\ssingle\stest-case\sfiles.
-D 2015-05-02T19:54:35.010
+C Add\sthe\s'y'\sflag\sto\sthe\sfts3/4\smatchinfo()\sfunction.
+D 2015-05-04T12:29:50.452
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in e628c50e237251fc7e768bef14ee7e822ad69e69
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -87,7 +87,7 @@ F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60
F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf
F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5
F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009
-F ext/fts3/fts3_snippet.c 0ce4ee2451b9f3603a1693ef9779bb0fb662a9fe
+F ext/fts3/fts3_snippet.c 40a96ba78e90aba7d7d6d014a18049bb218060fd
F ext/fts3/fts3_term.c 88c55a6fa1a51ab494e33dced0401a6c28791fd7
F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038
F ext/fts3/fts3_tokenize_vtab.c a27593ab19657166f6fa5ec073b678cc29a75860
@@ -593,7 +593,7 @@ F test/fts3fault2.test f953bb3cf903988172270a9a0aafd5a890b0f98f
F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641
F test/fts3join.test 53e66a0c21eb568580674a43b21c059acb26f499
F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6
-F test/fts3matchinfo.test 58544fa4d254000fa4e7f494b0a832f7ba61d45e
+F test/fts3matchinfo.test 3e5f5ac2e0a8ba42eafd4c685f803ca48b4c3a83
F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905
F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2
F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce
@@ -1256,7 +1256,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 803cb60e75e0b09a526eefec11139cb3e8ae8c7c
-R a10ebc5ebd493f767d287662e8eaf180
-U drh
-Z 6cb1cc7bdaf6b986d5c102ca2fc3f2f8
+P 34a722a2f3331c35211526c9ec055d4d9175c965 92941609af74044b3078e020324a37b04a0638b0
+R 71ef49d23aad2e8535dc13355beddfea
+U dan
+Z bf853cedbb560aa2e1e2dcc7ad4c0efb
diff --git a/manifest.uuid b/manifest.uuid
index 356c6a518..db0c756ed 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-34a722a2f3331c35211526c9ec055d4d9175c965 \ No newline at end of file
+aef1e8f47123e2e865432a0abf194dea4f23447a \ No newline at end of file
diff --git a/test/fts3matchinfo.test b/test/fts3matchinfo.test
index 36c912111..2681d0068 100644
--- a/test/fts3matchinfo.test
+++ b/test/fts3matchinfo.test
@@ -449,5 +449,68 @@ do_execsql_test 10.1 {
ORDER BY 1;
} {1 1 one 2 2 two 3 3 three}
+#---------------------------------------------------------------------------
+# Test the 'y' matchinfo flag
+#
+set sqlite_fts3_enable_parentheses 1
+reset_db
+do_execsql_test 11.0 {
+ CREATE VIRTUAL TABLE tt USING fts3(x, y);
+ INSERT INTO tt VALUES('c d a c d d', 'e a g b d a'); -- 1
+ INSERT INTO tt VALUES('c c g a e b', 'c g d g e c'); -- 2
+ INSERT INTO tt VALUES('b e f d e g', 'b a c b c g'); -- 3
+ INSERT INTO tt VALUES('a c f f g d', 'd b f d e g'); -- 4
+ INSERT INTO tt VALUES('g a c f c f', 'd g g b c c'); -- 5
+ INSERT INTO tt VALUES('g a c e b b', 'd b f b g g'); -- 6
+ INSERT INTO tt VALUES('f d a a f c', 'e e a d c f'); -- 7
+ INSERT INTO tt VALUES('a c b b g f', 'a b a e d f'); -- 8
+ INSERT INTO tt VALUES('b a f e c c', 'f d b b a b'); -- 9
+ INSERT INTO tt VALUES('f d c e a c', 'f a f a a f'); -- 10
+}
+
+db func mit mit
+foreach {tn expr res} {
+ 1 "a" {
+ 1 {1 2} 2 {1 0} 3 {0 1} 4 {1 0} 5 {1 0}
+ 6 {1 0} 7 {2 1} 8 {1 2} 9 {1 1} 10 {1 3}
+ }
+
+ 2 "b" {
+ 1 {0 1} 2 {1 0} 3 {1 2} 4 {0 1} 5 {0 1}
+ 6 {2 2} 8 {2 1} 9 {1 3}
+ }
+
+ 3 "y:a" {
+ 1 {0 2} 3 {0 1}
+ 7 {0 1} 8 {0 2} 9 {0 1} 10 {0 3}
+ }
+
+ 4 "x:a" {
+ 1 {1 0} 2 {1 0} 4 {1 0} 5 {1 0}
+ 6 {1 0} 7 {2 0} 8 {1 0} 9 {1 0} 10 {1 0}
+ }
+
+ 5 "a OR b" {
+ 1 {1 2 0 1} 2 {1 0 1 0} 3 {0 1 1 2} 4 {1 0 0 1} 5 {1 0 0 1}
+ 6 {1 0 2 2} 7 {2 1 0 0} 8 {1 2 2 1} 9 {1 1 1 3} 10 {1 3 0 0}
+ }
+
+ 6 "a AND b" {
+ 1 {1 2 0 1} 2 {1 0 1 0} 3 {0 1 1 2} 4 {1 0 0 1} 5 {1 0 0 1}
+ 6 {1 0 2 2} 8 {1 2 2 1} 9 {1 1 1 3}
+ }
+
+ 7 "a OR (a AND b)" {
+ 1 {1 2 1 2 0 1} 2 {1 0 1 0 1 0} 3 {0 1 0 1 1 2} 4 {1 0 1 0 0 1}
+ 5 {1 0 1 0 0 1} 6 {1 0 1 0 2 2} 7 {2 1 0 0 0 0} 8 {1 2 1 2 2 1}
+ 9 {1 1 1 1 1 3} 10 {1 3 0 0 0 0}
+ }
+
+} {
+ do_execsql_test 11.1.$tn {
+ SELECT rowid, mit(matchinfo(tt, 'y')) FROM tt WHERE tt MATCH $expr
+ } $res
+}
+set sqlite_fts3_enable_parentheses 0
finish_test