• Andres Freund's avatar
    expression eval: Reduce number of steps for agg transition invocations. · 2742c450
    Andres Freund authored
    Do so by combining the various steps that are part of aggregate
    transition function invocation into one larger step. As some of the
    current steps are only necessary for some aggregates, have one variant
    of the aggregate transition step for each possible combination.
    
    To avoid further manual copies of code in the different transition
    step implementations, move most of the code into helper functions
    marked as "always inline".
    
    The benefit of this change is an increase in performance when
    aggregating lots of rows. This comes in part due to the reduced number
    of indirect jumps due to the reduced number of steps, and in part by
    reducing redundant setup code across steps. This mainly benefits
    interpreted execution, but the code generated by JIT is also improved
    a bit.
    
    As a nice side-effect it also ends up making the code a bit simpler.
    
    A small additional optimization is removing the need to set
    aggstate->curaggcontext before calling ExecAggInitGroup, choosing to
    instead passign curaggcontext as an argument. It was, in contrast to
    other aggregate related functions, only needed to fetch a memory
    context to copy the transition value into.
    
    Author: Andres Freund
    Discussion:
       https://postgr.es/m/20191023163849.sosqbfs5yenocez3@alap3.anarazel.de
       https://postgr.es/m/5c371df7cee903e8cd4c685f90c6c72086d3a2dc.camel@j-davis.com
    2742c450
execExprInterp.c 116 KB