33.8. 関数のオーバーロード

使用する引数が異なるのであれば、同じSQL名の関数を1つ以上定義することができます。 つまり、関数名はオーバーロードが可能です。 問い合わせが実行された時、サーバはデータ型と与えられた引数の数によって呼び出すべき関数を決定します。 引数の数が可変で、最大が有限である、擬態関数をオーバーロードすることもできます。

関数は属性と同じ名前を持つこともできます。 (attribute(table)table.attributeと等価であることを思い出してください。) 複雑な型の関数と複雑な型の属性とであいまいさが存在する場合は、必ず属性が使用されます。

オーバーロード関数を作成する時、曖昧さが発生しないように注意しなければなりません。 例えば、以下のような関数を考えてみます。

CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...

test(1, 1.5)のような平凡な入力ではどちらの関数を呼び出すのかはすぐには明確ではありません。 現在実装されている解決規則は第10章にて説明していますが、この動作に巧妙に依存するようにシステムを設計することは推奨しません。

C言語関数をオーバロードする場合、更に制限があります。 オーバロードされた関数群内の各関数のCの名前は、内部か動的ロード可能かに関係なく他の全ての関数のCの名前と異なる必要があります。 この規則に反した場合は、この動作は移植性がありません。 実行時リンカエラーになるかもしれませんし、関数群のどれか(大抵は内部関数)が呼び出されるかもしれません。 CREATE FUNCTION SQLコマンドの別形式のAS句は、SQL関数名とCソースコード内の関数名とを分離します。 以下に例を示します。

CREATE FUNCTION test(int) RETURNS int
    AS 'filename', 'test_1arg'
    LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
    AS 'filename', 'test_2arg'
    LANGUAGE C;

ここでの C関数の名前は多くの取り得る規約の1つを反映しています。