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