Postgresql

PG_FUNCTION_ARGS(使用 V1 約定)傳遞了哪些參數?

  • November 3, 2021

PostgreSQL 用“V1”介面記錄他們所有的 C 函式,但他們實際上並沒有顯示他們得到了什麼,

PG_FUNCTION_INFO_V1(add_one);

Datum
add_one(PG_FUNCTION_ARGS)
{
   int32   arg = PG_GETARG_INT32(0);

   PG_RETURN_INT32(arg + 1);
}

在上面PG_FUNCTION_ARGS聲明要接受的函式是什麼?許多 V1 函式似乎fcinfo神奇地出現在定義中,我猜它是在這裡引入的,但它是什麼,這個宏還有什麼其他的引入嗎?

fmgr.h對此的實際定義是

#define PG_FUNCTION_ARGS    FunctionCallInfo fcinfo

是一個指向FunctionCallInfoBaseData

typedef struct FunctionCallInfoBaseData *FunctionCallInfo;

可以在同一個文件中看到它的定義

typedef struct FunctionCallInfoBaseData
{
   FmgrInfo   *flinfo;         /* ptr to lookup info used for this call */
   fmNodePtr   context;        /* pass info about context of call */
   fmNodePtr   resultinfo;     /* pass or return extra info about result */
   Oid         fncollation;    /* collation for function to use */
#define FIELDNO_FUNCTIONCALLINFODATA_ISNULL 4
   bool        isnull;         /* function must set true if result is NULL */
   short       nargs;          /* # arguments actually passed */
#define FIELDNO_FUNCTIONCALLINFODATA_ARGS 6
   NullableDatum args[FLEXIBLE_ARRAY_MEMBER];
} FunctionCallInfoBaseData;

引用自:https://dba.stackexchange.com/questions/302049