最適の判別
実行の候補となるような同じ名前の関数が、複数存在する場合があります。その場合、候補関数のセットに含まれる各関数のパラメーターのデータ・タイプ、SQL パスでのスキーマの位置、パラメーターの総数を使用して、関数が最適要件を満たすかどうかが判別されます。 関数の結果のデータ・タイプ、 または現在考慮中の関数のタイプ (集約、スカラー、または表) もこの決定では考慮されないことに注意してください。
候補関数のセットに複数の関数が含まれており、関数呼び出しで名前付き引数が使用されている場合、名前付き引数に対応するパラメーターの順序位置は、すべての候補関数で同じでなければなりません。
パラメーター・セット という用語は、候補関数のセットの (上記のようなパラメーターが存在する) パラメーター・リストで同じ位置にあるすべてのパラメーターを表します。 パラメーターの対応引数は、関数呼び出しで引数がどのように指定されているかに基づいて判別されます。 定位置引数の場合、パラメーターの対応引数は、関数呼び出しにおいて候補関数のパラメーター・リストでのパラメーターと同じ位置にある引数です。 名前付き引数の場合、パラメーターの対応引数は、パラメーターと同じ名前の引数です。 この場合、関数呼び出しにおける引数の順序は、最適を判別する際に考慮されません。 候補関数のパラメーター数が関数呼び出しでの引数の数よりも多い場合、対応引数のない各パラメーターは、あたかも DEFAULT キーワードを値として持つ対応引数があるかのように処理されます。
最適である関数を判別するために、以下のステップが使用されます。
- ステップ 1: 型付き式である引数の考慮
データベース・マネージャーは、各パラメーターのデータ・タイプと対応引数のデータ・タイプを比較することによって、呼び出しの最適要件を満たす関数、また関数のセットを判別します。
パラメーターのデータ・タイプがその対応引数のデータ・タイプと同じかどうかは、以下のように判別されます。- データ・タイプのシノニムが一致する場合は、同じであると見なされます。例えば、DOUBLE と FLOAT は同じであると見なされます。
- データ・タイプの属性 (長さ、精度、位取り、CCSID など) は無視されます。したがって、CHAR(8) と CHAR(35) は同じであると見なされ、同様に、 DECIMAL(11,2) と DECIMAL(4,3) は同じであると見なされます。
- 文字タイプとグラフィック・タイプは同じであると見なされます。例えば、以下は同じタイプであると見なされます。 CHAR と GRAPHIC、VARCHAR と VARGRAPHIC、および CLOB と DBCLOB。 CHAR(13) と GRAPHIC(8) は同じタイプであると見なされます。
関数呼び出しにおける型なし式でない各引数のデータ・タイプが、関数インスタンスの対応パラメーターのデータ・タイプと一致する関数か、またはそのデータ・タイプにプロモート可能である関数のみを考慮することにより、候補関数のサブセットが取得されます。関数呼び出しの引数が型なし式である場合、対応パラメーターのデータ・タイプは、どのデータ・タイプでも構いません。 データ・タイプのプロモーション にあるデータ・タイプのプロモーションの優先順位リストは、各データ・タイプに適合する (プロモーションを考慮) データ・タイプを、適合度が最高から最低の順にリストしています。このサブセットが空でない場合、この候補関数のサブセットについてプロモート可能なプロセスを使用して最適が決定されます。 このサブセットが空である場合、候補関数のオリジナルのセットについてキャスト可能なプロセスを使用して最適が決定されます。
- プロモート可能プロセス
- このプロセスは、関数呼び出しの引数が、関数定義の対応するパラメーターのデータ・タイプと一致するか、またはそのデータ・タイプにプロモートできるかどうかを考慮した場合にのみ、最適を決定します。候補関数のサブセットの場合、パラメーター・リストが左から右へと処理されていきます。つまり、候補関数のサブセットの最初の位置のパラメーター・セットをまず処理してから、2 番目の位置のパラメーター・セットに進むというように処理されます。
候補関数のサブセットから候補関数を除去するために、以下のステップが使用されます (プロモーションのみを考慮)。
- ある候補関数のパラメーターの対応引数のデータ・タイプが、(プロモーションのみを考慮した場合に) 他の候補関数よりもパラメーターのデータ・タイプに適合する場合、関数呼び出しに対する適合度が同等でない候補関数は除去されます。 データ・タイプのプロモーション にあるデータ・タイプのプロモーションの優先順位リストは、各データ・タイプに適合する (プロモーションを考慮) データ・タイプを、適合度が最高から最低の順にリストしています。
- 対応引数のデータ・タイプが型なし式である場合、候補関数は除去されません。
- これらのステップは、残りの候補関数の次のパラメーター・セットに対しても行われ、パラメーター・セットがそれ以上なくなるまで繰り返されます。
- キャスト可能なプロセス
- このプロセスではまず、関数呼び出しにおける対応引数のデータ・タイプが、関数定義のパラメーターのデータ・タイプに一致するかどうか、またはそのデータ・タイプにプロモートできるかどうかをパラメーターごとに調べて、最適が判別されます。
次にデータベース・マネージャーは、プロモート可能だったデータ・タイプを持つ対応引数がない各パラメーター・セットについて、関数解決のために対応引数のデータ・タイプをパラメーターのデータ・タイプに暗黙的にキャストできるかどうかを、パラメーターごとに調べます。
候補関数のセットの場合、パラメーター・リストに含まれるパラメーターが左から右へと処理されていきます。つまり、すべての候補関数の最初の位置のパラメーター・セットをまず処理してから、2 番目の位置のパラメーター・セットに進むというように処理されます。 候補関数のセットから候補関数を除去するために、以下のステップが使用されます (プロモーションのみを考慮)。
- ある候補関数のパラメーターの対応引数のデータ・タイプが、(プロモーションのみを考慮した場合に) 他の候補関数よりもパラメーターのデータ・タイプに適合する場合、関数呼び出しに対する適合度が同等でない候補関数は除去されます。 データ・タイプのプロモーション にあるデータ・タイプのプロモーションの優先順位リストは、各データ・タイプに適合する (プロモーションを考慮) データ・タイプを、適合度が最高から最低の順にリストしています。
- 対応引数のデータ・タイプをいずれの候補関数のパラメーターのデータ・タイプにもプロモートできない場合 (対応引数が型なし式である場合を含む)、候補関数は除去されません。
- これらのステップは、残りの候補関数の次のパラメーター・セットに対しても行われ、パラメーター・セットがそれ以上なくなるまで繰り返されます。
- 残りのすべての候補関数のパラメーター・セットのすべてのデータ・タイプ が、データ・タイプのプロモーションに指定されているように同じデータ・タイプ優先順位リストに属していない場合、 エラーが戻されます。
- 対応する引数のデータ・タイプを、関数解決のための暗黙的キャスト に指定されているようにパラメーターのデータ・タイプに暗黙的にキャストできない場合、エラーが戻されます。
- ある候補関数のパラメーターの対応引数のデータ・タイプが、(暗黙的キャストを考慮した場合に) 他の候補関数よりもパラメーターのデータ・タイプに適合する場合、関数呼び出しに対する適合度が同等でない候補関数は除去されます。 関数解決のための暗黙的キャストにあるデータ・タイプ・リストは、(暗黙的キャストを考慮した場合に) より適合するデータ・タイプを示しています。
- これらのステップは、(プロモーションのみを考慮した場合に) 適合する対応引数がなく、対応引数がデータ・タイプを持つ次のパラメーター・セットに対しても行われ、こうしたパラメーター・セットがなくなるかエラーが発生するまで繰り返されます。
- ステップ 2: SQL パスの考慮
複数の候補関数が残っている 場合、データベース・マネージャーは、SQL パスの最初にスキーマがある候補関数を 選択します。
- ステップ 3: 関数呼び出しにおける引数の数の考慮
複数の候補関数が残っており、ある候補関数のパラメーター数が他の候補関数のパラメーター数以下である場合、パラメーター数の多い候補関数は除去されます。
- ステップ 4: 型なし式である引数の考慮複数の候補関数が残っており、少なくとも 1 つのパラメーター・セットの対応引数が型なし式である場合、データベース・マネージャーは、こうしたパラメーター・セットを左から右へと比較していきます。 候補関数のセットから候補関数を除去するために、以下のステップが使用されます。
- 残りのすべての候補関数のパラメーター・セットのすべてのデータ・タイプ が、データ・タイプのプロモーションに指定されているように同じデータ・タイプ優先順位リストに属していない場合、 エラーが戻されます。
- ある候補関数のパラメーターのデータ・タイプが、暗黙的キャストのデータ・タイプ順序付けで他の候補関数よりも左にある場合、パラメーターのデータ・タイプがデータ・タイプ順序付けで右にある候補関数は除去されます。 関数解決のための暗黙的キャストにあるデータ・タイプ・リスト に、暗黙的キャストのデータ・タイプの順序付けが示されています。
関数解決のための暗黙的キャスト
- DATE、TIME、および TIMESTAMP 以外の組み込みタイプから数値データ・タイプへのサポートされる任意のキャスト。表 2を参照してください。
- 型なし引数をどのデータ・タイプにもキャストできる。
データ・タイプ・グループ | 関数解決のための暗黙的キャストに使用するデータ・タイプ・リスト (優先順位の高いものから順に) |
---|---|
数値データ・タイプ | DECFLOAT、 double、 real、 decimal、 BIGINT、 INTEGER、 SMALLINT |
文字データ・タイプおよび GRAPHIC ストリング・データ・タイプ | VARCHAR または VARGRAPHIC、CHAR または GRAPHIC、CLOB または DBCLOB |
バイナリー・データ・タイプ | VARBINARY、BINARY、BLOB、 VARCHAR FOR BIT DATA、 CHAR FOR BIT DATA |
日時データ・タイプ | TIMESTAMP、DATE、TIME |
- 10 進数
- = DECIMAL(p,s) または NUMERIC(p,s)
- real
- = REAL または FLOAT(n)。この場合の n は短精度浮動小数点数の指定
- double
- = DOUBLE、DOUBLE PRECISION、FLOAT または FLOAT(n)。 この場合の n は倍精度浮動小数点数の指定
例
以下に、関数解決の例を示します。 (必要なキーワードがすべて示されているわけではないことに注意してください。)
例 1: 以下に、関数解決での SQL パスの考慮事項を示す例があります。 この例では、3 つの異なるスキーマに 8 つの ACT 関数があり、以下のように登録されています。
CREATE FUNCTION AUGUSTUS.ACT (CHAR(5), INT, DOUBLE) SPECIFIC ACT_1 ...
CREATE FUNCTION AUGUSTUS.ACT (INT, INT, DOUBLE) SPECIFIC ACT_2 ...
CREATE FUNCTION AUGUSTUS.ACT (INT, INT, DOUBLE, INT) SPECIFIC ACT_3 ...
CREATE FUNCTION JULIUS.ACT (INT, DOUBLE, DOUBLE) SPECIFIC ACT_4 ...
CREATE FUNCTION JULIUS.ACT (INT, INT, DOUBLE) SPECIFIC ACT_5 ...
CREATE FUNCTION JULIUS.ACT (SMALLINT, INT, DOUBLE) SPECIFIC ACT_6 ...
CREATE FUNCTION JULIUS.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_7 ...
CREATE FUNCTION NERO.ACT (INT, INT, DEC(7,2)) SPECIFIC ACT_8 ...
以下のように関数が参照されるとします (I1 および I2 は INTEGER 列、 D は DECIMAL 列です)。
SELECT ... ACT(I1, I2, D) ...
この参照を行うアプリケーションの SQL パスが次のようになっているとします。
"JULIUS","AUGUSTUS","CAESAR"
- スキーマ NERO が SQL パスに組み込まれていないため、特定の名前 ACT_8 の付いた関数は候補から除かれます。
- パラメーターの数が違っているため、ACT_3 は候補から除かれます。 第 1 引数が第 1 パラメーターのデータ・タイプにプロモートできないため、 ACT_1 と ACT_6 はどちらも候補から除かれます。
- この時点で複数の候補が残っているため、次に引数が順に検討されます。
- 最初の引数については、残りのすべての関数 ACT_2、ACT_4、ACT_5、および ACT_7 がその引数タイプと完全に一致します。 この検討ではどの関数も検討の対象から除かれないため、 次の引数を検討する必要があります。
- 2 番目の引数では、ACT_2、ACT_5、および ACT_7 が完全に一致していますが、 ACT_4 は一致していないため、ACT_4 が検討の対象から除かれます。 ACT_2、ACT_5、および ACT_7 の間の何らかの差異を判別するために、さらに次の引数が検討されます。
- 第 3 の最後の引数では、ACT_2、ACT_5、ACT_7 のいずれも、引数のタイプと完全には一致していません。 ACT_2 と ACT_5 の適合度は同程度ですが、ACT_7 は他の 2 つよりも適合度が劣ります。タイプ DOUBLE は DECFLOAT よりも、DECIMAL に近いからです。 ACT_7 は除去されます。
- この時点で、 パラメーター・シグニチャーが同じである関数として ACT_2 と ACT_5 の 2 つが残っています。 最終的な決定要因は、どちらの関数のスキーマが SQL パスで先に出現するかであり、 この基準によって ACT_5 が最終的に選択されます。
例 2: これは、関数解決がエラーになるというシチュエーションの例です。 エラーになる原因は、同程度に呼び出しに適合する候補関数が複数あるが、 引数の 1 つの対応パラメーターが同じタイプ優先順位リストに属していない ことです。
この例では、以下のように定義された単一のスキーマに 3 つの関数のみ含まれています。
CREATE FUNCTION CAESAR.ACT (INT, VARCHAR(5), VARCHAR(5)) SPECIFIC ACT_1 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DATE) SPECIFIC ACT_2 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...
以下のように関数が参照されるとします (I1 および I2 は INTEGER 列、VC は VARCHAR 列です)。
SELECT ... ACT(I1, I2, VC) ...
この参照を行うアプリケーションの SQL パスが次のようになっているとします。
"CAESAR"
- 関数呼び出しの各入力引数のデータ・タイプが、関数インスタンスの対応するパラメーターのデータ・タイプと一致するか、またはそのデータ・タイプにプロモート可能かどうかを判別するために、それぞれの候補関数が評価されます。
- 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
- 2 番目の引数については、INTEGER を VARCHAR にプロモートできないため、ACT_1 は除去されます。
- 3 番目の引数については、VARCHAR を DATE または DOUBLE にプロモートできないため、候補関数が残らないように、ACT_2 と ACT_3 の両方が除去されます。
- 上からの候補関数のサブセットが空のため、候補関数はキャスト可能なプロセスを使用して考慮されます。
- 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
- 2 番目の引数については、INTEGER を VARCHAR にプロモートできないため、ACT_1 は除去されます。 ACT_2 と ACT_3 が候補として適しています。
- 3 番目の引数については、ACT_2 および ACT_3 の対応するパラメーターのデータ・タイプが同じデータ・タイプの優先順位リストに属していないため、エラーが戻されます。
例 3: この例では、キャスト可能なプロセスを使用して関数解決が成功する状況を示しています。
この例では、以下のように定義された単一のスキーマに 3 つの関数のみ含まれています。
CREATE FUNCTION CAESAR.ACT (INT, VARCHAR(5), VARCHAR(5)) SPECIFIC ACT_1 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_2 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...
以下のように関数が参照されるとします (I1 および I2 は INTEGER 列、VC は VARCHAR 列です)。
SELECT ... ACT(I1, I2, VC) ...
この参照を行うアプリケーションの SQL パスが次のようになっているとします。
"CAESAR"
- 関数呼び出しの各入力引数のデータ・タイプが、関数インスタンスの対応するパラメーターのデータ・タイプと一致するか、またはそのデータ・タイプにプロモート可能かどうかを判別するために、それぞれの候補関数が評価されます。
- 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
- 2 番目の引数については、INTEGER を VARCHAR にプロモートできないため、ACT_1 は除去されます。
- 3 番目の引数については、VARCHAR を DECFLOAT または DOUBLE にプロモートできないため、候補関数が残らないように、ACT_2 と ACT_3 の両方が除去されます。
- 上からの候補関数のサブセットが空のため、候補関数はキャスト可能なプロセスを使用して考慮されます。
- 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
- 2 番目の引数については、INTEGER を VARCHAR にプロモートできないため、ACT_1 は除去されます。 ACT_2 と ACT_3 が候補として適しています。
- 3 番目の引数については、DECFLOAT と DOUBLE の両方が同じデータ・タイプの優先順位リストにあり、VARCHAR は DECFLOAT と DOUBLE の両方を暗黙のうちにキャストできます。DECFLOAT は暗黙的キャストに適しているため、 ACT_2 が最適です。
例 4: この例では、キャスト可能なプロセスを使用した関数解決時に、後の引数のプロモーションが暗黙的キャストより優先することを示しています。
この例では、以下のように定義された単一のスキーマに 3 つの関数のみ含まれています。
CREATE FUNCTION CAESAR.ACT (INT, INT, VARCHAR(5)) SPECIFIC ACT_1 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_2 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...
以下のように関数が参照されるとします (I1 は INTEGER 列、VC1 は VARCHAR 列、および C1 は CHAR 列です)。
SELECT ... ACT(I1, VC1, C1) ...
この参照を行うアプリケーションの SQL パスが次のようになっているとします。
"CAESAR"
- 関数呼び出しの各入力引数のデータ・タイプが、関数インスタンスの対応するパラメーターのデータ・タイプと一致するか、またはそのデータ・タイプにプロモート可能かどうかを判別するために、それぞれの候補関数が評価されます。
- 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
- 2 番目の引数については、VARCHAR を INTEGER にプロモートできないため、候補関数が残らないように、すべての候補関数が除去されます。
- 上からの候補関数のサブセットが空のため、候補関数はキャスト可能なプロセスを使用して考慮されます。
- 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
- 2 番目の引数については、候補関数のどれにも対応する引数をプロモートできるパラメーターがないため、候補関数は除去されません。
- 3 番目の引数は ACT_1 のパラメーターにプロモートできますが、ACT_2 または ACT_3 のパラメーターにはプロモートできないため、ACT_1 が最適です。