• Tom Lane's avatar
    Fix some corner cases for window ranges with infinite offsets. · a4faef8f
    Tom Lane authored
    Many situations where the offset is infinity were not handled sanely.
    We should generally allow the val versus base +/- offset comparison to
    proceed according to the normal rules of IEEE arithmetic; however, we
    must do something special for the corner cases where base +/- offset
    would produce NaN due to subtracting two like-signed infinities.
    That corresponds to asking which values infinitely precede +inf or
    infinitely follow -inf, which should certainly be true of any finite
    value or of the opposite-signed infinity.  After some discussion it
    seems that the best decision is to make it true of the same-signed
    infinity as well, ie, just return constant TRUE if the calculation
    would produce a NaN.
    
    (We could write this with a bit less code by subtracting anyway,
    and then checking for a NaN result.  However, I prefer this
    formulation because it'll be easier to transpose into numeric.c.)
    
    Although this seems like clearly a bug fix with respect to finite
    values, it is less obviously correct for infinite values.  Between
    that and the fact that the whole issue only arises for very strange
    window specifications (e.g. RANGE BETWEEN 'inf' PRECEDING AND 'inf'
    PRECEDING), I'll desist from back-patching.
    
    Noted by Dean Rasheed.
    
    Discussion: https://postgr.es/m/3393130.1594925893@sss.pgh.pa.us
    a4faef8f
float.c 93.3 KB