Error de 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.
El mensaje es preciso de una manera fácil de malinterpretar: PostgreSQL no está diciendo "round no existe" — está diciendo que no existe ningún round que tome (double precision, integer). La función normalmente está ahí, con una firma distinta, y el HINT sobre casts explícitos es la solución real más a menudo que no.
Qué significa este error
PostgreSQL resuelve las funciones por nombre y tipos de argumento (sobrecarga), con casting implícito limitado. El ejemplo es el caso canónico: el round() de dos argumentos existe para numeric, no para double precision — así que round(x, 2) sobre una columna float falla hasta que casteas. El mismo mecanismo produce operator does not exist: text = integer en comparaciones entre tipos que no coinciden.
Causas comunes
- Desajuste de tipo de argumento con una función existente — el ejemplo de round, o funciones de usuario llamadas con los tipos incorrectos.
- La extensión no está instalada:
uuid_generate_v4()necesitauuid-ossp(aunque PostgreSQL moderno tienegen_random_uuid()incorporado — PostgreSQL 13+),ll_to_earth()necesitaearthdistance, etc. - Instalada en un schema que no está en
search_path— común cuando las extensiones viven en un schema dedicado comoextensions. - Entorno distinto: la función o extensión existe en prod pero no en la base de datos de test.
Cómo diagnosticarlo
\df round -- firmas disponibles por nombre
\dx -- extensiones instaladas
-- ¿La función existe en alguna parte fuera de 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';
Cómo solucionarlo
- Desajuste de tipo → castea el argumento:
round(x::numeric, 2). Para operadores: compara tipos compatibles, casteando el lado de la constante cuando sea posible para que los índices sobre la columna sigan siendo utilizables. - Extensión faltante →
CREATE EXTENSION "uuid-ossp";(por base de datos, necesita los privilegios apropiados) — o prefiere elgen_random_uuid()incorporado en PostgreSQL 13+. - Schema → cualifica la llamada (
extensions.uuid_generate_v4()) o añade el schema asearch_patha nivel de rol/base de datos.
🔍
La misma maquinaria de resolución, edición tabla: relation does not exist.
