Thread: tstzrange with ... 'infinity'] + upper_inf() using 9.2.4

tstzrange with ... 'infinity'] + upper_inf() using 9.2.4

From
Ralph Graulich
Date:
Hi,

> select upper_inf(tsrange('2013-05-01'::timestamp, 'infinity'::timestamp, '[]'));
 upper_inf
-----------
 f
(1 row)

As far as I understood the docs, this query should return true, as the upper bound includes 'infinity'?

[http://www.postgresql.org/docs/9.2/interactive/functions-range.html]
"The lower and upper functions return null if the range is empty or the requested bound is infinite. The lower_inc,
upper_inc,lower_inf, and upper_inf functions all return false for an empty range." 

[http://www.postgresql.org/docs/9.2/interactive/rangetypes.html]
"Also, some element types have a notion of "infinity", but that is just another value so far as the range type
mechanismsare concerned. For example, in timestamp ranges, [today,] means the same thing as [today,). But
[today,infinity]means something different from [today,infinity) — the latter excludes the special timestamp value
infinity.
The functions lower_inf and upper_inf test for infinite lower and upper bounds of a range, respectively."


Regards
Ralph



Re: tstzrange with ... 'infinity'] + upper_inf() using 9.2.4

From
Tom Lane
Date:
Ralph Graulich <maillist@shauny.de> writes:
> select upper_inf(tsrange('2013-05-01'::timestamp, 'infinity'::timestamp, '[]'));
>  upper_inf
> -----------
>  f
> (1 row)

> As far as I understood the docs, this query should return true, as the upper bound includes 'infinity'?

No, that's the point of the sentence about the range mechanisms not
understanding special values of the underlying type.  upper_inf tests
for a range with no upper bound, period.  It would need some
type-specific special knowledge to do what you're hoping for, and it
has not got that.

            regards, tom lane


Re: tstzrange with ... 'infinity'] + upper_inf() using 9.2.4

From
Ralph Graulich
Date:
> No, that's the point of the sentence about the range mechanisms not
> understanding special values of the underlying type.  upper_inf tests
> for a range with no upper bound, period.  It would need some
> type-specific special knowledge to do what you're hoping for, and it
> has not got that.

Got that, thanks Tom!

So I can simply use

select tstzrange('2013-05-01'::timestamp, 'infinity'::timestamp, '[]') @> 'infinity'::timestamptz as validity;
 validity
----------
 t
(1 row)

to test for the case where the upper bound is given (= not null) and infinite.

And when one formerly used two timestamptz fields (valid_from, valid_until) to simulate the range type before the range
typewas implemented and checked for 

WHERE valid_until IS NULL

that's where we now use the "upper_inf()" function.

Regards
Ralph