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

2022-06-07 00:00:00 数据 函数 专区 信息 自定义

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

...

...

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

GP7通过gen_fmgrtab.plperl脚本利用pg_proc.dat元数据生成fmgroids.hfmgrprotos.hfmgrtab.c三个文件。

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

    #define F_HEAP_TABLEAM_HANDLER 3
    #define F_BYTEAOUT 31
    #define F_CHAROUT 33
    ...

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

      extern Datum heap_tableam_handler(PG_FUNCTION_ARGS);
      extern Datum byteaout(PG_FUNCTION_ARGS);
      extern Datum charout(PG_FUNCTION_ARGS);
      ...

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

        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中生成的数组信息:

          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中填写的一致

          来源 https://www.modb.pro/db/374748

          相关文章