千家信息网

PostgreSQL中怎么载入外部模块

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章为大家展示了PostgreSQL中怎么载入外部模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。PostgreSQL如何加载extension,例如
千家信息网最后更新 2026年11月01日PostgreSQL中怎么载入外部模块

本篇文章为大家展示了PostgreSQL中怎么载入外部模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

PostgreSQL如何加载extension,例如 PL/pgSQL、postgres_fdw,查看它们的symbol:

quanzl-mac:postgresql.builtin_pool quanzl$ nm lib/plpgsql.so                  U _AllocSetContextCreateExtended                 U _BeginInternalSubTransaction                 U _BlessTupleDesc...0000000000007a50 T _Pg_magic_func000000000001c86c s _Pg_magic_func.Pg_magic_data...0000000000007e10 T _pg_finfo_plpgsql_call_handler000000000001c888 s _pg_finfo_plpgsql_call_handler.my_finfo...0000000000007e20 T _plpgsql_call_handler...

T 表示 The symbol is in the text (code) section.
s 表示 The symbol is in an uninitialized data section for small objects.

本文关注模块加载时的动作,涉及上边的两个对象:_Pg_magic_func 和 _Pg_magic_func.Pg_magic_data

来看一个PG模块的代码(节选自 src/pl/plpgsql/src/pl_handler.c):

...static void plpgsql_extra_errors_assign_hook(const char *newvalue, void *extra);PG_MODULE_MAGIC;/* Custom GUC variable */static const struct config_enum_entry variable_conflict_options[] = {        {"error", PLPGSQL_RESOLVE_ERROR, false},        {"use_variable", PLPGSQL_RESOLVE_VARIABLE, false},        {"use_column", PLPGSQL_RESOLVE_COLUMN, false},        {NULL, 0, false}};...

这里注意 PG_MODULE_MAGIC,它的定义(src/include/fmgr.h):

.../* The actual data block contents */#define PG_MODULE_MAGIC_DATA \{ \        sizeof(Pg_magic_struct), \        PG_VERSION_NUM / 100, \        FUNC_MAX_ARGS, \        INDEX_MAX_KEYS, \        NAMEDATALEN, \        FLOAT4PASSBYVAL, \        FLOAT8PASSBYVAL \}...#define PG_MAGIC_FUNCTION_NAME Pg_magic_func#define PG_MAGIC_FUNCTION_NAME_STRING "Pg_magic_func"#define PG_MODULE_MAGIC \extern PGDLLEXPORT const Pg_magic_struct *PG_MAGIC_FUNCTION_NAME(void); \const Pg_magic_struct * \PG_MAGIC_FUNCTION_NAME(void) \{ \        static const Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA; \        return &Pg_magic_data; \} \extern int no_such_variable

可以看出,这里就是 Pg_magic_func 这个函数定义(symbol为什么多一个下划线请自行查资料),还有它的静态变量 Pg_magic_data。

Pg_magic_struct 这个结构体作用是在加载时检查模块是否与当前数据库内核匹配,防止不同版本或者不是PG模块的库的加载。

动态库的加载函数 internal_load_library 代码节选(src/backend/utils/fmgr/dfmgr.c):

    magic_func = (PGModuleMagicFunction)      pg_dlsym(file_scanner->handle, PG_MAGIC_FUNCTION_NAME_STRING);    if (magic_func)    {      const Pg_magic_struct *magic_data_ptr = (*magic_func) ();...

如果找不到 Pg_magic_func,或者是它的返回值与当前数据库服务器不一致,拒绝加载。

用于结构体初始化的 PG_MODULE_MAGIC_DATA,包含

1、结构体尺寸
2、版本号
3、函数最大参数个数
4、索引最大列数
5、单精度浮点传值
6、双精度浮点传值

上述内容就是PostgreSQL中怎么载入外部模块,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

模块 函数 结构 最大 代码 内容 就是 技能 数据 数据库 浮点 版本 知识 不同 简明 一致 简明扼要 上边 下划线 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技行业发展 关于新基建和互联网科技 广州互联网科技公司 紫鲸互联网科技 互联网金融科技委员会 互联网科技公司做什么 天扬科技互联网广告 隆华科技工业互联网 团飞科技与伯堂互联网服务平台 常德市电业局互联网科技部 互联网科技革命什么开始 广州新华互联网科技学校电竞方面 四川慕妮娅互联网科技有限公司 富国互联网科技002692 35岁以上互联网科技行业 张家口科技产业互联网平台 美国五大互联网科技公司市值多少 互联网的科技体现在哪里 河南商务圈互联网科技有限公司 承德科技产业互联网平台 广州淘业互联网络科技 西安纸贵互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网科技公司的优势 喔噻互联网科技 奇酷互联网络科技公司 北京禾田雨橡互联网科技 成都铂石互联网科技做什么的 苏州五指互联网络科技有限 中国科技和美国互联网
0