Two identical structs are defined and used interchangeably in tsearch:
HeadlineParsedText and HeadlineText, along with corresponding
HeadlineWord and HeadlineWordEntry sub-structs. In the contrib version
this struct only appeared once, and was called HLPRSTEXT, so apparently
that was accidentally moved and renamed twice.
Here's a patch to unite them again.
--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com
Index: src/backend/tsearch/ts_parse.c
===================================================================
RCS file: /home/hlinnaka/pgcvsrepository/pgsql/src/backend/tsearch/ts_parse.c,v
retrieving revision 1.1
diff -c -r1.1 ts_parse.c
*** src/backend/tsearch/ts_parse.c 21 Aug 2007 01:11:18 -0000 1.1
--- src/backend/tsearch/ts_parse.c 24 Aug 2007 14:29:21 -0000
***************
*** 427,440 ****
* Headline framework
*/
static void
! hladdword(HeadlineText * prs, char *buf, int4 buflen, int type)
{
while (prs->curwords >= prs->lenwords)
{
prs->lenwords *= 2;
! prs->words = (HeadlineWord *) repalloc((void *) prs->words, prs->lenwords * sizeof(HeadlineWord));
}
! memset(&(prs->words[prs->curwords]), 0, sizeof(HeadlineWord));
prs->words[prs->curwords].type = (uint8) type;
prs->words[prs->curwords].len = buflen;
prs->words[prs->curwords].word = palloc(buflen);
--- 427,440 ----
* Headline framework
*/
static void
! hladdword(HeadlineParsedText * prs, char *buf, int4 buflen, int type)
{
while (prs->curwords >= prs->lenwords)
{
prs->lenwords *= 2;
! prs->words = (HeadlineWordEntry *) repalloc((void *) prs->words, prs->lenwords * sizeof(HeadlineWordEntry));
}
! memset(&(prs->words[prs->curwords]), 0, sizeof(HeadlineWordEntry));
prs->words[prs->curwords].type = (uint8) type;
prs->words[prs->curwords].len = buflen;
prs->words[prs->curwords].word = palloc(buflen);
***************
*** 443,458 ****
}
static void
! hlfinditem(HeadlineText * prs, TSQuery query, char *buf, int buflen)
{
int i;
QueryItem *item = GETQUERY(query);
! HeadlineWord *word;
while (prs->curwords + query->size >= prs->lenwords)
{
prs->lenwords *= 2;
! prs->words = (HeadlineWord *) repalloc((void *) prs->words, prs->lenwords * sizeof(HeadlineWord));
}
word = &(prs->words[prs->curwords - 1]);
--- 443,458 ----
}
static void
! hlfinditem(HeadlineParsedText * prs, TSQuery query, char *buf, int buflen)
{
int i;
QueryItem *item = GETQUERY(query);
! HeadlineWordEntry *word;
while (prs->curwords + query->size >= prs->lenwords)
{
prs->lenwords *= 2;
! prs->words = (HeadlineWordEntry *) repalloc((void *) prs->words, prs->lenwords * sizeof(HeadlineWordEntry));
}
word = &(prs->words[prs->curwords - 1]);
***************
*** 462,468 ****
{
if (word->item)
{
! memcpy(&(prs->words[prs->curwords]), word, sizeof(HeadlineWord));
prs->words[prs->curwords].item = item;
prs->words[prs->curwords].repeated = 1;
prs->curwords++;
--- 462,468 ----
{
if (word->item)
{
! memcpy(&(prs->words[prs->curwords]), word, sizeof(HeadlineWordEntry));
prs->words[prs->curwords].item = item;
prs->words[prs->curwords].repeated = 1;
prs->curwords++;
***************
*** 475,481 ****
}
static void
! addHLParsedLex(HeadlineText * prs, TSQuery query, ParsedLex * lexs, TSLexeme * norms)
{
ParsedLex *tmplexs;
TSLexeme *ptr;
--- 475,481 ----
}
static void
! addHLParsedLex(HeadlineParsedText * prs, TSQuery query, ParsedLex * lexs, TSLexeme * norms)
{
ParsedLex *tmplexs;
TSLexeme *ptr;
***************
*** 511,517 ****
}
void
! hlparsetext(Oid cfgId, HeadlineText * prs, TSQuery query, char *buf, int4 buflen)
{
int type,
lenlemm;
--- 511,517 ----
}
void
! hlparsetext(Oid cfgId, HeadlineParsedText * prs, TSQuery query, char *buf, int4 buflen)
{
int type,
lenlemm;
***************
*** 571,582 ****
}
text *
! generatHeadline(HeadlineText * prs)
{
text *out;
int len = 128;
char *ptr;
! HeadlineWord *wrd = prs->words;
out = (text *) palloc(len);
ptr = ((char *) out) + VARHDRSZ;
--- 571,582 ----
}
text *
! generatHeadline(HeadlineParsedText * prs)
{
text *out;
int len = 128;
char *ptr;
! HeadlineWordEntry *wrd = prs->words;
out = (text *) palloc(len);
ptr = ((char *) out) + VARHDRSZ;
Index: src/backend/tsearch/wparser.c
===================================================================
RCS file: /home/hlinnaka/pgcvsrepository/pgsql/src/backend/tsearch/wparser.c,v
retrieving revision 1.2
diff -c -r1.2 wparser.c
*** src/backend/tsearch/wparser.c 22 Aug 2007 01:39:45 -0000 1.2
--- src/backend/tsearch/wparser.c 24 Aug 2007 14:29:43 -0000
***************
*** 300,306 ****
text *in = PG_GETARG_TEXT_P(1);
TSQuery query = PG_GETARG_TSQUERY(2);
text *opt = (PG_NARGS() > 3 && PG_GETARG_POINTER(3)) ? PG_GETARG_TEXT_P(3) : NULL;
! HeadlineText prs;
List *prsoptions;
text *out;
TSConfigCacheEntry *cfg;
--- 300,306 ----
text *in = PG_GETARG_TEXT_P(1);
TSQuery query = PG_GETARG_TSQUERY(2);
text *opt = (PG_NARGS() > 3 && PG_GETARG_POINTER(3)) ? PG_GETARG_TEXT_P(3) : NULL;
! HeadlineParsedText prs;
List *prsoptions;
text *out;
TSConfigCacheEntry *cfg;
***************
*** 309,317 ****
cfg = lookup_ts_config_cache(PG_GETARG_OID(0));
prsobj = lookup_ts_parser_cache(cfg->prsId);
! memset(&prs, 0, sizeof(HeadlineText));
prs.lenwords = 32;
! prs.words = (HeadlineWord *) palloc(sizeof(HeadlineWord) * prs.lenwords);
hlparsetext(cfg->cfgId, &prs, query, VARDATA(in), VARSIZE(in) - VARHDRSZ);
--- 309,317 ----
cfg = lookup_ts_config_cache(PG_GETARG_OID(0));
prsobj = lookup_ts_parser_cache(cfg->prsId);
! memset(&prs, 0, sizeof(HeadlineParsedText));
prs.lenwords = 32;
! prs.words = (HeadlineWordEntry *) palloc(sizeof(HeadlineWordEntry) * prs.lenwords);
hlparsetext(cfg->cfgId, &prs, query, VARDATA(in), VARSIZE(in) - VARHDRSZ);
Index: src/include/tsearch/ts_utils.h
===================================================================
RCS file: /home/hlinnaka/pgcvsrepository/pgsql/src/include/tsearch/ts_utils.h,v
retrieving revision 1.1
diff -c -r1.1 ts_utils.h
*** src/include/tsearch/ts_utils.h 21 Aug 2007 01:11:29 -0000 1.1
--- src/include/tsearch/ts_utils.h 24 Aug 2007 14:31:41 -0000
***************
*** 13,18 ****
--- 13,19 ----
#define _PG_TS_UTILS_H_
#include "tsearch/ts_type.h"
+ #include "tsearch/ts_public.h"
/*
* Common parse definitions for tsvector and tsquery
***************
*** 105,137 ****
* 3 generatHeadline to generate result text
*/
! typedef struct
! {
! uint32 selected:1,
! in:1,
! replace:1,
! repeated:1,
! unused:4,
! type:8,
! len:16;
! char *word;
! QueryItem *item;
! } HeadlineWord;
!
! typedef struct
! {
! HeadlineWord *words;
! int4 lenwords;
! int4 curwords;
! char *startsel;
! char *stopsel;
! int2 startsellen;
! int2 stopsellen;
! } HeadlineText;
!
! extern void hlparsetext(Oid cfgId, HeadlineText * prs, TSQuery query,
char *buf, int4 buflen);
! extern text *generatHeadline(HeadlineText * prs);
/*
* token/node types for parsing
--- 106,114 ----
* 3 generatHeadline to generate result text
*/
! extern void hlparsetext(Oid cfgId, HeadlineParsedText * prs, TSQuery query,
char *buf, int4 buflen);
! extern text *generatHeadline(HeadlineParsedText * prs);
/*
* token/node types for parsing