X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (mx1.hub.org [200.46.208.251]) by postgresql.org (Postfix) with ESMTP id 04B199FA040 for ; Thu, 1 Jun 2006 11:22:06 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.208.251]) (amavisd-new, port 10024) with ESMTP id 11731-01 for ; Thu, 1 Jun 2006 11:22:00 -0300 (ADT) X-Greylist: domain auto-whitelisted by SQLgrey- Received: from ug-out-1314.google.com (ug-out-1314.google.com [66.249.92.174]) by postgresql.org (Postfix) with ESMTP id 332F89FA5DD for ; Thu, 1 Jun 2006 11:21:59 -0300 (ADT) Received: by ug-out-1314.google.com with SMTP id a2so156078ugf for ; Thu, 01 Jun 2006 07:21:58 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:sender:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition:x-google-sender-auth; b=QrVqAuL6sZ4uIvvddTECZZ1an/qOatC2mHI1XoxMRqgaw8uMdOnLnpznyaDhF2Q2UKgPccLdIvJXIsMsEY7bljJdYR/Qn6CkNhpWln7p6Me+aMS2fX4clD7x0u67wlDOiKbtyoXBKCq9wjeULI8jOBE0mLoJ/7qO6cGg2eCD/AM= Received: by 10.78.31.18 with SMTP id e18mr119280hue; Thu, 01 Jun 2006 07:21:58 -0700 (PDT) Received: by 10.78.15.19 with HTTP; Thu, 1 Jun 2006 07:21:58 -0700 (PDT) Message-ID: Date: Thu, 1 Jun 2006 16:21:58 +0200 From: "Thomas Chille" To: "pgsql-sql@postgresql.org" Subject: Re: distinct aggregate with complex type dont see the equality operator [solved] MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Google-Sender-Auth: ae21431483367c42 X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200606/44 X-Sequence-Number: 25280 using DISTINCT with complex types depends on an OPERATOR CLASS for B-Tree-Indexes i found out. the error msg 'could not identify an equality operator for type' was confusing. i post this complete example. maybe someone else is running in this problem too. regards, thomas! CREATE TYPE named_value AS ( value_name text, value numeric ); CREATE OR REPLACE FUNCTION named_value_lt(named_value, named_value) RETURNS boolean AS $f$ SELECT $1.value_name < $2.value_name; $f$ LANGUAGE sql IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION named_value_lt_eq(named_value, named_value) RETURNS boolean AS $f$ SELECT $1.value_name <= $2.value_name; $f$ LANGUAGE sql IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION named_value_eq(named_value, named_value) RETURNS boolean AS $f$ SELECT $1.value_name = $2.value_name; $f$ LANGUAGE sql IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION named_value_gt_eq(named_value, named_value) RETURNS boolean AS $f$ SELECT $1.value_name >= $2.value_name; $f$ LANGUAGE sql IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION named_value_gt(named_value, named_value) RETURNS boolean AS $f$ SELECT $1.value_name > $2.value_name; $f$ LANGUAGE sql IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION named_value_cmp(named_value, named_value) RETURNS integer AS $f$ SELECT CASE WHEN $1.value_name < $2.value_name THEN -1 WHEN $1.value_name = $2.value_name THEN 0 ELSE 1 END; $f$ LANGUAGE sql IMMUTABLE STRICT; CREATE OPERATOR < ( PROCEDURE = named_value_lt, LEFTARG = named_value, RIGHTARG = named_value, COMMUTATOR = > ); CREATE OPERATOR <= ( PROCEDURE = named_value_lt_eq, LEFTARG = named_value, RIGHTARG = named_value, COMMUTATOR = >= ); CREATE OPERATOR = ( PROCEDURE = named_value_eq, LEFTARG = named_value, RIGHTARG = named_value, COMMUTATOR = = ); CREATE OPERATOR >= ( PROCEDURE = named_value_gt_eq, LEFTARG = named_value, RIGHTARG = named_value, COMMUTATOR = <= ); CREATE OPERATOR > ( PROCEDURE = named_value_gt, LEFTARG = named_value, RIGHTARG = named_value, COMMUTATOR = < ); CREATE OPERATOR CLASS named_value_ops DEFAULT FOR TYPE named_value USING btree AS OPERATOR 1 < , OPERATOR 2 <= , OPERATOR 3 = , OPERATOR 4 >= , OPERATOR 5 > , FUNCTION 1 named_value_cmp(named_value, named_value); CREATE OR REPLACE FUNCTION sum_final(named_value) RETURNS numeric AS $f$ SELECT $1.value; $f$ LANGUAGE sql IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION sum_accum(named_value, named_value) RETURNS named_value AS $f$ SELECT ROW('', $1.value + $2.value)::named_value; $f$ LANGUAGE sql IMMUTABLE STRICT; CREATE AGGREGATE sum( BASETYPE = named_value, SFUNC = sum_accum, STYPE = named_value, FINALFUNC = sum_final, INITCOND = "('',0)" ); -- result is FALSE SELECT ROW('foo', 5)::named_value = ROW('bar', 5)::named_value; -- result is TRUE SELECT ROW('foo', 5)::named_value = ROW('foo', 5)::named_value; -- result is TRUE SELECT ROW('foo', 4)::named_value = ROW('foo', 5)::named_value; -- works for me SELECT sum(ROW(name, wert)::named_value) FROM table1; -- now works for me too SELECT DISTINCT ROW(wert, name)::named_value FROM table1; SELECT sum(DISTINCT ROW(name, wert)::named_value) FROM table1;