preferred way to use PG_GETARG_BYTEA_P in SPI

Started by Merlin Moncureover 18 years ago4 messagesgeneral
Jump to latest
#1Merlin Moncure
mmoncure@gmail.com

I'm curious what's considered the best way to invoke PG_GETARG_BYTEA_P
in an SPI routine and properly check for null input in non 'strict'
routines. Right now, I'm looking at PG_GETARG_POINTER to check for
null value before using PG_GETARG_BYTEA_P to assign to the bytea
pointer.

ISTM a little but unintuitive to have PG_GETARG_BYTEA_P crash on null
input...why not just assign null and skip the de-toast call in the
macro?

merlin

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Merlin Moncure (#1)
Re: preferred way to use PG_GETARG_BYTEA_P in SPI

"Merlin Moncure" <mmoncure@gmail.com> writes:

I'm curious what's considered the best way to invoke PG_GETARG_BYTEA_P
in an SPI routine and properly check for null input in non 'strict'
routines. Right now, I'm looking at PG_GETARG_POINTER to check for
null value before using PG_GETARG_BYTEA_P to assign to the bytea
pointer.

That would be entirely wrong. In a non-strict function, test
PG_ARGISNULL(n) before attempting any variant of PG_GETARG(n).
Grepping for PG_ARGISNULL will yield lots of examples.

regards, tom lane

#3Merlin Moncure
mmoncure@gmail.com
In reply to: Tom Lane (#2)
Re: preferred way to use PG_GETARG_BYTEA_P in SPI

On 10/10/07, Tom Lane <tgl@sss.pgh.pa.us> wrote:

"Merlin Moncure" <mmoncure@gmail.com> writes:

I'm curious what's considered the best way to invoke PG_GETARG_BYTEA_P
in an SPI routine and properly check for null input in non 'strict'
routines. Right now, I'm looking at PG_GETARG_POINTER to check for
null value before using PG_GETARG_BYTEA_P to assign to the bytea
pointer.

That would be entirely wrong. In a non-strict function, test
PG_ARGISNULL(n) before attempting any variant of PG_GETARG(n).
Grepping for PG_ARGISNULL will yield lots of examples.

well, there aren't all that many examples in contrib, and some of the
ones that are there look like this (edited) from tsearch2:

Datum
rewrite_accum(PG_FUNCTION_ARGS)
{
QUERYTYPE *acc = (QUERYTYPE *) PG_GETARG_POINTER(0);
ArrayType *qa = (ArrayType *)
DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)));
if (acc == NULL || PG_ARGISNULL(0))
{

...I since found the place in the documentation which explains this
though, at the end of the portion describing the V1 calling
convention.

merlin

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Merlin Moncure (#3)
Re: preferred way to use PG_GETARG_BYTEA_P in SPI

"Merlin Moncure" <mmoncure@gmail.com> writes:

well, there aren't all that many examples in contrib, and some of the
ones that are there look like this (edited) from tsearch2:

Datum
rewrite_accum(PG_FUNCTION_ARGS)
{
QUERYTYPE *acc = (QUERYTYPE *) PG_GETARG_POINTER(0);
ArrayType *qa = (ArrayType *)
DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)));
if (acc == NULL || PG_ARGISNULL(0))
{

That might be safe but it sure looks like bad practice to me.
In particular I think it's unwise to assume that the Datum value
for a null will always be zero.

regards, tom lane