• Tom Lane's avatar
    Support all SQL:2011 options for window frame clauses. · 0a459cec
    Tom Lane authored
    This patch adds the ability to use "RANGE offset PRECEDING/FOLLOWING"
    frame boundaries in window functions.  We'd punted on that back in the
    original patch to add window functions, because it was not clear how to
    do it in a reasonably data-type-extensible fashion.  That problem is
    resolved here by adding the ability for btree operator classes to provide
    an "in_range" support function that defines how to add or subtract the
    RANGE offset value.  Factoring it this way also allows the operator class
    to avoid overflow problems near the ends of the datatype's range, if it
    wishes to expend effort on that.  (In the committed patch, the integer
    opclasses handle that issue, but it did not seem worth the trouble to
    avoid overflow failures for datetime types.)
    
    The patch includes in_range support for the integer_ops opfamily
    (int2/int4/int8) as well as the standard datetime types.  Support for
    other numeric types has been requested, but that seems like suitable
    material for a follow-on patch.
    
    In addition, the patch adds GROUPS mode which counts the offset in
    ORDER-BY peer groups rather than rows, and it adds the frame_exclusion
    options specified by SQL:2011.  As far as I can see, we are now fully
    up to spec on window framing options.
    
    Existing behaviors remain unchanged, except that I changed the errcode
    for a couple of existing error reports to meet the SQL spec's expectation
    that negative "offset" values should be reported as SQLSTATE 22013.
    
    Internally and in relevant parts of the documentation, we now consistently
    use the terminology "offset PRECEDING/FOLLOWING" rather than "value
    PRECEDING/FOLLOWING", since the term "value" is confusingly vague.
    
    Oliver Ford, reviewed and whacked around some by me
    
    Discussion: https://postgr.es/m/CAGMVOdu9sivPAxbNN0X+q19Sfv9edEPv=HibOJhB14TJv_RCQg@mail.gmail.com
    0a459cec
nbtree.h 22 KB