Re: Bad canonicalization for dateranges with 'infinity' bounds
Thomas Munro <thomas.munro@gmail.com>
From: Thomas Munro <thomas.munro@gmail.com>
To: Laurenz Albe <laurenz.albe@cybertec.at>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2019-07-13T12:44:39Z
Lists: pgsql-hackers
On Fri, May 3, 2019 at 12:49 AM Laurenz Albe <laurenz.albe@cybertec.at> wrote: > > I propose the attached patch which fixes the problem. Hi Laurenz, I agree that the patch makes the code match the documentation. The documented behaviour seems to make more sense than the code, since unpatched master gives this nonsense result when it flips the inclusive flag but doesn't adjust the value (because it can't): postgres=# select '(-infinity,infinity]'::daterange @> 'infinity'::date; ?column? ---------- f (1 row) - if (!upper.infinite && upper.inclusive) + if (!(upper.infinite || DATE_NOT_FINITE(upper.val)) && upper.inclusive) Even though !(X || Y) is equivalent to !X && !Y, by my reading of range_in(), lower.value can be uninitialised when lower.infinite is true, and it's also a bit hard to read IMHO, so I'd probably write that as !upper.infinite && !DATE_NOT_FINITE(upper.val) && upper.inclusive. I don't think it can affect the result but it might upset Valgrind or similar. -- Thomas Munro https://enterprisedb.com
Commits
-
Fix daterange canonicalization for +/- infinity.
- 613eabcd51c3 12.0 landed
- 2be355498eaf 9.4.24 landed
- 8af1fccba2b1 9.5.19 landed
- 56afeb765177 9.6.15 landed
- 955089d4d74d 10.10 landed
- f5f20deda33b 11.5 landed
- e6feef571a01 13.0 landed