Создание собственного «оператора равенства» для типа (точки) PostgreSQL для вызовов DISTINCT
В одной из моих таблиц у меня есть столбец, который определен как тип PostgreSQLpoint
, Я использую это дляearthdistance
модуль - в частности,<@>
оператор на расстоянии. (Да, я знаю о PostGIS, но это было намного сложнее, чем мои потребности, поскольку просто указывается таблица с широтой / длинной парой, упорядочивайте таблицу по расстоянию с местом для ошибки из предоставленной широты / длины.)
Тем не мение,point
кажется, не реализовано равенство, поэтому любойDISTINCT
звонить на стол какSELECT DISTINCT * FROM mytable
приводит к следующей ошибке:
ERROR: could not identify an equality operator for type point
Хотя обычно нецелесообразно исправлять встроенные типы, я не против в этом случае сделать это, и я попытался создать свой собственный=
оператор дляpoint
:
CREATE OR REPLACE FUNCTION compare_points_equality(point1 POINT, point2 POINT)
RETURNS BOOLEAN AS $
SELECT point1[0] = point2[0] AND point1[1] = point1[1];
$ LANGUAGE SQL IMMUTABLE;
CREATE OPERATOR = (
LEFTARG = POINT,
RIGHTARG = POINT,
PROCEDURE = compare_points_equality,
COMMUTATOR = =,
NEGATOR = !=,
HASHES,
MERGES
);
Но даже после создания этого я получаю ту же ошибку. Что я должен сделать, чтобы создать «оператор равенства», если не создать=
?