如何为PostgreSQL创建自定义内建函数
-
函数 version(),没有参数,作为例子简洁明了。如果需要参数,可以查阅 adt 下其他函数定义,也是非常简单的事情,这就是开源给我们带来的知识宝库;
-
postgres=
-
version
-
-----------------------------------------------------------------------------------------------------------------
-
PostgreSQL 9.5devel on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6), 64-bit
-
(1 row)
-
-
postgres=
-
-
定义在 src/backend/utils/adt/version.c 里边:
-
Datum
-
pgsql_version(PG_FUNCTION_ARGS)
-
{
-
PG_RETURN_TEXT_P(cstring_to_text(PG_VERSION_STR));
-
}
-
-
其他文件内的定义,/src/include/utils/builtins:
-
/* version.c */
-
extern Datum pgsql_version(PG_FUNCTION_ARGS);
-
-
最关键的定义,让用户可以看到,/src/include/catalog/proc.h,这个文件编译前会被脚本处理生成 BKI(自行查阅文档)脚本,初始化数据库时在 pg_proc 里边定义函数,类型为internal,这个类型是有别于其他类型的(比如C,定义在外部库中),关于这些定义的含义,篇幅有限请自行学习吧:
-
DATA(insert OID = 89 ( version PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 25 "" _null_ _null_ _null_ _null_ pgsql_version _null_ _null_ _null_ ));
-
-
定义我们自己的函数:
-
Datum
-
quanzl_version(PG_FUNCTION_ARGS)
-
{
-
PG_RETURN_TEXT_P(cstring_to_text(“Quan's Database”));
-
}
-
-
builtins.h 在 pgsql_version下添加定义:
-
extern Datum quanzl_version(PG_FUNCTION_ARGS);
-
-
proc.h:
-
DATA(insert OID = 90 ( quan_version PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 25 "" _null_ _null_ _null_ _null_ quanzl_version _null_ _null_ _null_ ));
-
这里的 OID = 90 至关重要,并不是随意选取,必须是未使用的,怎么找呢,PG为我们提供了脚本,在 src/include/catalog/下的 unused_oids,轻松知道哪个可用。(还有一个duplicate_oids用于排错)
-
-
编译、运行,就这么简单
-
时间关系,上述过程未经验证,可能有错误,但大致步骤如此。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~