错误:无法为类型点标识等于运算符

时间:2017-05-16 10:16:20

标签: database postgresql

我使用此代码定义了operator =:

create operator = (leftarg = point, rightarg = point, procedure = point_eq, commutator = =);

但是下面的代码仍然无法正常工作并引发错误,如标题,出了什么问题?

create or replace function skyband_get(dataset text, k integer) 
    returns point[]
as $$
declare 
        rest point[];
        collect point[];
        i integer :=0;
begin
        execute '(select array_agg('||dataset||' order by y DESC,x DESC) from '||dataset||')' into rest;
        while i<k loop
            collect := array_cat(collect,array(select * from skyband_sortedlist(rest)));
            rest := array(select * from(select * from unnest(rest) except select * from unnest(collect)) p);
            i := i + 1;
        end loop;
        return collect;
end;
$$ language plpgsql;

1 个答案:

答案 0 :(得分:2)

要检查UNIONEXCEPT子句中的相等性,PostgreSQL使用类型的默认运算符类相等运算符作为{ {1}}或btree 访问方法(有关这些条款的说明,请参阅the documentation。)

问题是类型hash没有这样的运算符类。

您可以自己创建一个。您必须使用point访问方法,因为无法以合理的方式对点进行排序。

除了等于运算符之外,hash运算符类还需要数据类型的哈希函数,但为hash编写一个很容易:

point

现在您可以定义一个运算符类(您必须是超级用户,因为这样一个定义错误的运算符类可能会混淆或崩溃服务器):

CREATE OR REPLACE FUNCTION public.hashpoint(point) RETURNS integer
   LANGUAGE sql IMMUTABLE
   AS 'SELECT hashfloat8($1[0]) # hashfloat8($1[1])';

现在应该有效:

CREATE OPERATOR CLASS public.point_hash_ops DEFAULT FOR TYPE point USING hash AS
   OPERATOR 1 ~=(point,point),
   FUNCTION 1 public.hashpoint(point);