web-dev-qa-db-ja.com

不明からテキストへの変換関数が見つかりませんでした

選択ステートメントの1つで、次のエラーが発生しました。

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

これはcastを使用して簡単に修正できましたが、なぜ発生したのか完全にはわかりません。 2つの簡単なステートメントで混乱を説明します。

これは大丈夫です:

select 'text'
union all
select 'text';

これはエラーを返します:

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

私はそれを簡単に修正できることを知っています:

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

2番目の例で変換が失敗するのはなぜですか?私が理解していないロジックがありますか、これはPostgreSQLの将来のバージョンで修正されますか?

PostgreSQL 9.1.9

PostgreSQL 9.2.4での同じ動作( SQL Fiddle

63
Tomas Greif

Postgresは、コンテキストから型なし定数のタイプを検出できれば幸いです。しかし、コンテキストが不可能で、クエリが些細なことよりも少し複雑な場合、このメカニズムは失敗します。これらの規則はすべてのSELECT節に固有のものであり、一部はより厳密で、一部はそうではありません。私が言うことができるなら、古いルーチンはより寛容であり(Oracleとの互換性が高く、初心者への悪影響が少ないため)、現代はより寛容ではありません(タイプエラーに対する安全性が高いため)。

テキスト定数のような未知のリテラル定数を使用しようとする提案がいくつかありましたが、より多くの理由で拒否されました。ですから、この分野での大きな変化は期待していません。この問題は通常、模擬テストに関連しています-実際のクエリではなく、型が列型から推定されます。

59
Pavel Stehule