#author("2017-06-03T13:40:28+09:00","default:haikikyou","haikikyou")
#author("2017-06-03T22:58:56+09:00","default:haikikyou","haikikyou")
[[PostgreSQL/開発]]

&size(12){&color(white,red){ ただいま作成中・・・ };};

#contents

* 概要 [#t03f8105]

- 概要説明
- 関数マネージャと関数呼び出しインターフェースの定義ファイル

* 定義 [#m6ff2469]

** 変数,エイリアス [#r6993c38]

** マクロ [#n3bffc31]

** 列挙型 [#jc93a4e3]

** 構造体 [#e4aded44]
*** FmgrInfo [#dbdc9d3a]

*** Struct [#ce92b362]
|~番号|~データ型|~フィールド|~説明|h
|1|PGFunction|fn_addr|説明|
|2|Oid|fn_oid|説明|
|3|short|fn_nargs|説明|
|4|bool|fn_strict|説明|
|5|bool|fn_retset|説明|
|6|char|fn_stats|説明|
|7|void*|fn_extra|説明|
|8|MemoryContext|fn_mcxt|説明|
|9|fmNodePtr|fn_expr|説明|


*** FunctionCallInfoData [#vd0ca3c7]

|~番号|~データ型|~フィールド|~説明|h
|1|FmgrInfo*|flinfo|説明|
|2|fmNodePtr|context|説明|
|3|fmNodePtr|resultinfo|説明|
|4|Oid|fncollation|説明|
|5|bool|isnull|説明|
|6|short|nargs|説明|
|7|Datum|arg[FUNC_MAX_ARGS]|説明|
|8|bool|argnull[FUNC_MAX_ARGS]|説明|


** 関数 [#ydff81f8]

*** 関数名 [#r22bc55b]

#geshi(c){{
// 引数1:
}}

- 説明

* サンプルプログラム [#xcd4fcab]

#geshi(c){{
// 関数呼び出しのサンプル
void test_func_invoke()
{
    FmgrInfo *fmgr = palloc(sizeof(FmgrInfo));
    FunctionCallInfoData fcinfo;

    // ここでは,サンプルのため決め打ちで関数のOidを指定している
    fmgr_info((Oid)1396, fmgr); // abs(int64); 
    int64 arg0 = -100; // 引数

    FunctionCallInfoData fcinfo;
    InitFunctionCallInfoData(fcinfo, fmgr, 1, 0, NULL, NULL);
    fcinfo.isnull = false;     // 結果はnullでない
    fcinfo.argnull[0] = false; // 引数なnullでない
    fcinfo.arg[0] = Int64GetDatum(arg0); // 引数を設定

    // 関数の実行。fmgr_infoで実際に呼び出される関数ポインタがfcinfoにセットされている
    // 関数の実行 No.1) fmgr_infoで実際に呼び出される関数ポインタがfcinfoにセットされている
    Datum result = FunctionCallInvoke(&fcinfo);

    // 結果Datumから値を取り出す
    elog(INFO, "abs(-100) = %ld", DatumGetInt64(result));

    // 関数の実行 No.2) 上の手続きを簡略化してくれるもっと便利な関数を使って実行してみる
    FunctionCall1Coll(fmgr, 0, Int64GetDatum(arg0));
    result = FunctionCallInvoke(&fcinfo);
    elog(INFO, "abs(-100) = %ld", DatumGetInt64(result));

    // 関数の実行 No.3) 更に上の手続きをもっと簡略化してくれるもっと便利な関数を使って実行してみる
    result = OidFunctionCall1Coll(1396, 0, Int64GetDatum(arg0));
    elog(INFO, "abs(-100) = %ld", DatumGetInt64(result));
}

/* Output is the following:
------------------------------
INFO:  abs(-100) = 100
INFO:  abs(-100) = 100
INFO:  abs(-100) = 100
*/
}}
* 参考・関連 [#hbd36355]

- [[fmgr.h>https://doxygen.postgresql.org/fmgr_8h.html]] - on doxygen.postgresql.org
- [[fmgr.c>https://doxygen.postgresql.org/fmgr_8c.html]] - on doxygen.postgresql.org

&size(12){&color(white,orange){ 関連 };};

#related
* コメント [#cd6bf6cf]

#comment


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP