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
---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to