"David E. Wheeler" <da...@justatheory.com> writes:
> I’m doing some development with the new JSON type (actually, Andrew’s 
> 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

Reply via email to