91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PostgreSQL中怎么載入外部C語言函數

發布時間:2021-06-21 15:39:05 來源:億速云 閱讀:285 作者:Leah 欄目:大數據

這期內容當中小編將會給大家帶來有關PostgreSQL中怎么載入外部C語言函數,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

quanzl-mac:postgresql.builtin_pool quanzl$ nm lib/plpgsql.so 
...
0000000000007e10 T _pg_finfo_plpgsql_call_handler
000000000001c888 s _pg_finfo_plpgsql_call_handler.my_finfo
...
0000000000007e20 T _plpgsql_call_handler
...

這是怎么來的?直接看函數定義(src/pl/plpgsql/src/pl_handler.c):

...
PG_FUNCTION_INFO_V1(plpgsql_call_handler);

Datum
plpgsql_call_handler(PG_FUNCTION_ARGS)
{
...

所有外掛模塊中的函數都是這種形式定義,返回值必須是Datum,參數必須使用預處理符 PG_FUNCTION_ARGS。plpgsql_call_handler是定義在pg_language中的存儲過程處理入口,調用方式與可以在SQL中使用的函數有所不同,所以它直接使用return方式返回值。而一般的SQL函數比如earthdistance模塊中的geo_distance

...
PG_FUNCTION_INFO_V1(geo_distance);

Datum
geo_distance(PG_FUNCTION_ARGS)
{
...
  PG_RETURN_FLOAT8(result);
}

SQL定義

CREATE FUNCTION geo_distance (point, point)
RETURNS float8
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE AS 'MODULE_PATHNAME';

它必須使用 PG_RETURN_xxx 系列預處理符來返回。

返回值的使用可以參考DirectFunctionCalln(n為數字,表是參數個數)定義去理解,有必要的話另文再寫,這里簡單一提,主要還是講預處理符PG_FUNCTION_INFO_V1,下邊是它的定義:

#define PG_FUNCTION_INFO_V1(funcname) \
extern Datum funcname(PG_FUNCTION_ARGS); \
extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \
const Pg_finfo_record * \
CppConcat(pg_finfo_,funcname) (void) \
{ \
	static const Pg_finfo_record my_finfo = { 1 }; \
	return &my_finfo; \
} \
extern int no_such_variable

再看earthdistance.so的symbol:

0000000000000de0 T _geo_distance
0000000000000dd0 T _pg_finfo_geo_distance
0000000000000fb0 s _pg_finfo_geo_distance.my_finfo

CppConcat(pg_finfo_,funcname)新定義一個前綴 pg_finfo_ 的函數,pg_finfo_geo_distance就是這么來的,它很簡單,返回結構體 Pg_finfo_record,其成員 api_version 為 1。

強大的PG已經為今后擴展做好準備。

函數加載部分(src/backend/utils/fmgr/fmgr.c)的檢查 fetch_finfo_record:

  const Pg_finfo_record *inforec;

  infofuncname = psprintf("pg_finfo_%s", funcname);

  /* Try to look up the info function */
  infofunc = (PGFInfoFunction) lookup_external_function(filehandle,
                              infofuncname);
...
  inforec = (*infofunc) ();
...

上述就是小編為大家分享的PostgreSQL中怎么載入外部C語言函數了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沾化县| 蒙城县| 惠安县| 中山市| 库尔勒市| 河曲县| 汉源县| 弥渡县| 苗栗县| 库车县| 铜川市| 平泉县| 思茅市| 怀集县| 荣成市| 神农架林区| 钟山县| 临湘市| 准格尔旗| 石柱| 高邮市| 花莲市| 沭阳县| 乡城县| 吴堡县| 鄂伦春自治旗| 云浮市| 弥勒县| 台东市| 建昌县| 龙胜| 通渭县| 堆龙德庆县| 尚义县| 佛学| 金平| 咸丰县| 宜春市| 松原市| 正宁县| 沾益县|