On 30 January 2011 02:55, Thom Brown <t...@linux.com> wrote: > On 29 January 2011 19:53, Jeff Davis <pg...@j-davis.com> wrote: >> On Sat, 2011-01-29 at 14:42 -0500, Tom Lane wrote: >>> Jeff Davis <pg...@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)
As for docs, anyrange will need mentioning as part of the information about polymorphic types: http://developer.postgresql.org/pgdocs/postgres/extend-type-system.html And on the pseudo-types page: http://developer.postgresql.org/pgdocs/postgres/datatype-pseudo.html -- Thom Brown Twitter: @darkixion IRC (freenode): dark_ixion Registered Linux user: #516935 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers