UDF 名の競合の回避
UDF を実装する前に UDF の命名規則を考慮することにより、競合を防止したり、予期せぬ結果を回避したりできます。関数名は多重定義が可能であるため、現在使用されている、および将来使用される Amazon Redshift 関数名と重複する可能性があります。このトピックでは、多重定義について説明し、競合を回避する方法を示します。
関数名の多重定義
関数は、その名前と、入力引数の数および引数のデータ型で構成される署名によって識別されます。同じスキーマ内に名前は同じで署名は異なる 2 つの関数が存在できます。つまり、関数名は多重定義が可能です。
クエリを実行するとき、クエリエンジンは、指定されている引数の数と引数のデータ型に基づいて、呼び出す関数を決定します。多重定義を使用すると、CREATE FUNCTION コマンドで許容される限界まで、可変の引数を持つ関数をシミュレートできます。
組み込み Amazon Redshift 関数との競合の回避
プレフィックス f_
を使用して、すべての UDF に名前を付けることをお勧めします。Amazon Redshift は、UDF 専用のプレフィックスとして f_
を予約しており、UDF 名にプレフィックスとして f_
を使用することで、UDF 名が現在使用されているか、使用される予定の Amazon Redshift 組み込み SQL 関数名と競合することを回避できます。例えば、新しい UDF に f_sum
という名前を付けることで、Amazon Redshift SUM 関数との競合を回避できます。同様に、新しい関数に f_fibonacci
という名前を付けると、将来の Amazon Redshift のリリースで FIBONACCI という名前の関数が追加された場合に競合を回避できます。
既存の Amazon Redshift 組み込み SQL 関数が異なるスキーマに存在する場合に限り、関数名の多重定義を発生させることなく、同じ名前および署名の UDF を作成できます。組み込み関数はシステムカタログスキーマである pg_catalog に存在するので、パブリックスキーマやユーザー定義のスキーマなどの別のスキーマに同じ名前の UDF を作成できます。場合によっては、スキーマ名で明示的に修飾されていない関数を呼び出すことがあります。この場合、Amazon Redshift はデフォルトで最初に pg_catalog スキーマを検索します。したがって、組み込み関数は、同じ名前の新しい UDF の前に実行されます。
この動作は、末尾に pg_catalog を配置するように検索パスを設定することによって変更できます。その場合、UDF は組み込み関数よりも優先されますが、この方法では予期しない結果が生じる可能性があります。予約されている f_
プレフィックスを使用するなど、名前の重複を回避する方法を採用したほうがより確実です。詳細については、「SET」と「search_path」を参照してください。