Docbug, SPI_getbinval, triger example

Started by mlwabout 24 years ago2 messages
#1mlw
markw@mohawksoft.com

The docs suggest that this:

/* Get number of tuples in relation */
ret = SPI_exec("select count(*) from ttest", 0);

if (ret < 0)
elog(NOTICE, "trigf (fired %s): SPI_exec returned %d",
when, ret);

i = SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc,
1, &isnull);
elog (NOTICE, "trigf(fired %s): there are %d tuples in ttest",
when, i);

When it should be:

pi = SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc,
1, &isnull);
elog (NOTICE, "trigf(fired %s): there are %d tuples in ttest",
when, *pi);

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: mlw (#1)
Re: Docbug, SPI_getbinval, triger example

mlw <markw@mohawksoft.com> writes:

The docs suggest that this:
/* Get number of tuples in relation */
ret = SPI_exec("select count(*) from ttest", 0);

Mph. The example *used* to be right, but is not as of 7.2, because
count() now returns int8 which is pass-by-reference. Your proposed
fix isn't quite right either (you'd have noticed the difference between
*int and *int8 on a big-endian machine ;-)). Probably we should change
the example to read

i = (int) DatumGetInt64(SPI_getbinval(...));

Alternatively the example query could be changed to

ret = SPI_exec("select count(*)::int4 from ttest", 0);

so as to avoid the backend version dependency. Comments anyone?

regards, tom lane