最初 、関数には2つが必要です リチャードがすでに提案したように、定義内のパラメータがあり、それに応じて質問を更新しました。
2番目 、"any"を使用してその関数を作成できます LANGUAGE internalを使用した入力 。ただし、そうすべきだという意味ではありません。
concat_ws() STABLEのみです 理由があります。とりわけ、dateのテキスト表現 またはtimestamp ロケール/日付スタイルの設定に依存するため、結果は不変ではありません。 。これに基づいて構築されたインデックスは、黙って壊れることがあります。 textに制限されています 入力、IMMUTABLEと宣言しても安全です 。必要なのはtextだけなので 入力(またはvarchar 、textへの暗黙のキャストがあります )、ユースケースに限定して安全を確保してください:
CREATE OR REPLACE FUNCTION immutable_concat_ws(text, VARIADIC text[])
RETURNS text AS 'text_concat_ws' LANGUAGE internal IMMUTABLE PARALLEL SAFE;
PARALLEL SAFEとしてマークします この機能を使用するときに並列処理を損なわないようにします。 マニュアル:
このようなことをしたいという誘惑に抵抗してくださいimmutable_concat_ws('|', now()::text, 'foo') 。これにより、上記の依存関係が呼び出しに再導入されます。
関連: