"David E. Wheeler" <da...@justatheory.com> writes: > Im doing some development with the new JSON type (actually, Andrews > backport to 9.1) and needed to do some very basic equivalence testing. So I > created a custom operator:
> CREATE OR REPLACE FUNCTION json_eq( > json, > json > ) RETURNS BOOLEAN LANGUAGE SQL STRICT IMMUTABLE AS $$ > SELECT $1::text = $2::text; > $$; > CREATE OPERATOR = ( > LEFTARG = json, > RIGHTARG = json, > PROCEDURE = json_eq > ); > With this in place, these work: > SELECT '{}'::json = '{}'::json; > SELECT ROW('{}'::json) = ROW('{}'::json); > However this does not: > create type ajson AS (a json); > SELECT ROW('{}'::json)::ajson = ROW('{}'::json)::ajson; > That last line emits an error: > ERROR: could not identify an equality operator for type json > To which my response was: WTF? You have not told the system that your operator is equality for the datatype. It's just a random operator that happens to be named "=". We try to avoid depending on operator names as cues to semantics. You need to incorporate it into a default hash or btree opclass before the composite-type logic will accept it as the thing to use for comparing that column. regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers