BUG #5417: intarray adds <@ operator which breaks infromation_schema.referential_constraints

Started by Kenaniah Cernyabout 16 years ago2 messagesbugs
Jump to latest
#1Kenaniah Cerny
kenaniah@gmail.com

The following bug has been logged online:

Bug reference: 5417
Logged by: Kenaniah Cerny
Email address: kenaniah@gmail.com
PostgreSQL version: 8.4.2 - 9.0
Operating system: linux
Description: intarray adds <@ operator which breaks
infromation_schema.referential_constraints
Details:

Attempting to select * from information_schema.referential_constraints when
the intarray contrib module is loaded on a database produces the following
result:

ERROR: operator is not unique: smallint[] <@ smallint[]
LINE 1: select $1 <@ $2 and $2 <@ $1
^
HINT: Could not choose a best candidate operator. You might need to add

explicit type casts.

QUERY: select $1 <@ $2 and $2 <@ $1
CONTEXT: SQL function "_pg_keysequal" during inlining

It is expected that this is due to intarray defining its own version of the
<@ operator.

Steps to reproduce:

select * from >information_schema.referential_constraints; --success

begin;
\i /usr/local/.../share/contrib/_int.sql;
select * from information_schema.referential_constraints; --failure
rollback;

This bug has been verified in versions 8.4.2, 8.4.3, and 9.0-dev and has not
been checked in other versions yet.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Kenaniah Cerny (#1)
Re: BUG #5417: intarray adds <@ operator which breaks infromation_schema.referential_constraints

"Kenaniah Cerny" <kenaniah@gmail.com> writes:

Attempting to select * from information_schema.referential_constraints when
the intarray contrib module is loaded on a database produces the following
result:

ERROR: operator is not unique: smallint[] <@ smallint[]
LINE 1: select $1 <@ $2 and $2 <@ $1

Thanks for the report. I've applied a patch for this in HEAD. If you
need to make it work in existing releases, try doing

CREATE OR REPLACE FUNCTION information_schema._pg_keysequal(smallint[], smallint[]) RETURNS boolean
LANGUAGE sql IMMUTABLE -- intentionally not STRICT, to allow inlining
AS 'select $1 operator(pg_catalog.<@) $2 and $2 operator(pg_catalog.<@) $1';

as superuser.

regards, tom lane