• Tom Lane's avatar
    Explicitly track whether aggregate final functions modify transition state. · 4de2d4fb
    Tom Lane authored
    Up to now, there's been hard-wired assumptions that normal aggregates'
    final functions never modify their transition states, while ordered-set
    aggregates' final functions always do.  This has always been a bit
    limiting, and in particular it's getting in the way of improving the
    built-in ordered-set aggregates to allow merging of transition states.
    Therefore, let's introduce catalog and CREATE AGGREGATE infrastructure
    that lets the finalfn's behavior be declared explicitly.
    
    There are now three possibilities for the finalfn behavior: it's purely
    read-only, it trashes the transition state irrecoverably, or it changes
    the state in such a way that no more transfn calls are possible but the
    state can still be passed to other, compatible finalfns.  There are no
    examples of this third case today, but we'll shortly make the built-in
    OSAs act like that.
    
    This change allows user-defined aggregates to explicitly disclaim support
    for use as window functions, and/or to prevent transition state merging,
    if their implementations cannot handle that.  While it was previously
    possible to handle the window case with a run-time error check, there was
    not any way to prevent transition state merging, which in retrospect is
    something commit 804163bc should have provided for.  But better late
    than never.
    
    In passing, split out pg_aggregate.c's extern function declarations into
    a new header file pg_aggregate_fn.h, similarly to what we've done for
    some other catalog headers, so that pg_aggregate.h itself can be safe
    for frontend files to include.  This lets pg_dump use the symbolic
    names for relevant constants.
    
    Discussion: https://postgr.es/m/4834.1507849699@sss.pgh.pa.us
    4de2d4fb
create_aggregate.sgml 34.8 KB