BUG #12568: upper of int4range unexpected value - Mailing list pgsql-bugs

From damian@sepczuk.pl
Subject BUG #12568: upper of int4range unexpected value
Date
Msg-id 20150116152713.2582.10294@wrigleys.postgresql.org
Whole thread Raw
Responses Re: BUG #12568: upper of int4range unexpected value  (David G Johnston <david.g.johnston@gmail.com>)
List pgsql-bugs
The following bug has been logged on the website:

Bug reference:      12568
Logged by:          Damian Sepczuk
Email address:      damian@sepczuk.pl
PostgreSQL version: 9.4.0
Operating system:   Linux Mint 17.1 Cinnamon 64-bit 3.13.0-24-generic
Description:

While technically 3 is an upper bound of the integer range [1,3) ∩ ℕ = {1,
2}, so are all natural numbers ≥ 2. I would expect the 'upper' function to
return the supremum (least upper bound) of the range.
In my opinion the result of upper('[1,2]'::int4range) = 3 is unexpected.

>From pg documentation:
upper(anyrange) | range's element type | upper bound of range |
upper(numrange(1.1,2.2)) | 2.2
upper_inc(anyrange) | boolean | is the upper bound inclusive? |
upper_inc(numrange(1.1,2.2)) | false

and

"The built-in range types int4range, int8range, and daterange all use a
canonical form that includes the lower bound and excludes the upper bound;
that is, [)."

I understand, that the canonical form of the discrete range is [1,3) but,
still, 3 is not the supremum of [1,3) in the discrete domain of int4
numbers. Supremum of [1,3) in int4 is 2.

It seems that the upper and upper_inc functions don't take into account the
fact the range is discrete.


> SELECT version();
PostgreSQL 9.4.0 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu
4.8.2-19ubuntu1) 4.8.2, 64-bit


> SELECT x, lower(x), upper(x), lower_inc(x), upper_inc(x) FROM (SELECT
'[1,2]'::int4range x) q;
   x   | lower | upper | lower_inc | upper_inc
-------+-------+-------+-----------+-----------
 [1,3) |     1 |     3 | t         | f
                ^^^^^^^_____________^^^-----------> Unexpected!

> SELECT x, lower(x), upper(x), lower_inc(x), upper_inc(x) FROM (SELECT
'(1,2]'::int4range x) q;
   x   | lower | upper | lower_inc | upper_inc
-------+-------+-------+-----------+-----------
 [2,3) |     2 |     3 | t         | f
                ^^^^^^^_____________^^^-----------> Unexpected!

SELECT x, lower(x), upper(x), lower_inc(x), upper_inc(x) FROM (SELECT
'(1,3)'::int4range x) q;
   x   | lower | upper | lower_inc | upper_inc
-------+-------+-------+-----------+-----------
 [2,3) |     2 |     3 | t         | f
                ^^^^^^^_____________^^^-----------> Unexpected!

SELECT x, lower(x), upper(x), lower_inc(x), upper_inc(x) FROM (SELECT
'(1,2)'::int4range x) q;
   x   | lower | upper | lower_inc | upper_inc
-------+-------+-------+-----------+-----------
 empty |       |       | f         | f


> SELECT x, lower(x), upper(x), lower_inc(x), upper_inc(x) FROM (SELECT
'[1,2]'::numrange x) q;
   x   | lower | upper | lower_inc | upper_inc
-------+-------+-------+-----------+-----------
 [1,2] |     1 |     2 | t         | t


> SELECT x, lower(x), upper(x), lower_inc(x), upper_inc(x) FROM (SELECT
'[1,2)'::numrange x) q1;
   x   | lower | upper | lower_inc | upper_inc
-------+-------+-------+-----------+-----------
 [1,2) |     1 |     2 | t         | f

> SELECT x, lower(x), upper(x), lower_inc(x), upper_inc(x) FROM (SELECT
'[1,3]'::numrange x) q1;
   x   | lower | upper | lower_inc | upper_inc
-------+-------+-------+-----------+-----------
 [1,3] |     1 |     3 | t         | t

pgsql-bugs by date:

Previous
From: Kevin Perais
Date:
Subject: Re: BUG #12556: Clause IN and NOT IN buggy
Next
From: Andres Freund
Date:
Subject: Re: BUG #12556: Clause IN and NOT IN buggy