Обсуждение: BUG #5417: intarray adds <@ operator which breaks infromation_schema.referential_constraints

Поиск
Список
Период
Сортировка

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

От
"Kenaniah Cerny"
Дата:
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.
"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