Re: INT4RANGE Upper bound always includes a higher number
| От | Tom Lane | 
|---|---|
| Тема | Re: INT4RANGE Upper bound always includes a higher number | 
| Дата | |
| Msg-id | 2451988.1696366652@sss.pgh.pa.us обсуждение исходный текст | 
| Ответ на | INT4RANGE Upper bound always includes a higher number (PG Doc comments form <noreply@postgresql.org>) | 
| Список | pgsql-docs | 
PG Doc comments form <noreply@postgresql.org> writes:
> According to your example (copied from your docs):
> -- includes 3, does not include 7, and does include all points in between
> SELECT '[3,7)'::int4range;
> But this is not true, it shows 3 and 7
What's not true about it?
postgres=# SELECT 3 <@ '[3,7)'::int4range;
 ?column? 
----------
 t
(1 row)
postgres=# SELECT 6 <@ '[3,7)'::int4range;
 ?column? 
----------
 t
(1 row)
postgres=# SELECT 7 <@ '[3,7)'::int4range;
 ?column? 
----------
 f
(1 row)
7 is not a member of that range, only an endpoint.
> And if i do:
> SELECT '(3,7]'::INT4RANGE;
> It shows:
>  [4,8)
> (1 row)
This is a consequence of canonicalization.  There are four different
ways to write the same integer range:
    [3,6]
    [3,7)
    (2,6]
    (2,7)
All of these include 3,4,5,6 and no other integer.
INT4RANGE has a canonicalize function that converts ranges into the
"[m,n)" form so that ranges that are functionally identical look
identical.  If you don't like that, you can make a user-defined
range type with a different canonicalize function, or none at all.
See
https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-DISCRETE
            regards, tom lane
		
	В списке pgsql-docs по дате отправления: