• Tom Lane's avatar
    Fix non-equivalence of VARIADIC and non-VARIADIC function call formats. · c7b35395
    Tom Lane authored
    For variadic functions (other than VARIADIC ANY), the syntaxes foo(x,y,...)
    and foo(VARIADIC ARRAY[x,y,...]) should be considered equivalent, since the
    former is converted to the latter at parse time.  They have indeed been
    equivalent, in all releases before 9.3.  However, commit 75b39e79 made an
    ill-considered decision to record which syntax had been used in FuncExpr
    nodes, and then to make equal() test that in checking node equality ---
    which caused the syntaxes to not be seen as equivalent by the planner.
    This is the underlying cause of bug #9817 from Dmitry Ryabov.
    
    It might seem that a quick fix would be to make equal() disregard
    FuncExpr.funcvariadic, but the same commit made that untenable, because
    the field actually *is* semantically significant for some VARIADIC ANY
    functions.  This patch instead adopts the approach of redefining
    funcvariadic (and aggvariadic, in HEAD) as meaning that the last argument
    is a variadic array, whether it got that way by parser intervention or was
    supplied explicitly by the user.  Therefore the value will always be true
    for non-ANY variadic functions, restoring the principle of equivalence.
    (However, the planner will continue to consider use of VARIADIC as a
    meaningful difference for VARIADIC ANY functions, even though some such
    functions might disregard it.)
    
    In HEAD, this change lets us simplify the decompilation logic in
    ruleutils.c, since the funcvariadic/aggvariadic flag tells directly whether
    to print VARIADIC.  However, in 9.3 we have to continue to cope with
    existing stored rules/views that might contain the previous definition.
    Fortunately, this just means no change in ruleutils.c, since its existing
    behavior effectively ignores funcvariadic for all cases other than VARIADIC
    ANY functions.
    
    In HEAD, bump catversion to reflect the fact that FuncExpr.funcvariadic
    changed meanings; this is sort of pro forma, since I don't believe any
    built-in views are affected.
    
    Unfortunately, this patch doesn't magically fix everything for affected
    9.3 users.  After installing 9.3.5, they might need to recreate their
    rules/views/indexes containing variadic function calls in order to get
    everything consistent with the new definition.  As in the cited bug,
    the symptom of a problem would be failure to use a nominally matching
    index that has a variadic function call in its definition.  We'll need
    to mention this in the 9.3.5 release notes.
    c7b35395
fmgr.c 67.6 KB