web-dev-qa-db-ja.com

関数quote_nullable(タイムゾーンのないタイムスタンプ)は一意ではありません

「enterprisedb9.2」でこのクエリを実行すると、エラーが発生します。

_select quote_nullable(to_date('09-02-2014 ','dd-MM-yyyy'))::date;
_

エラー:

_LINE 1: select quote_nullable(to_date('09-02-2014 ','dd-MM-yyyy'))::...
               ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.
********** Error **********

ERROR: function quote_nullable(timestamp without time zone) is not unique
SQL state: 42725
Hint: Could not choose a best candidate function. You might need to add explicit type casts.
Character: 8
_

Postgresql 9.1では、上記のこのクエリは正常に実行されます。

ここで何が起こっているのか教えてください。関数quote_nullable(timestamp without time zone)が一意でないのはなぜですか?

1
Luan Huynh

私のインストール(Postgres 9.3)と同じように動作します。

おそらくtextにキャストすることでこれを修正できます。

_SELECT quote_nullable(to_date('09-02-2014 ','dd-MM-yyyy')::text);
_

そして、notで結果をdateにキャストします。結果をdateにキャストし直そうとすると、quote_nullable()を呼び出すのは無意味です。 NULL入力でも失敗します。

Postgresは 関数のオーバーロード を許可します。私のインストールには、 quote_nullable() のインスタンスがtextを取り、別のインスタンスがanyelementを取ります( ポリモーフィックタイプ )。後者はdateを処理します。

_timestamp without time zone_の場合:Postgresは最初に完全一致(この場合はdate)を探し、次に暗黙的にキャストできる型やポリモーフィック型などの他のオプションを検討します。マニュアルには、 関数タイプの解決の正確な手順が記載されています。

EnterpriseDBについてはよくわかりません。これを実行して診断します。

_SELECT n.nspname AS schema_name
      ,p.proname AS function_name
      ,pg_get_function_arguments(p.oid) AS args
      ,pg_get_functiondef(p.oid) AS func_def
FROM   pg_proc p
JOIN   pg_namespace n ON n.oid = p.pronamespace
WHERE  proname = 'quote_nullable';
_

SOに関するこの関連する回答で、関数のオーバーロードについて詳しく説明します。
エラー:関数addgeometrycolumnが一意ではありません

3