Erreur 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.
Le message est précis d'une manière facile à mal lire : PostgreSQL ne dit pas « round n'existe pas » — il dit qu'aucun round n'existe qui prenne (double precision, integer). La fonction est généralement là, avec une signature différente, et le HINT sur les casts explicites est la vraie solution le plus souvent.
Ce que signifie cette erreur
PostgreSQL résout les fonctions par nom et types d'arguments (surcharge), avec un casting implicite limité. L'exemple est le cas canonique : round() à deux arguments existe pour numeric, pas pour double precision — donc round(x, 2) sur une colonne float échoue tant que vous ne castez pas. Le même mécanisme produit operator does not exist: text = integer pour les comparaisons entre types incompatibles.
Causes fréquentes
- Incohérence de type d'argument avec une fonction existante — l'exemple round, ou des fonctions utilisateur appelées avec les mauvais types.
- L'extension n'est pas installée :
uuid_generate_v4()a besoin d'uuid-ossp(bien que PostgreSQL moderne dispose degen_random_uuid()intégré — PostgreSQL 13+),ll_to_earth()a besoin d'earthdistance, et ainsi de suite. - Installée dans un schéma pas sur le
search_path— courant quand les extensions vivent dans un schéma dédié commeextensions. - Environnement différent : la fonction ou l'extension existe en prod mais pas dans la base de test.
Comment la diagnostiquer
\df round -- signatures disponibles par nom
\dx -- extensions installées
-- La fonction existe-t-elle quelque part hors du 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';
Comment la corriger
- Incohérence de type → castez l'argument :
round(x::numeric, 2). Pour les opérateurs : comparez des types compatibles, en castant le côté constant lorsque c'est possible afin que les index sur la colonne restent utilisables. - Extension manquante →
CREATE EXTENSION "uuid-ossp";(par base, nécessite les privilèges appropriés) — ou préférez legen_random_uuid()intégré sur PostgreSQL 13+. - Schéma → qualifiez l'appel (
extensions.uuid_generate_v4()) ou ajoutez le schéma ausearch_pathau niveau rôle/base.
🔍
Même machinerie de résolution, version table : relation does not exist.
