「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)
が一意でないのはなぜですか?
私のインストール(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が一意ではありません