web-dev-qa-db-fra.com

Impossible de trouver la fonction de conversion inconnue en texte

Dans l'une de mes déclarations select, j'ai 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

C'était facile à résoudre avec cast, mais je ne comprends pas très bien pourquoi c'est arrivé. Je vais illustrer ma confusion avec deux déclarations simples.

Celui-ci est OK:

select 'text'
union all
select 'text';

Cela renverra une erreur:

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? Existe-t-il une logique que je ne comprends pas ou cela sera corrigé dans les futures versions de PostgreSQL?

PostgreSQL 9.1.9

Le même comportement sur PostgreSQL 9.2.4 ( SQL Fiddle )

63
Tomas Greif

Postgres est content s'il peut détecter des types de constantes non typées à partir du contexte. Mais lorsqu'un 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 pas. Si je peux dire, les anciennes routines sont plus tolérantes (en raison d'une compatibilité plus élevée avec Oracle et d'un impact moins négatif sur les débutants), les modernes sont moins tolérantes (en raison d'une sécurité plus élevée des erreurs de type).

Certaines propositions tentaient de travailler avec une constante littérale inconnue telle que constante de texte, mais 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é aux tests synthétiques, et moins aux requêtes réelles, où les types sont déduits des types de colonne.

59
Pavel Stehule