84 votes

Échec de la recherche d'une fonction de conversion d'inconnu en texte

Dans l'une de mes instructions select, j'ai obtenu l'erreur suivante :

ERROR:  failed to find conversion function from unknown to text
********** Error **********
ERROR: failed to find conversion function from unknown to text
SQL state: XX000

Ce problème a été facilement résolu à l'aide de cast mais je ne comprends pas tout à fait pourquoi cela s'est produit. Je vais illustrer ma confusion par deux déclarations simples.

Celui-ci est correct :

select 'text'
union all
select 'text';

Une erreur est alors générée :

with t as (select 'text')    
select * from t
union all
select 'text'

Je sais que je peux le réparer facilement :

with t as (select 'text'::text)    
select * from t
union all
select 'text'

Pourquoi la conversion échoue-t-elle dans le deuxième exemple ? Y a-t-il une logique que je ne comprends pas ou cela sera-t-il corrigé dans une prochaine version de PostgreSQL ?

PostgreSQL 9.1.9

Même comportement sur PostgreSQL 9.2.4 ( Fidèle à SQL )

78voto

Pavel Stehule Points 8337

Postgres est satisfait s'il peut détecter les types de constantes non typées à partir du contexte. Mais lorsque le contexte n'est pas possible et que la requête est un peu plus complexe que triviale, ce mécanisme échoue. Ces règles sont spécifiques à toute clause SELECT, et certaines sont plus strictes, d'autres non. Si je puis dire, les routines plus anciennes sont plus tolérantes (en raison d'une plus grande compatibilité avec Oracle et d'un impact négatif moindre sur les débutants), les routines modernes sont moins tolérantes (en raison d'une plus grande sécurité vis-à-vis des erreurs de type).

Certaines propositions ont tenté de travailler avec des constantes littérales inconnues comme des constantes de texte, mais elles ont été rejetées pour d'autres raisons. Je ne m'attends donc pas à des changements significatifs dans ce domaine. Ce problème est généralement lié à des tests synthétiques - et moins à des requêtes réelles, où les types sont déduits des types de colonnes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X