Re: WIP: RangeTypes
От | Thom Brown |
---|---|
Тема | Re: WIP: RangeTypes |
Дата | |
Msg-id | AANLkTi=FcLmw8U9jM6FA-3N5SNzbbEbZje0RAoGZTn6h@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: WIP: RangeTypes (Jeff Davis <pgsql@j-davis.com>) |
Ответы |
Re: WIP: RangeTypes
Re: WIP: RangeTypes |
Список | 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 по дате отправления: