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
- Mismatch di tipo degli argomenti con una funzione esistente — l'esempio di round, o funzioni utente chiamate con i tipi sbagliati.
- L'estensione non è installata:
uuid_generate_v4()richiedeuuid-ossp(anche se PostgreSQL moderno hagen_random_uuid()integrato — PostgreSQL 13+),ll_to_earth()richiedeearthdistance, e così via. - Installata in uno schema non presente in
search_path— comune quando le estensioni vivono in uno schema dedicato comeextensions. - Ambiente diverso: la funzione o l'estensione esiste in prod ma non nel database di test.
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
- Mismatch di tipo → fai il cast dell'argomento:
round(x::numeric, 2). Per gli operatori: confronta tipi compatibili, facendo il cast del lato costante dove possibile così gli indici sulla colonna restano utilizzabili. - Estensione mancante →
CREATE EXTENSION "uuid-ossp";(per database, richiede privilegi adeguati) — oppure preferisci l'integratagen_random_uuid()su PostgreSQL 13+. - Schema → qualifica la chiamata (
extensions.uuid_generate_v4()) o aggiungi lo schema asearch_patha livello di ruolo/database.
🔍
Stesso meccanismo di risoluzione, edizione tabelle: relation does not exist.
