Vous n'êtes pas identifié(e).

#2 Re : Migration » [Résolu] Migration 8.4 vers 9.5 : problème int4/bigint » 10/02/2017 10:25:27

ail

Bonjour,

Merci pour cette réponse, encore une chose que j'ignorais de PostgreSQL.
J'ai vérifié, il n'y a pas de différence entre les deux installations de PostgreSQL.
Par contre, ça m'a permis de mettre en évidence que le problème était ailleurs : une variable, qui dans certains cas n'est pas correctement initialisée, contient une valeur supérieure à 2^31, et qui donc ne tient pas dans un bigint.
En appelant ma fonction avec une valeur inférieure à 2^31, elle fonctionne sans problème, par contre, je reproduis bien la même erreur dès que la valeur passée en argument est supérieure à 2^31.
Désolé pour le dérangement et merci beaucoup pour le temps que vous avez bien voulu m'accorder.

Une dernière question cependant : j'ai eu beaucoup de mal à trouver des notes de migration d'une version à l'autre de PostgreSQL, où dois-je chercher de telles notes (si elles existent)
Encore merci

#3 Re : Migration » [Résolu] Migration 8.4 vers 9.5 : problème int4/bigint » 09/02/2017 12:24:12

ail

Bonjour,

Merci pour cette réponse.
Je viens de vérifier, le code avait été compilé en 64 bits.
En lisant cette page : https://www.postgresql.org/docs/9.5/sta … -func.html, j'avais compris que PostgreSQL cherchait dans la mesure du possible à faire un cast sur le nom de la fonction appelée
Existe-t-il une différence de traitement du cast entre la 8.4 et la 9.5, ou bien une manière de configurer les types de cast que peut faire PostreSQL ?

Merci

#4 Migration » [Résolu] Migration 8.4 vers 9.5 : problème int4/bigint » 08/02/2017 19:31:43

ail
Réponses : 7

Bonjour,

J'ai migré une application d'un serveur RHEL 5 vers une RHEL 6.5 et donc d'une base PostgreSQL 8.4.2 vers une PostgreSQL 9.5.4.
Je rencontre un problème lors de l'appel d'une fonction stockée dont le prototype est de la forme :
CREATE OR REPLACE FUNCTION ma_fonction(int4)
L'erreur que j'ai est la suivante :
ERREUR:  la fonction ma_fonction(bigint) n'existe pas au caractère ..
ASTUCE :  Aucune fonction ne correspond au nom donné et aux types d'arguments.

Je l'appelle depuis un code C++ en lui passant un long en argument.
Ceci ne posait pas de problème auparavant, même sur une machine 64 bits.

J'ai pu résoudre le problème en faisant un cast dans le code C++ vers un int32_t, mais je me pose plusieurs questions :

1/ Comment se fait il que je n'ai pas vu d'autres erreurs de ce type alors que de nombreuses fonctions stockées sont définies avec des paramètres déclarés en int4, et appelées avec des long en paramètre ?
2/ Pourquoi cette différence de comportement entre une version 8.4 et une version 9.5 ? (je n'ai rien vu dans les release notes)
3/ Existe-t-il une façon de forcer un cast pour ce type de paramètres ?

Merci

Pied de page des forums

Propulsé par FluxBB