Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e6feef5

Browse files
committed
Fix daterange canonicalization for +/- infinity.
The values 'infinity' and '-infinity' are a part of the DATE type itself, so a bound of the date 'infinity' is not the same as an unbounded/infinite range. However, it is still wrong to try to canonicalize such values, because adding or subtracting one has no effect. Fix by treating 'infinity' and '-infinity' the same as unbounded ranges for the purposes of canonicalization (but not other purposes). Backpatch to all versions because it is inconsistent with the documented behavior. Note that this could be an incompatibility for applications relying on the behavior contrary to the documentation. Author: Laurenz Albe Reviewed-by: Thomas Munro Discussion: https://postgr.es/m/77f24ea19ab802bc9bc60ddbb8977ee2d646aec1.camel%40cybertec.at Backpatch-through: 9.4
1 parent d004147 commit e6feef5

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

src/backend/utils/adt/rangetypes.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,13 +1431,13 @@ daterange_canonical(PG_FUNCTION_ARGS)
14311431
if (empty)
14321432
PG_RETURN_RANGE_P(r);
14331433

1434-
if (!lower.infinite && !lower.inclusive)
1434+
if (!lower.infinite && !DATE_NOT_FINITE(lower.val) && !lower.inclusive)
14351435
{
14361436
lower.val = DirectFunctionCall2(date_pli, lower.val, Int32GetDatum(1));
14371437
lower.inclusive = true;
14381438
}
14391439

1440-
if (!upper.infinite && upper.inclusive)
1440+
if (!upper.infinite && !DATE_NOT_FINITE(upper.val) && upper.inclusive)
14411441
{
14421442
upper.val = DirectFunctionCall2(date_pli, upper.val, Int32GetDatum(1));
14431443
upper.inclusive = false;

src/test/regress/expected/rangetypes.out

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,30 @@ select daterange('2000-01-10'::date, '2000-01-11'::date, '(]');
652652
[01-11-2000,01-12-2000)
653653
(1 row)
654654

655+
select daterange('-infinity'::date, '2000-01-01'::date, '()');
656+
daterange
657+
------------------------
658+
(-infinity,01-01-2000)
659+
(1 row)
660+
661+
select daterange('-infinity'::date, '2000-01-01'::date, '[)');
662+
daterange
663+
------------------------
664+
[-infinity,01-01-2000)
665+
(1 row)
666+
667+
select daterange('2000-01-01'::date, 'infinity'::date, '[)');
668+
daterange
669+
-----------------------
670+
[01-01-2000,infinity)
671+
(1 row)
672+
673+
select daterange('2000-01-01'::date, 'infinity'::date, '[]');
674+
daterange
675+
-----------------------
676+
[01-01-2000,infinity]
677+
(1 row)
678+
655679
-- test GiST index that's been built incrementally
656680
create table test_range_gist(ir int4range);
657681
create index test_range_gist_idx on test_range_gist using gist (ir);

src/test/regress/sql/rangetypes.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ select daterange('2000-01-10'::date, '2000-01-20'::date, '(]');
165165
select daterange('2000-01-10'::date, '2000-01-20'::date, '()');
166166
select daterange('2000-01-10'::date, '2000-01-11'::date, '()');
167167
select daterange('2000-01-10'::date, '2000-01-11'::date, '(]');
168+
select daterange('-infinity'::date, '2000-01-01'::date, '()');
169+
select daterange('-infinity'::date, '2000-01-01'::date, '[)');
170+
select daterange('2000-01-01'::date, 'infinity'::date, '[)');
171+
select daterange('2000-01-01'::date, 'infinity'::date, '[]');
168172

169173
-- test GiST index that's been built incrementally
170174
create table test_range_gist(ir int4range);

0 commit comments

Comments
 (0)