diff options
Diffstat (limited to 'src/backend/tsearch/wparser_def.c')
| -rw-r--r-- | src/backend/tsearch/wparser_def.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/backend/tsearch/wparser_def.c b/src/backend/tsearch/wparser_def.c index 4a28ce7545..2faa15ebd4 100644 --- a/src/backend/tsearch/wparser_def.c +++ b/src/backend/tsearch/wparser_def.c @@ -2030,15 +2030,36 @@ typedef struct } hlCheck; static bool -checkcondition_HL(void *checkval, QueryOperand *val) +checkcondition_HL(void *opaque, QueryOperand *val, ExecPhraseData *data) { int i; + hlCheck *checkval = (hlCheck *) opaque; - for (i = 0; i < ((hlCheck *) checkval)->len; i++) + for (i = 0; i < checkval->len; i++) { - if (((hlCheck *) checkval)->words[i].item == val) - return true; + if (checkval->words[i].item == val) + { + /* don't need to find all positions */ + if (!data) + return true; + + if (!data->pos) + { + data->pos = palloc(sizeof(WordEntryPos) * checkval->len); + data->allocated = true; + data->npos = 1; + data->pos[0] = checkval->words[i].pos; + } + else if (data->pos[data->npos - 1] < checkval->words[i].pos) + { + data->pos[data->npos++] = checkval->words[i].pos; + } + } } + + if (data && data->npos > 0) + return true; + return false; } @@ -2400,7 +2421,7 @@ mark_hl_words(HeadlineParsedText *prs, TSQuery query, int highlight, if (poslen < bestlen && !(NOENDTOKEN(prs->words[beste].type) || prs->words[beste].len <= shortword)) { - /* best already finded, so try one more cover */ + /* best already found, so try one more cover */ p++; continue; } |
