• Tom Lane's avatar
    Fix minor violations of FunctionCallInvoke usage protocol. · 5836d326
    Tom Lane authored
    Working on commit 1c455078 led me to check through FunctionCallInvoke
    call sites to see if every one was being honest about (a) making sure
    that fcinfo.isnull is initially false, and (b) checking its state after
    the call.  Sure enough, I found some violations.
    
    The main one is that finalize_partialaggregate re-used serialfn_fcinfo
    without resetting isnull, even though it clearly intends to cater for
    serialfns that return NULL.  There would only be an issue with a
    non-strict serialfn, since it's unlikely that a serialfn would return
    NULL for non-null input.  We have no non-strict serialfns in core, and
    there may be none in the wild either, which would account for the lack
    of complaints.  Still, it's clearly wrong, so back-patch that fix to
    9.6 where finalize_partialaggregate was introduced.
    
    Also, arrayfuncs.c and rowtypes.c contained various callers that were
    not bothering to check for result nulls.  While what's being called is
    a comparison or hash function that probably *shouldn't* return null,
    that's a lousy excuse for not having any check at all.  There are
    existing places that just Assert(!fcinfo->isnull) in comparable
    situations, so I added that to the places that were calling btree
    comparison or hash support functions.  In the places calling
    boolean-returning equality functions, it's quite cheap to have them
    treat isnull as FALSE, so make those places do that.  Also remove some
    "locfcinfo->isnull = false" assignments that are unnecessary given the
    assumption that no previous call returned null.  These changes seem like
    mostly neatnik-ism or debugging support, so I didn't back-patch.
    5836d326
fmgr.h 33.8 KB