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 tipointegerse seu valor couber no tipointeger(32 bits); caso contrário, presume-se que seja do tipobigintse 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.