関数

関数の評価

  1. pg_proc システムカタログ内で一致するかどうかを点検します。

  2. 最も良く合うものを検索します。

    1. 同じ名前かつ引数の数が同じ関数の全ての一覧を作成します。

    2. 一覧に関数が 1 つだけ存在する場合、入力の型を強制できるのであれば その関数を使用し、できなければエラーを発生します。

    3. 型が最も明確に合う関数を全て保持します。明確に合うものがなければ、 全てを保持して次の段階に進みます。候補が 1 つだけ残った場合は、型 を強制できるのであればその関数を使用します。

    4. 入力引数全てが "unknown" であった場合、入力候補の引数をブール値、数 値、文字列、地理的情報、ユーザ定義というカテゴリに分類します。カテゴ リが混在する、または、1 つ以上ユーザ定義型が存在する場合、正しい選択 を推論するための手がかりがもうありませんので、エラーを発生します。カ テゴリが 1 つだけ存在する場合、"好ましい型" を以前 "unknown" であった 入力カラムに代入します。

    5. 最も正しく型に合う候補で、前の段階の各カラムカテゴリの "好ましい型" に合うものを選択します。複数の候補が存在する場合や候補が無くなった 場合は、エラーを発生します。

階乗関数

pg_proc カタログには、階乗関数が 1 つのみ定義されています。ですから 次の問い合わせは自動的に int2 引数を int4 に変換します。

tgl=> select int4fac(int2 '4');
int4fac
-------
     24
(1 row)
そして、実際にはパーサによって次のように変換されます。
tgl=> select int4fac(int4(int2 '4'));
int4fac
-------
     24
(1 row)

Substring 関数

pg_proc には2つの substr 関数が宣言されています。 しかし、text 型と int4 型という 2 つの型を 持つものは 1 つしかありません。

型指定の無い文字列定数を与えて呼び出した場合、その型は、1 つの候補関 数の型に直ちに合わされます。

tgl=> select substr('1234', 3);
substr
------
    34
(1 row)

あるテーブルから文字列を得るといった場合にあり得るものとして、文字 列が varchar 型として宣言されていたとすると、パーサは 文字列を text 型に強制しようとします。

tgl=> select substr(varchar '1234', 3);
substr
------
    34
(1 row)
は、パーサによって次のように変換されます。
tgl=> select substr(text(varchar '1234'), 3);
substr
------
    34
(1 row)

Note: charvarchartext 型の間の関 係を最適化するために、パーサ内部には特別に用意されたものがあります。こ の場合、substr は、明示的な変換呼び出しを挿入する のでは無く、直接 varrchar 文字列を使って呼び出されます。

int4 型を使って呼び出された場合、パーサは text に変換しようとします。

tgl=> select substr(1234, 3);
substr
------
    34
(1 row)
は、実際には次のように実行します。
tgl=> select substr(text(1234), 3);
substr
------
    34
(1 row)