pgsql: Fix some corner cases for window ranges with infinite offsets.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix some corner cases for window ranges with infinite offsets.
Date: 2020-07-21 02:03:27
Message-ID: E1jxhct-0005UE-S2@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix some corner cases for window ranges with infinite offsets.

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

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/a4faef8f8fe1493397679c014cf11a6e27c0f1e5

Modified Files
--------------
src/backend/utils/adt/float.c | 46 +++++++++++++++--------
src/test/regress/expected/window.out | 72 ++++++++++++++++++++++++++++++++++++
src/test/regress/sql/window.sql | 16 ++++++++
3 files changed, 118 insertions(+), 16 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Michael Paquier 2020-07-21 03:21:32 pgsql: Rework tab completion of COPY and \copy in psql
Previous Message Tom Lane 2020-07-20 23:44:54 pgsql: Make floating-point "NaN / 0" return NaN instead of raising an e