Re: Ranges for well-ordered types
От | Michael Glaesemann |
---|---|
Тема | Re: Ranges for well-ordered types |
Дата | |
Msg-id | EBFB010E-1FFA-42DF-BE1D-B9F11484EA62@seespotcode.net обсуждение исходный текст |
Ответ на | Re: Ranges for well-ordered types ("Ian Caulfield" <ian.caulfield@gmail.com>) |
Ответы |
Re: Ranges for well-ordered types
|
Список | pgsql-hackers |
On Jun 11, 2006, at 0:54 , Ian Caulfield wrote: > I've done similar date range things by creating a composite type > consisting of the lower and upper bounds, and then implementing a > btree opclass where the comparator returns 0 if two ranges overlap > - this allows a current btree index to enforce non-overlapping > ranges, and allows indexed lookup of which range contains a > particular value. As Tom already pointed out, this method leads to problems with btree indexes. I haven't heavily tested my own implementation (below), but it only returns 0 for equality, which is what btree expects. All other possible relationships between two ranges have a well-defined result of -1 or 1. I believe this should be enough to prevent any transitivity issues with btree. Michael Glaesemann grzm seespotcode net create type interval_date as ( _1 point_date , _2 point_date ); comment on type interval_date is 'The internal representation of date intervals, representing the closed-closed ' 'interval [_1,_2]'; create function interval_cmp( interval_date -- $1 i1 , interval_date -- $2 i2 ) returns integer strict immutable security definer language plpgsql as ' declare i1 alias for $1; i2 alias for $2; cmp integer; begin perform check_intervals(i1,i2); cmp := 1; if i1._1 = i2._1 and i1._2 = i2._2 then cmp := 0; else if (i1._2 < i2._2) or (i1._2 =i2._2 and i1._1 > i2._1) then cmp = -1; end if; end if; return cmp; end; ';
В списке pgsql-hackers по дате отправления: