fmgr

・fmgr.c: fmgr_info_cxt()
関数のOidから,関数の情報(FmgrInfo構造体)を取得する。
fmgr_info_cxt_security()を実行している。

・fmgr.c: fmgr_info_cxt_security()
最初にfinfoをinvalidデータで初期化する。

fmgr_isbuiltin()でbuiltin functionかチェックする。
builtin functionだった場合,finfoを設定して終わり。

builtin functionじゃない場合,SearchSysCache()で,PROCOIDを探す。

procedureStructのprosecdefが設定してあり,ignore_securityがfalseのとき,fn_addrにfmgr_security_definerをセットする。その後,fn_oidを設定して,ReleaseSysCache()して終わり。

switch (procedureStruct->prolang)
case INTERNALlanguageId
create functionで作成したbuiltin functionのaliasのOidのとき,このcaseになる。
fmgr_lookupByName()でbuiltin functionを探す。見つからないときはエラー。
case ClanguageId
C言語の関数のとき,fmgr_info_C_lang()で探す。
case SQLlanguageId
fn_addrに,fmgr_sqlを指定する。
default
fmgr_info_other_lang()で探す。

関数の最後で,fn_oidをセットし,ReleaseSysCache()する。

・fmgr.c: fmgr_isbuiltin()
指定したOidの関すが,builtin-function tableに存在するか調べる。
fmgr_builtins配列を,バイナリサーチで検索している。
存在する場合は,FmgrBuitin構造体のポインタを返す。

・fmgr.c: fmgr_security_definer()
引数のPG_FUNCTION_ARGSは,fmgr.hで以下のように定義されている。
#define PG_FUNCTION_ARGS FunctionCallInfo fcinfo

・functionの実行権限チェック
functionを実行するとき,ExecEvalFunc() -> init_fcache() -> pg_proc_aclcheck()でpg_procテーブルのproaclに定義されているルールをチェックする。