ERROR: function … does not exist and HINT: No function matches the given name and argument types

Your function has a couple of smallint parameters.
But in the call, you are using numeric literals that are presumed to be type integer.

A string literal or string constant ('123') is not typed immediately. It remains type “unknown” until assigned or cast explicitly.

However, a numeric literal or numeric constant is typed immediately. The manual:

A numeric constant that contains neither a decimal point nor an
exponent is initially presumed to be type integer if its value
fits in type integer (32 bits); otherwise it is presumed to be type
bigint if its value fits in type bigint (64 bits); otherwise it is
taken to be type numeric. Constants that contain decimal points and/or
exponents are always initially presumed to be type numeric.

Also see:

  • PostgreSQL ERROR: function to_tsvector(character varying, unknown) does not exist


Add explicit casts for the smallint parameters or pass quoted (untyped) literals.


CREATE OR REPLACE FUNCTION f_typetest(smallint)

Incorrect call:

SELECT * FROM f_typetest(1);

Correct calls:

SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);

db<>fiddle here
Old sqlfiddle.

Leave a Comment