Hi.

I've faced an issue with Box type comparison that exists almost for a five 
years.

> create table t (b box);
CREATE TABLE
> select count(*), b from t group by b;
ERROR:  could not identify an equality operator for type box

As mentioned in 
http://www.postgresql.org/message-id/pine.lnx.4.64.1012040051500.12...@sn.sai.msu.ru

  That can be fixed by b-tree equality for boxes, but we need some decisions 
there. We can compare 
floats up to certain threshold or strictly, and box equality can be defined as 
coordinate equality or as equality of areas. 
  In a case of threshold-based comparison we will not lose equality due to 
rounding errors, for example 
applying commutative functions in different order will preserve equality, but 
we can face non-transitive equalities, like 
box1 == box2, box2 == box3, but box1 != box3 and GROUP BY can produce strange 
results.
  With strict comparison equality is transitive, but we can lose that equality 
due to rounding.

Now in geo_decls.h we have:

#define EPSILON                                 1.0E-06
#define FPeq(A,B)                               (fabs((A) - (B)) <= EPSILON)

and equality means equal areas.

But for GROUP BY it better be opposite: equality of coordinates and strict 
comparison.

Simplest workaround in my perspective is to add another operator for box type 
(e.g. ==) that will perform strict comparison
of coordinates and use it in b-tree ops. 

Any objections/suggestions?

-----------------
Stas Kelvich
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company




-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to