/*
* make value of tsvector, given parsed text
+ *
+ * Note: frees prs->words and subsidiary data.
*/
TSVector
make_tsvector(ParsedText *prs)
char *str;
int stroff;
- prs->curwords = uniqueWORD(prs->words, prs->curwords);
+ /* Merge duplicate words */
+ if (prs->curwords > 0)
+ prs->curwords = uniqueWORD(prs->words, prs->curwords);
+
+ /* Determine space needed */
for (i = 0; i < prs->curwords; i++)
{
lenstr += prs->words[i].len;
ptr->haspos = 0;
ptr++;
}
- pfree(prs->words);
+
+ if (prs->words)
+ pfree(prs->words);
+
return in;
}
prs.lenwords = VARSIZE_ANY_EXHDR(in) / 6; /* just estimation of word's
* number */
- if (prs.lenwords == 0)
+ if (prs.lenwords < 2)
prs.lenwords = 2;
prs.curwords = 0;
prs.pos = 0;
prs.words = (ParsedWord *) palloc(sizeof(ParsedWord) * prs.lenwords);
parsetext(cfgId, &prs, VARDATA_ANY(in), VARSIZE_ANY_EXHDR(in));
+
PG_FREE_IF_COPY(in, 1);
- if (prs.curwords)
- out = make_tsvector(&prs);
- else
- {
- pfree(prs.words);
- out = palloc(CALCDATASIZE(0, 0));
- SET_VARSIZE(out, CALCDATASIZE(0, 0));
- out->size = 0;
- }
+ out = make_tsvector(&prs);
- PG_RETURN_POINTER(out);
+ PG_RETURN_TSVECTOR(out);
}
Datum
iterate_jsonb_string_values(jb, &state, add_to_tsvector);
- if (prs.curwords > 0)
- result = make_tsvector(&prs);
- else
- {
- /*
- * There weren't any string elements in jsonb, so we need to return an
- * empty vector
- */
- result = palloc(CALCDATASIZE(0, 0));
- SET_VARSIZE(result, CALCDATASIZE(0, 0));
- result->size = 0;
- }
-
PG_FREE_IF_COPY(jb, 1);
+ result = make_tsvector(&prs);
+
PG_RETURN_TSVECTOR(result);
}
iterate_json_string_values(json, &state, add_to_tsvector);
- if (prs.curwords > 0)
- result = make_tsvector(&prs);
- else
- {
- /*
- * There weren't any string elements in json, so we need to return an
- * empty vector
- */
- result = palloc(CALCDATASIZE(0, 0));
- SET_VARSIZE(result, CALCDATASIZE(0, 0));
- result->size = 0;
- }
-
PG_FREE_IF_COPY(json, 1);
+ result = make_tsvector(&prs);
+
PG_RETURN_TSVECTOR(result);
}
}
/* make tsvector value */
- if (prs.curwords)
- {
- datum = PointerGetDatum(make_tsvector(&prs));
- isnull = false;
- rettuple = heap_modify_tuple_by_cols(rettuple, rel->rd_att,
- 1, &tsvector_attr_num,
- &datum, &isnull);
- pfree(DatumGetPointer(datum));
- }
- else
- {
- TSVector out = palloc(CALCDATASIZE(0, 0));
-
- SET_VARSIZE(out, CALCDATASIZE(0, 0));
- out->size = 0;
- datum = PointerGetDatum(out);
- isnull = false;
- rettuple = heap_modify_tuple_by_cols(rettuple, rel->rd_att,
- 1, &tsvector_attr_num,
- &datum, &isnull);
- pfree(prs.words);
- }
+ datum = TSVectorGetDatum(make_tsvector(&prs));
+ isnull = false;
+
+ /* and insert it into tuple */
+ rettuple = heap_modify_tuple_by_cols(rettuple, rel->rd_att,
+ 1, &tsvector_attr_num,
+ &datum, &isnull);
+
+ pfree(DatumGetPointer(datum));
return PointerGetDatum(rettuple);
}