Re: WIP: RangeTypes - Mailing list pgsql-hackers

From Thom Brown
Subject Re: WIP: RangeTypes
Date
Msg-id AANLkTi=FcLmw8U9jM6FA-3N5SNzbbEbZje0RAoGZTn6h@mail.gmail.com
Whole thread Raw
In response to Re: WIP: RangeTypes  (Jeff Davis <pgsql@j-davis.com>)
Responses Re: WIP: RangeTypes  (Thom Brown <thom@linux.com>)
Re: WIP: RangeTypes  (Jeff Davis <pgsql@j-davis.com>)
List pgsql-hackers
On 29 January 2011 19:53, Jeff Davis <pgsql@j-davis.com> wrote:
> On Sat, 2011-01-29 at 14:42 -0500, Tom Lane wrote:
>> Jeff Davis <pgsql@j-davis.com> writes:
>> > On Fri, 2011-01-28 at 21:52 +0000, Thom Brown wrote:
>> > Also, if I try the same, but with a different name for the type, I get
>> > the same error.  Why does that restriction exist?  Can't you have
>> > types which happen to use the exact same subtype?
>>
>> > At first, that's how I designed it. Then, I realized that the type
>> > system needs to know the range type from the element type in order for
>> > something like ANYRANGE to work.
>>
>> That seems like a fairly bad restriction.  In a datatype with multiple
>> useful sort orderings, it'd be desirable to be able to create a range
>> type for each such ordering, no?  I'd be inclined to think of a range
>> type as being defined by element type plus a btree opfamily.  Maybe it'd
>> be okay to insist on that combination as being unique.
>
> I couldn't find another way to make a function with a definition like:
>
>  range(ANYELEMENT, ANYELEMENT) returns ANYRANGE
>
> work. And it seemed worse to live without a constructor like that.
> Ideas?
>
> Also, it's not based on the btree opfamily right now. It's just based on
> a user-supplied compare function. I think I could change it to store the
> opfamily instead, if you think that's a better idea.

Probably ignorance here, but why does the following not work?

postgres=# select '[18,20]'::numrange @> 19;
ERROR:  operator does not exist: numrange @> integer
LINE 1: select '[18,20]'::numrange @> 19;                                  ^
HINT:  No operator matches the given name and argument type(s). You
might need to add explicit type casts.


I can see both the wiki page on range types and the pg_operator table
appear to indicate this should work:

postgres=# select o.oprname, tl.typname as lefttype, tr.typname as
righttype from pg_operator o left join pg_type tl on o.oprleft =
tl.oid left join pg_type tr on o.oprright = tr.oid where 'anyrange' in
(tl.typname, tr.typname) and oprname = '@>';oprname | lefttype |  righttype
---------+----------+-------------@>      | anyrange | anynonarray@>      | anyrange | anyrange
(2 rows)

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935


pgsql-hackers by date:

Previous
From: Jeff Janes
Date:
Subject: Re: Change pg_last_xlog_receive_location not to move backwards
Next
From: Thom Brown
Date:
Subject: Re: WIP: RangeTypes