Sua função tem alguns
smallint
parâmetros.Mas na chamada, você está usando literais numéricos que se presume serem do tipo
integer
. Um literal de string ou constante de string (
'123'
) não é digitado imediatamente. Permanece tipo "desconhecido" até que seja atribuído ou convertido explicitamente. No entanto, um literal numérico ou uma constante numérica é digitado imediatamente. O manual:
Uma constante numérica que não contém um ponto decimal nem um expoente é inicialmente presumida como sendo do tipointeger
se seu valor couber no tipointeger
(32 bits); caso contrário, presume-se que seja do tipobigint
se seu valor se encaixa no tipobigint
(64 bits); caso contrário, é considerado o tiponumeric
. Constantes que contêm pontos decimais e/ou expoentes são sempre inicialmente presumidas como sendo do tiponumeric
.
Veja também:
- ERRO do PostgreSQL:a função to_tsvector(variação de caracteres, desconhecido) não existe
Solução
Adicione casts explícitos para o
smallint
parâmetros ou passar literais entre aspas (sem tipo). Demonstração
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Chamada incorreta:
SELECT * FROM f_typetest(1);
Chamadas corretas:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>mexa aqui
Antigo sqlfiddle.