Errore PostgreSQL: function does not exist

ERROR:  function round(double precision, integer) does not exist
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Il messaggio è preciso in un modo facile da fraintendere: PostgreSQL non sta dicendo "round non esiste" — sta dicendo che non esiste alcun round che prenda (double precision, integer). La funzione di solito c'è, con una firma diversa, e l'HINT sui cast espliciti è la vera soluzione più spesso di quanto non sembri.

Cosa significa questo errore

PostgreSQL risolve le funzioni per nome e per tipi di argomento (overloading), con un casting implicito limitato. L'esempio è il caso canonico: round() a due argomenti esiste per numeric, non per double precision — quindi round(x, 2) su una colonna float fallisce finché non fai il cast. Lo stesso meccanismo produce operator does not exist: text = integer per confronti tra tipi non corrispondenti.

Cause comuni

Come diagnosticarlo

\df round        -- firme disponibili per nome
\dx              -- estensioni installate

-- La funzione esiste da qualche parte fuori search_path?
SELECT n.nspname, p.proname
FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.proname = 'uuid_generate_v4';

Come risolverlo

🔍 Stesso meccanismo di risoluzione, edizione tabelle: relation does not exist.