Em terça-feira, 10 de maio de 2016, David E. Wheeler <da...@justatheory.com> escreveu:
> Hackers, > > pgTAP has a function that compares two values of a given type, which it > uses for comparing column defaults. It looks like this: > > CREATE OR REPLACE FUNCTION _def_is( TEXT, TEXT, anyelement, TEXT ) > RETURNS TEXT AS $$ > DECLARE > thing text; > BEGIN > IF $1 ~ '^[^'']+[(]' THEN > -- It's a functional default. > RETURN is( $1, $3, $4 ); > END IF; > > EXECUTE 'SELECT is(' > || COALESCE($1, 'NULL' || '::' || $2) || '::' || $2 || ', > ' > || COALESCE(quote_literal($3), 'NULL') || '::' || $2 || > ', ' > || COALESCE(quote_literal($4), 'NULL') > || ')' INTO thing; > RETURN thing; > END; > $$ LANGUAGE plpgsql; > > The is() function does an IS DISTINCT FROM to compare the two values > passed to it. This has been working pretty well for years, but one place it > doesn’t work is with JSON values. I get: > > LINE 1: SELECT NOT $1 IS DISTINCT FROM $2 > ^ > HINT: No operator matches the given name and argument type(s). You > might need to add explicit type casts. > QUERY: SELECT NOT $1 IS DISTINCT FROM $2 > > This makes sense, of course, and I could fix it by comparing text values > instead of json values when the values are JSON. But of course the lack of > a = operator is not limited to JSON. So I’m wondering if there’s an > interface at the SQL level to tell me whether a type has an = operator? > That way I could always use text values in those situations. > > Searching for the operator in pg_operator catalog isn't enought? Regards, -- Fabrízio de Royes Mello Consultoria/Coaching PostgreSQL >> Timbira: http://www.timbira.com.br >> Blog: http://fabriziomello.github.io >> Linkedin: http://br.linkedin.com/in/fabriziomello >> Twitter: http://twitter.com/fabriziomello >> Github: http://github.com/fabriziomello