Re: Range Types and extensions - Mailing list pgsql-hackers

From Darren Duncan
Subject Re: Range Types and extensions
Date
Msg-id 4DEC5CED.6030105@darrenduncan.net
Whole thread Raw
In response to Range Types and extensions  (Jeff Davis <pgsql@j-davis.com>)
Responses Re: Range Types and extensions
Re: Range Types and extensions
List pgsql-hackers
Jeff Davis wrote:
> I'd like to take another look at Range Types and whether part of it
> should be an extension. Some of these issues relate to extensions in
> general, not just range types.
> 
> First of all, what are the advantages to being in core?

I believe that ranges aka intervals are widely useful generic types, next after 
relations/tuples/arrays, and they *should* be supported in core, same as arrays are.

In particular, the usefulness of ranges/intervals is often orthogonal to many 
other things, and for many types including numbers, strings, temporals.

Now assuming that a range/interval value is generally defined in terms of a pair 
of endpoints of some ordered type (that is, a type for which ORDER BY or RANK or 
{<,>,<=,>=} etc or LIMIT makes sense), it will be essential that this value is 
capable of distinguishing open and closed intervals.

For example, a range value can be represented by a tuple with 4 attributes, 
where two of those are the endpoint values, and two of those are booleans saying 
whether each of the endpoints is inside or outside the range/interval.

Also, if Postgres has some concept of type-generic special values -Inf and +Inf 
(which always sort before or after any other value in the type system), those 
can be used as endpoints to indicate that the interval is unbounded.

Unless you have some other syntax in mind, I suggest lifting the range literal 
syntax from Perl 6, where ".." is an infix operator building a range between its 
arguments, and a "^" on either side means that side is open, I think; so there 
are 4 variants: {..,^..,..^,^..^}.

Now as to general usefulness of intervals ...

Any operation that wants to deal with a range somehow, such as the BETWEEN 
syntax, could instead use a range/interval; for example, both of:
  foo in 1..10
  foo between 1 and 10

... would mean the same thing, but the 1..10 can be replaced by an arbitrary 
value expression or variable reference.

Likewise with:
  date in start ..^ end
  date >= start and date < end

... mean the same thing.

The LIMIT clause could take a range to specify take and skip count at once.

Array slicing can be done using foo[first..last] or such.

A random number generator that takes endpoints can take a range argument.

An array or relation of these range can represent ranges with holes, and the 
general results of range union operations.

-- Darren Duncan


pgsql-hackers by date:

Previous
From: Itagaki Takahiro
Date:
Subject: Re: heap vacuum & cleanup locks
Next
From: Radosław Smogura
Date:
Subject: Re: Auto adjust send buffer size to congention window