對於PostgreSQL中Datum的解釋 原

Datum類型是PG系統函數大量引用的類型,其定義爲:

typedef uintptr_t Datum;
typedef unsigned long long uintptr;

這裏舉一個比較簡單的例子進行解釋:

Datum
cstring_in(PG_FUNCTION_ARGS)
{
 char	   *str = PG_GETARG_CSTRING(0);

 PG_RETURN_CSTRING(pstrdup(str));
}

/*
 * cstring_out		- output routine for pseudo-type CSTRING.
 *
 * We allow this mainly so that "SELECT some_output_function(...)" does
 * what the user will expect.
 */
Datum
cstring_out(PG_FUNCTION_ARGS)
{
 char	   *str = PG_GETARG_CSTRING(0);

 PG_RETURN_CSTRING(pstrdup(str));
}

這裏主要說明的是PG_GETARG_***和PG_RETURN_***。

這些函數的定義可以在fmgr.h中看到,時間類型的需要在其頭文件看到。

PG_GETARG_CSTRING來說明一下,其定義爲:

#define PG_GETARG_CSTRING(n) DatumGetCString(PG_GETARG_DATUM(n))

#define PG_GETARG_DATUM(n)	 (fcinfo->arg[n])

#define DatumGetCString(X) ((char *) DatumGetPointer(X)) #define DatumGetPointer(X) ((Pointer) (X))


  
  
typedef char *Pointer;
PG_GETARG_DATUM是獲取參數中第一個Datum類型的值。

PG_GETARG_CSTRING是將Datum這種類型轉換爲字符指針類型,基本都是用char *來轉化

下面看一下:

#define PG_RETURN_CSTRING(x) return CStringGetDatum(x)

#define CStringGetDatum(X) PointerGetDatum(X)

#define PointerGetDatum(X) ((Datum) (X))
和上面的類似也是對類型的轉換,這裏是將字符指針類型轉換爲無符號長整形。

所以PG內部進行傳參實際上並沒有對指針進行傳遞,而是將指針轉化爲整形,然後進行傳遞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章