BUG #12568: upper of int4range unexpected value

From: damian(at)sepczuk(dot)pl
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #12568: upper of int4range unexpected value
Date: 2015-01-16 15:27:13
Message-ID: 20150116152713.2582.10294@wrigleys.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 12568
Logged by: Damian Sepczuk
Email address: damian(at)sepczuk(dot)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

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Andres Freund 2015-01-16 15:55:31 Re: BUG #12556: Clause IN and NOT IN buggy
Previous Message Kevin Perais 2015-01-16 09:17:43 Re: BUG #12556: Clause IN and NOT IN buggy