operator does not exist: smallint <> smallint[]

Started by Euler Taveira de Oliveiraabout 17 years ago4 messages

Hi,

I saw a report at .br mailing list [1]http://listas.postgresql.org.br/pipermail/pgbr-geral/2008-December/013277.html 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/

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Euler Taveira de Oliveira (#1)
Re: operator does not exist: smallint <> smallint[]

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

In reply to: Tom Lane (#2)
Re: operator does not exist: smallint <> smallint[]

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/

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Euler Taveira de Oliveira (#3)
Re: operator does not exist: smallint <> smallint[]

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