Wednesday, July 16, 2008

[HACKERS] small bug in hlCover

Index: src/backend/tsearch/wparser_def.c
===================================================================
RCS file: /home/postgres/devel/pgsql-cvs/pgsql/src/backend/tsearch/wparser_def.c,v
retrieving revision 1.15
diff -c -r1.15 wparser_def.c
*** src/backend/tsearch/wparser_def.c 17 Jun 2008 16:09:06 -0000 1.15
--- src/backend/tsearch/wparser_def.c 17 Jul 2008 02:45:34 -0000
***************
*** 1621,1627 ****
QueryItem *item = GETQUERY(query);
int pos = *p;

! *q = 0;
*p = 0x7fffffff;

for (j = 0; j < query->size; j++)
--- 1621,1627 ----
QueryItem *item = GETQUERY(query);
int pos = *p;

! *q = -1;
*p = 0x7fffffff;

for (j = 0; j < query->size; j++)
***************
*** 1643,1649 ****
item++;
}

! if (*q == 0)
return false;

item = GETQUERY(query);
--- 1643,1649 ----
item++;
}

! if (*q < 0)
return false;

item = GETQUERY(query);
I think there is a slight bug in hlCover function in wparser_def.c

If there is only one query item and that is the first word in the text,
then hlCover does not returns any cover. This is evident in this example
when ts_headline only generates the min_words:

testdb=# select ts_headline('1 2 3 4 5 6 7 8 9 10','1'::tsquery,
'MinWords=5');
ts_headline
------------------
<b>1</b> 2 3 4 5
(1 row)

The problem is that *q is initialized to 0 which is a legitimate value
for a cover. So I have attached a patch that fixes it and after applying
the patch here is the result.

testdb=# select ts_headline('1 2 3 4 5 6 7 8 9 10','1'::tsquery,
'MinWords=5');
ts_headline
-----------------------------
<b>1</b> 2 3 4 5 6 7 8 9 10
(1 row)

-Sushant.

No comments: