La tua funzione ha un paio di smallint
parametri.
Ma nella chiamata stai usando valori letterali numerici che si presume siano di tipo integer
.
Una stringa letterale o una costante stringa ('123'
) non viene digitato immediatamente. Rimane di tipo "sconosciuto" finché non viene assegnato o lanciato in modo esplicito.
Tuttavia, un valore letterale numerico o una costante numerica viene digitato immediatamente. Il manuale:
Si presume che una costante numerica che non contenga né un punto decimale né un esponente inizialmente sia di tipo integer
se il suo valore rientra nel tipo integer
(32 bit); altrimenti si presume che sia di tipo bigint
se il suo valore rientra nel tipo bigint
(64 bit); in caso contrario è di tipo numeric
. Inizialmente si presume sempre che le costanti che contengono punti decimali e/o esponenti siano di tipo numeric
.
Vedi anche:
- ERRORE PostgreSQL:la funzione to_tsvector(carattere variabile, sconosciuto) non esiste
Soluzione
Aggiungi cast espliciti per smallint
parametri o passare letterali tra virgolette (non tipizzati).
Dimostrazione
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Chiamata errata:
SELECT * FROM f_typetest(1);
Chiamate corrette:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>gioca qui
Sqlfiddle vecchio.