it-swarm.com.de

Fehler beim Auffinden der Konvertierungsfunktion von unbekannt in Text

In einer meiner SELECT-Anweisungen ist folgender Fehler aufgetreten:

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

Dies war einfach mit cast zu beheben, aber ich verstehe nicht ganz, warum es passiert ist. Ich werde meine Verwirrung mit zwei einfachen Aussagen veranschaulichen.

Dieser ist OK:

select 'text'
union all
select 'text';

Dies wird einen Fehler zurückgeben:

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

Ich weiß, ich kann es leicht beheben:

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

Warum schlägt die Konvertierung im zweiten Beispiel fehl? Gibt es eine Logik, die ich nicht verstehe oder die in zukünftigen Versionen von PostgreSQL behoben sein wird?

PostgreSQL 9.1.9

Das gleiche Verhalten unter PostgreSQL 9.2.4 ( SQL Fiddle )

63
Tomas Greif

Postgres freut sich, wenn es Typen von untypisierten Konstanten aus dem Kontext erkennen kann. Wenn jedoch kein Kontext möglich ist und die Abfrage etwas komplexer als trivial ist, schlägt dieser Mechanismus fehl. Diese Regeln sind für jede SELECT-Klausel spezifisch und einige sind strenger, andere nicht. Wenn ich sagen kann, sind ältere Routinen toleranter (aufgrund der höheren Kompatibilität mit Oracle und der geringeren negativen Auswirkungen auf Anfänger) und moderne weniger tolerant (aufgrund der höheren Sicherheit für Tippfehler).

Es gab einige Vorschläge, die versuchten, mit einer unbekannten Literalkonstante wie der Textkonstante zu arbeiten, die jedoch aus weiteren Gründen abgelehnt wurden. Daher erwarte ich keine wesentlichen Änderungen in diesem Bereich. Dieses Problem bezieht sich normalerweise auf synthetische Tests - und weniger auf echte Abfragen, bei denen Typen von Spaltentypen abgeleitet werden.

59
Pavel Stehule