1. ホーム
  2. postgresql

[解決済み] 未知語からテキストへの変換関数の検索に失敗しました。

2022-03-15 06:35:45

質問

あるselect文で、以下のようなエラーが発生しました。

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つの簡単な文章で説明します。

こちらはOKです。

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フィドル )

解決方法は?

Postgresはコンテキストから型付けされていない定数の型を検出することができれば満足です。しかし、どのようなコンテキストも不可能な場合、そして、クエリが単純なものよりも少し複雑な場合、この機構は失敗します。これらのルールはあらゆるSELECT句に特有のものであり、より厳しいものもあればそうでないものもあります。もし私が言えるとしたら、古いルーチンはより寛容で(Oracleとの互換性が高く、初心者への悪影響が少ないため)、最新のルーチンはより寛容ではありません(型エラーへの安全性が高いため)。

テキスト定数のような未知のリテラル定数を扱えるようにしようという提案もありましたが、より多くの理由で拒否されました。だから、この分野での大きな変化は期待できない。この問題は通常、合成テストに関連するもので、実際のクエリ(列の型から型を推測するもの)にはあまり関係しません。