Impossible de trouver la fonction de conversion de l’inconnu au texte

Dans l’une de mes instructions sélectionnées, 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 en utilisant le cast , mais je ne comprends pas bien pourquoi cela s’est produit. Je vais illustrer ma confusion avec deux déclarations simples.

Celui-ci est OK:

 select 'text' union all select 'text'; 

Cela retournera 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? Y a-t-il une logique que je ne comprends pas ou cela sera corrigé dans la future version de PostgreSQL?

PostgreSQL 9.1.9

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

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 sortingviale, ce mécanisme échoue. Ces règles sont spécifiques à toute clause SELECT et certaines sont plus ssortingctes, d’autres non. Si je peux dire, les routines plus anciennes sont plus tolérantes (en raison de la plus grande compatibilité avec Oracle et moins d’impact négatif sur les débutants), les technologies modernes sont moins tolérantes (en raison de la plus grande sécurité des erreurs de saisie).

Certaines propositions essayaient de travailler avec une constante littérale inconnue, comme la constante du texte, mais ont été rejetées pour plus de raisons. Je ne m’attends donc pas à des changements importants 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 colonnes.