Datum
txtidx_in(PG_FUNCTION_ARGS)
{
- char *buf = (char *) PG_GETARG_POINTER(0);
+ char *buf = PG_GETARG_CSTRING(0);
TI_IN_STATE state;
WordEntry *arr;
int4 len = 0,
Datum
txtidxsize(PG_FUNCTION_ARGS)
{
- txtidx *in = (txtidx *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
+ txtidx *in = (txtidx *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
int4 ret = in->size;
PG_FREE_IF_COPY(in, 0);
Datum
txtidx_out(PG_FUNCTION_ARGS)
{
- txtidx *out = (txtidx *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
+ txtidx *out = (txtidx *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
char *outbuf;
int4 i,
j,
Datum
txt2txtidx(PG_FUNCTION_ARGS)
{
- text *in = (text *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
+ text *in = PG_GETARG_TEXT_P(0);
PRSTEXT prs;
txtidx *out = NULL;
PRSTEXT prs;
Datum datum = (Datum) 0;
-
if (!CALLED_AS_TRIGGER(fcinfo))
elog(ERROR, "TSearch: Not fired by trigger manager");
elog(ERROR, "TSearch: format tsearch(txtidx_field, text_field1,...)");
numidxattr = SPI_fnumber(rel->rd_att, trigger->tgargs[0]);
- if (numidxattr < 0)
+ if (numidxattr == SPI_ERROR_NOATTRIBUTE)
elog(ERROR, "TSearch: Can not find txtidx_field");
prs.lenwords = 32;
/* find all words in indexable column */
for (i = 1; i < trigger->tgnargs; i++)
{
- int4 numattr;
- text *txt_toasted,
- *txt;
- bool isnull;
+ int numattr;
Oid oidtype;
+ Datum txt_datum;
+ bool isnull;
+ text *txt;
numattr = SPI_fnumber(rel->rd_att, trigger->tgargs[i]);
+ if (numattr == SPI_ERROR_NOATTRIBUTE)
+ {
+ elog(WARNING, "TSearch: can not find field '%s'",
+ trigger->tgargs[i]);
+ continue;
+ }
oidtype = SPI_gettypeid(rel->rd_att, numattr);
- if (numattr < 0 || (!(oidtype == TEXTOID || oidtype == VARCHAROID)))
+ /* We assume char() and varchar() are binary-equivalent to text */
+ if (!(oidtype == TEXTOID ||
+ oidtype == VARCHAROID ||
+ oidtype == BPCHAROID))
{
- elog(WARNING, "TSearch: can not find field '%s'", trigger->tgargs[i]);
+ elog(WARNING, "TSearch: '%s' is not of character type",
+ trigger->tgargs[i]);
continue;
}
- txt_toasted = (text *) DatumGetPointer(SPI_getbinval(rettuple, rel->rd_att, numattr, &isnull));
+ txt_datum = SPI_getbinval(rettuple, rel->rd_att, numattr, &isnull);
if (isnull)
continue;
- txt = (text *) DatumGetPointer(PG_DETOAST_DATUM(PointerGetDatum(txt_toasted)));
+ txt = DatumGetTextP(txt_datum);
parsetext(&prs, VARDATA(txt), VARSIZE(txt) - VARHDRSZ);
- if (txt != txt_toasted)
- pfree(txt);
}
/* make txtidx value */