flinfo NULL in DirectFunctionCall callee?

Started by Paul Jungwirthover 6 years ago4 messagesgeneral
Jump to latest
#1Paul Jungwirth
pj@illuminatedcomputing.com

Hello,

I'm writing a multirange_cmp function which calls range_cmp to compare
individual elements. It looks like this:

cmp = DatumGetInt32(DirectFunctionCall2(
range_cmp,
RangeTypePGetDatum(r1),
RangeTypePGetDatum(r2)));

But I get a segfault when range_cmp tries to reach its
fcinfo->flinfo->fn_extra, because it has a NULL flinfo, as you can see
from these debugging messages:

NOTICE: multirange_cmp fcinfo = 0x7f875a0a66c0
NOTICE: multirange_cmp flinfo = 0x7f875a0a6690
NOTICE: multirange_cmp fn_extra = 0x7f875a099450
NOTICE: range_cmp fcinfo = 0x7ffee5ff9820
NOTICE: range_cmp flinfo = 0x0

Is it expected for flinfo to be null when using DirectFunctionCall*?
Is there something else I should use instead? It looks like
FunctionCall2 would let me pass my own flinfo, but I'm not sure how to
set that up first.

Thanks!
Paul

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Paul Jungwirth (#1)
Re: flinfo NULL in DirectFunctionCall callee?

Paul A Jungwirth <pj@illuminatedcomputing.com> writes:

Is it expected for flinfo to be null when using DirectFunctionCall*?

Yes, per the comment on those functions:

* These are for invocation of a specifically named function with a
* directly-computed parameter list. Note that neither arguments nor result
* are allowed to be NULL. Also, the function cannot be one that needs to
* look at FmgrInfo, since there won't be any.

Is there something else I should use instead? It looks like
FunctionCall2 would let me pass my own flinfo, but I'm not sure how to
set that up first.

Use fmgr_info() or a sibling to fill in the FmgrInfo.

regards, tom lane

#3Paul Jungwirth
pj@illuminatedcomputing.com
In reply to: Tom Lane (#2)
Re: flinfo NULL in DirectFunctionCall callee?

On Mon, Aug 26, 2019 at 8:12 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Paul A Jungwirth <pj@illuminatedcomputing.com> writes:

Is it expected for flinfo to be null when using DirectFunctionCall*?

Yes, per the comment on those functions:

* These are for invocation of a specifically named function with a
* directly-computed parameter list. Note that neither arguments nor result
* are allowed to be NULL. Also, the function cannot be one that needs to
* look at FmgrInfo, since there won't be any.

Thanks Tom! Alas I saw that same comment in fmgr.h but it was missing
the last sentence. Would you like a patch updating it there? Is that
the kind of thing you make CF entries for? (And sorry this is veering
into pgsql-hackers territory....)

Use fmgr_info() or a sibling to fill in the FmgrInfo.

Thanks for this too! I wound up just adding a range_cmp_internal to
avoid the whole issue, which is a pattern already used by a bunch of
the other range_* functions.

Yours,
Paul

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Paul Jungwirth (#3)
Re: flinfo NULL in DirectFunctionCall callee?

Paul A Jungwirth <pj@illuminatedcomputing.com> writes:

On Mon, Aug 26, 2019 at 8:12 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Yes, per the comment on those functions:
* These are for invocation of a specifically named function with a
* directly-computed parameter list. Note that neither arguments nor result
* are allowed to be NULL. Also, the function cannot be one that needs to
* look at FmgrInfo, since there won't be any.

Thanks Tom! Alas I saw that same comment in fmgr.h but it was missing
the last sentence.

Oh, hm, that's not very nice. Fixed.

Would you like a patch updating it there? Is that
the kind of thing you make CF entries for?

Not really worth the overhead, for something as simple as this.

regards, tom lane