PG_FREE_IF_COPY()

Started by John Hansenover 20 years ago3 messages
#1John Hansen
john@geeknet.com.au

Given the following snippet:

HeapTupleHeader tuple;
Datum temp;
bool isnull;

tuple = PG_GETARG_HEAPTUPLEHEADER(0);
temp = GetAttributeByName(tuple, "data", &isnull);

When using this for a btree operator functions, you need to
PG_FREE_IF_COPY(?,?);

Which of the above parameters need I free?

tuple, or temp,.... Or both?

... John

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Hansen (#1)
Re: PG_FREE_IF_COPY()

"John Hansen" <john@geeknet.com.au> writes:

Given the following snippet:
HeapTupleHeader tuple;
Datum temp;
bool isnull;

tuple = PG_GETARG_HEAPTUPLEHEADER(0);
temp = GetAttributeByName(tuple, "data", &isnull);

When using this for a btree operator functions, you need to
PG_FREE_IF_COPY(?,?);

Which of the above parameters need I free?

It'd probably be wise to do a FREE_IF_COPY on the tuple.

GetAttributeByName, however, hasn't copied anything (if it's
a pass-by-ref type you'll just get a pointer into the tuple).
If you do a copy further down that might be a reason to free
something, but this code alone isn't making a copy.

regards, tom lane

#3John Hansen
john@geeknet.com.au
In reply to: Tom Lane (#2)
Re: PG_FREE_IF_COPY()

Tom Lane [mailto:tgl@sss.pgh.pa.us] wrote:

"John Hansen" <john@geeknet.com.au> writes:

Given the following snippet:
HeapTupleHeader tuple;
Datum temp;
bool isnull;

tuple = PG_GETARG_HEAPTUPLEHEADER(0);
temp = GetAttributeByName(tuple, "data", &isnull);

When using this for a btree operator functions, you need to
PG_FREE_IF_COPY(?,?);

Which of the above parameters need I free?

It'd probably be wise to do a FREE_IF_COPY on the tuple.

GetAttributeByName, however, hasn't copied anything (if it's
a pass-by-ref type you'll just get a pointer into the tuple).
If you do a copy further down that might be a reason to free
something, but this code alone isn't making a copy.

Cool, thanks...

regards, tom lane

... John