pg.ddx.io pgsql-sql@postgresql.org mailing list archive
help / color / mirror / Atom feeddistinct aggregate with complex type dont see the equality operator
2+ messages / 1 participants
[nested] [flat]
* distinct aggregate with complex type dont see the equality operator
@ 2006-05-29 20:14 Thomas Chille <thomas@chille.de>
0 siblings, 0 replies; 2+ messages in thread
From: Thomas Chille @ 2006-05-29 20:14 UTC (permalink / raw)
To: pgsql-sql
Dear List,
i want to built an aggregate function wich should summing up values in
a distinct manner:
dsum(DISTINCT ROW(value, distinction)).
I implemented all things i thought i need but it dont work. i get
always an 'could not identify an equality operator for type
dsum_type'-error nevertheless the operator will be identified outside
the aggregate.
Here is the code for the equality operator:
CREATE OR REPLACE FUNCTION dsum_type_greater(dsum_type, dsum_type)
RETURNS boolean AS $f$
SELECT $1.distinction > $2.distinction;
$f$ LANGUAGE sql IMMUTABLE STRICT;
CREATE OPERATOR = (
PROCEDURE = dsum_type_equality,
LEFTARG = dsum_type,
RIGHTARG = dsum_type,
COMMUTATOR = =
);
And this happens:
-- result is FALSE
SELECT ROW(5, 'foo')::dsum_type = ROW(5, 'bar')::dsum_type;
-- result is TRUE
SELECT ROW(5, 'foo')::dsum_type = ROW(5, 'foo')::dsum_type;
-- result is TRUE
SELECT ROW(4, 'foo')::dsum_type = ROW(5, 'foo')::dsum_type;
-- works for me
SELECT dsum(ROW(wert, name)::dsum_type) FROM table1;
-- ERROR: could not identify an equality operator for type dsum_type
SELECT dsum(DISTINCT ROW(wert, name)::dsum_type) FROM table1;
i added the less then and greater then ops too, but it still wont work.
What i am doing wrong or can i achieve the wished result without
usinge a comlex type?
regards,
Thomas!
^ permalink raw reply [nested|flat] 2+ messages in thread
* Re: distinct aggregate with complex type dont see the equality operator [solved]
@ 2006-06-01 14:21 Thomas Chille <thomas@chille.de>
0 siblings, 0 replies; 2+ messages in thread
From: Thomas Chille @ 2006-06-01 14:21 UTC (permalink / raw)
To: pgsql-sql
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;
^ permalink raw reply [nested|flat] 2+ messages in thread
end of thread, other threads:[~2006-06-01 14:21 UTC | newest]
Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2006-05-29 20:14 distinct aggregate with complex type dont see the equality operator Thomas Chille <thomas@chille.de>
2006-06-01 14:21 Re: distinct aggregate with complex type dont see the equality operator [solved] Thomas Chille <thomas@chille.de>
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox