目的
制御スクラッチパッドを割り振って、テーブル関数の制御コピーから他のAMP vproc上で実行するすべてのコピーにデータを伝播します。
構文規則
void *
FNC_TblAllocCtrlCtx(int length)
- int length
- 制御スクラッチパッドに割り振るサイズ(バイト単位)。
戻り値
FNC_TblAllocCtrlCtxは、テーブル関数の制御コピーがデータをテーブル関数の他のすべてのコピーにデータを伝播するために使用できる制御スクラッチパッドのアドレスを戻します。
テーブル関数の制御コピーがすでに制御スクラッチパッドを割り振っているか、スクラッチパッドを割り振れなかった場合、戻り値はNULLポインタです。
有効な呼び出しモード
このライブラリ関数は、FNC_GetPhaseの戻り値がTBL_MODE_CONSTである場合に使用します。これはSELECT文が定数式入力引数のあるテーブル関数を呼び出したことを示します。例えば、次のようになります。
SELECT * FROM TABLE (table_function_1('STRING_CONSTANT')) AS table_1;
使用上の注意
制御スクラッチパッドを使用して、テーブル関数が実行しているはずの処理や、実行しないままにしている処理を追跡します。
- テーブル関数がFNC_GetPhaseを呼び出し、処理フェーズ用のTBL_PRE_INITの値を取得する場合
- テーブル関数のこのコピーがFNC_TblControlを呼び出してテーブル関数の制御コピーとして自身を設定する場合
スクラッチパッドには、スクラッチパッド内の他の構造体を参照するポインタは保管しないでください。戻されるスクラッチパッドのアドレスは、テーブル関数の後続の呼び出しのためのものと同じではないからです。代わりに、スクラッチパッドの現在のアドレスからのオフセットなどの相対アドレッシングを使用してください。
テーブル関数の制御コピーがTBL_PRE_INIT処理フェーズを完了した後に、テーブル関数のすべてのコピー(制御コピーを含む)は、テーブル関数の制御コピーがTBL_PRE_INITフェーズ以外のいずれかの処理フェーズでFNC_TblGetCtrlCtxを呼び出して制御スクラッチパッドに保管したデータにアクセスできます。制御スクラッチパッドに加えられる後続の変更はローカルなものと見なされ、ローカル テーブル関数コピーの次回の反復実行のためにスクラッチパッド内に保持されます。
制限
この関数は、テーブル関数内からのみ呼び出すことができます。この関数をスカラー関数、集約関数、UDM、または外部ストアド プロシージャから呼び出すと、トランザクションで例外が発生します。
- モードとしてTBL_MODE_CONST
- 処理フェーズとしてTBL_PRE_INIT
FNC_TblAllocCtrlCtxの使用例
typedef struct {
unsigned short cntrl_fnc_AMP
int qfd;
...
} ctrl_ctx;
ctrl_ctx *options;
AMP_Info_t *LocalConfig;
FNC_Phase Phase;
if (FNC_GetPhase(&Phase) == TBL_MODE_CONST)
{
switch(Phase)
{
case TBL_PRE_INIT:
{
LocalConfig = FNC_AMPInfo();
if ( FNC_TblControl() )
{
options = FNC_TblAllocCtrlCtx(sizeof(ctrl_ctx));
options->ctrl_fnc_AMP = LocalConfig->AMPId;
...
}
}
...
}
}
...