前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GreenPlum7/PG12中如何添加一个自定义内置函数

GreenPlum7/PG12中如何添加一个自定义内置函数

作者头像
yzsDBA
发布2022-03-29 11:35:26
7590
发布2022-03-29 11:35:26
举报
文章被收录于专栏:PostgreSQL研究与原理解析

首先看下GP7内置函数处理机制:GP7的内置函数机制和GP6稍有不同。其中内置函数元数据信息来自pg_proc.dat。pg_proc.dat中是什么东西呢?

...

...

例如加法的函数int4_sum。这里解释下几个重要成员:oid为函数的OID,descr为函数的描述,proname为函数名,proretype为函数返回值类型,proargtypes为函数所有入参类型,prosrc为函数。这些内容构成了所有内置函数的元数据信息。(如果需要新添加用户自定义函数,可以在这里添加元数据信息)。

GP7通过gen_fmgrtab.pl的perl脚本利用pg_proc.dat元数据生成fmgroids.h、fmgrprotos.h和fmgrtab.c三个文件。

其中fmgroids.h是所有内置函数的OID宏定义:

代码语言:javascript
复制
#define F_HEAP_TABLEAM_HANDLER 3
#define F_BYTEAOUT 31
#define F_CHAROUT 33
...

fmgrprotos.h为所有内置函数的声明:

代码语言:javascript
复制
extern Datum heap_tableam_handler(PG_FUNCTION_ARGS);
extern Datum byteaout(PG_FUNCTION_ARGS);
extern Datum charout(PG_FUNCTION_ARGS);
...

fmgrtab.c则是每个内置函数的信息,再介绍该信息前,先看下fmgrtab.h中内置函数描述结构:

代码语言:javascript
复制
typedef struct
{
Oidfoid;/* OID of the function */
shortnargs;/* 0..FUNC_MAX_ARGS, or -1 if variable count */
boolstrict;/* T if function is "strict" */
boolretset;/* T if function returns a set */
const char *funcName;/* C name of the function */
PGFunctionfunc;/* pointer to compiled function */
} FmgrBuiltin;

extern const FmgrBuiltin fmgr_builtins[];

通过fmgr_builtin[]数组来存储内置函数的描述信息,包括其OID、函数名、函数指针等。fmgrtab.c中生成的数组信息:

代码语言:javascript
复制
const FmgrBuiltin fmgr_builtins[] =
{
  {3,1,true,false,"heap_tableam_handler",heap_tableam_handler},
  {31,1,true,false,"byteaout",byteaout},
  {33,1,true,false,"charout",charout},
  ...
}

至此,若要开发写一个自定义内置函数,需要以下几步:

1、在pg_proc.dat中填写自定义函数信息

2、编译时gen_fmgrtab.pl脚本可自动生成自定义函数相关元数据信息

3、编写对应自定义函数,注意其返回值、入参个数及类型要和pg_proc.dat中填写的一致

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档