• Tom Lane's avatar
    Allow polymorphic aggregates to have non-polymorphic state data types. · f0fedfe8
    Tom Lane authored
    Before 9.4, such an aggregate couldn't be declared, because its final
    function would have to have polymorphic result type but no polymorphic
    argument, which CREATE FUNCTION would quite properly reject.  The
    ordered-set-aggregate patch found a workaround: allow the final function
    to be declared as accepting additional dummy arguments that have types
    matching the aggregate's regular input arguments.  However, we failed
    to notice that this problem applies just as much to regular aggregates,
    despite the fact that we had a built-in regular aggregate array_agg()
    that was known to be undeclarable in SQL because its final function
    had an illegal signature.  So what we should have done, and what this
    patch does, is to decouple the extra-dummy-arguments behavior from
    ordered-set aggregates and make it generally available for all aggregate
    declarations.  We have to put this into 9.4 rather than waiting till
    later because it slightly alters the rules for declaring ordered-set
    aggregates.
    
    The patch turned out a bit bigger than I'd hoped because it proved
    necessary to record the extra-arguments option in a new pg_aggregate
    column.  I'd thought we could just look at the final function's pronargs
    at runtime, but that didn't work well for variadic final functions.
    It's probably just as well though, because it simplifies life for pg_dump
    to record the option explicitly.
    
    While at it, fix array_agg() to have a valid final-function signature,
    and add an opr_sanity test to notice future deviations from polymorphic
    consistency.  I also marked the percentile_cont() aggregates as not
    needing extra arguments, since they don't.
    f0fedfe8
catalogs.sgml 311 KB