PG_FREE_IF_COPY extraneous in numeric_cmp?

Started by CK Tanalmost 3 years ago3 messages
#1CK Tan
cktan@vitessedata.com

Hi hackers,

I have a question on the code below:

Datum
numeric_cmp(PG_FUNCTION_ARGS)
{
Numeric num1 = PG_GETARG_NUMERIC(0);
Numeric num2 = PG_GETARG_NUMERIC(1);
int result;

result = cmp_numerics(num1, num2);

PG_FREE_IF_COPY(num1, 0);
PG_FREE_IF_COPY(num2, 1);

PG_RETURN_INT32(result);
}

It seems to me that num1 is a copy of fcinfo->arg[0]. It is passed to
the function cmp_numerics(), It's value remains the same after the
call. Also, cmp_numerics() does not have a handle to fcinfo, so it
can't modify fcinfo->arg[0].

Isn't it true that pfree() will never be called by PG_FREE_IF_COPY?

Cheers,
-cktan

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: CK Tan (#1)
Re: PG_FREE_IF_COPY extraneous in numeric_cmp?

CK Tan <cktan@vitessedata.com> writes:

Isn't it true that pfree() will never be called by PG_FREE_IF_COPY?

No. You're forgetting the possibility that PG_GETARG_NUMERIC will
have to de-toast a toasted input. Granted, numerics are seldom
going to be long enough to get compressed or pushed out-of-line;
but that's possible, and what's very possible is that they'll have
a short header.

regards, tom lane

#3CK Tan
cktan@vitessedata.com
In reply to: Tom Lane (#2)
Re: PG_FREE_IF_COPY extraneous in numeric_cmp?

Thanks!

Show quoted text

On Fri, Feb 24, 2023 at 2:16 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

CK Tan <cktan@vitessedata.com> writes:

Isn't it true that pfree() will never be called by PG_FREE_IF_COPY?

No. You're forgetting the possibility that PG_GETARG_NUMERIC will
have to de-toast a toasted input. Granted, numerics are seldom
going to be long enough to get compressed or pushed out-of-line;
but that's possible, and what's very possible is that they'll have
a short header.

regards, tom lane