Обсуждение: operator does not exist: smallint <> smallint[]

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

operator does not exist: smallint <> smallint[]

От
Euler Taveira de Oliveira
Дата:
Hi,

I saw a report at .br mailing list [1] complaining about the message's title.
I do not try to investigate it.  Am I missing something?

euler=# select attname from pg_attribute where attnum > 0 and attnum <>
ALL(select conkey from pg_constraint where conrelid = attrelid and contype = 'p');
ERROR:  operator does not exist: smallint <> smallint[]
LINHA 1: ...ame from pg_attribute where attnum > 0 and attnum <> ALL(sel...
               ^
 
DICA:  No operator matches the given name and argument type(s). You might need
to add explicit type casts.
euler=# select 1::smallint <> ALL(array[2::smallint, 3::smallint]);?column?
----------t
(1 registro)

euler=# select 1::smallint <> ALL(array[1::smallint, 2::smallint,3::smallint]);?column?
----------f
(1 registro)

euler=# select 1::smallint <> ALL(array[1, 2, 3]);?column?
----------f
(1 registro)


[1] http://listas.postgresql.org.br/pipermail/pgbr-geral/2008-December/013277.html


--  Euler Taveira de Oliveira http://www.timbira.com/


Re: operator does not exist: smallint <> smallint[]

От
Tom Lane
Дата:
Euler Taveira de Oliveira <euler@timbira.com> writes:
> I saw a report at .br mailing list [1] complaining about the message's title.
> I do not try to investigate it.  Am I missing something?

> euler=# select attname from pg_attribute where attnum > 0 and attnum <>
> ALL(select conkey from pg_constraint where conrelid = attrelid and contype = 'p');
> ERROR:  operator does not exist: smallint <> smallint[]

It's entirely right: there's no such operator.



Oh, you wanted a way to write the query correctly?  I think what this
person wants might be something like

select attname from pg_attribute where attnum > 0 and not attisdropped
and not exists (select 1 from pg_constraint where attnum = ANY(conkey)               and conrelid = attrelid and
contype= 'p');
 

... although that produces quite a lot of rows, so some additional
constraint is probably wanted too.
        regards, tom lane


Re: operator does not exist: smallint <> smallint[]

От
Euler Taveira de Oliveira
Дата:
Tom Lane escreveu:
> Euler Taveira de Oliveira <euler@timbira.com> writes:
>> I saw a report at .br mailing list [1] complaining about the message's title.
>> I do not try to investigate it.  Am I missing something?
> 
>> euler=# select attname from pg_attribute where attnum > 0 and attnum <>
>> ALL(select conkey from pg_constraint where conrelid = attrelid and contype = 'p');
>> ERROR:  operator does not exist: smallint <> smallint[]
> 
> It's entirely right: there's no such operator.
> 
Out of curiosity, why the other queries work?

euler=# select 1::smallint <> ALL(array[2::smallint, 3::smallint]);?column?
----------t
(1 registro)

euler=# select 1::smallint <> ALL(array[1::smallint, 2::smallint,3::smallint]);?column?
----------f
(1 registro)

euler=# select 1::smallint <> ALL(array[1, 2, 3]);?column?
----------f
(1 registro)


--  Euler Taveira de Oliveira http://www.timbira.com/


Re: operator does not exist: smallint <> smallint[]

От
Tom Lane
Дата:
Euler Taveira de Oliveira <euler@timbira.com> writes:
> Tom Lane escreveu:
>> It's entirely right: there's no such operator.
>> 
> Out of curiosity, why the other queries work?

The behavior is different depending on whether the argument of ANY/ALL
is a sub-SELECT or not.  If it is, then the comparisons are between the
LHS and the successive values produced by the sub-SELECT.  If it isn't,
then the RHS has to produce an array and the comparisons are to the
array elements.
        regards, tom lane