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

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

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

...

...

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

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

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


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

fmgrprotos.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[];

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

        目录
        相关文章
        |
        7月前
        |
        SQL 关系型数据库 PostgreSQL
        PostgreSQL和greenplum的copy命令可以添加字段吗?
        【6月更文挑战第5天】PostgreSQL和greenplum的copy命令可以添加字段吗?
        102 3
        |
        SQL 存储 移动开发
        PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(四)|学习笔记
        快速学习3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(四)
         PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(四)|学习笔记
        |
        存储 SQL 自然语言处理
        3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(二)|学习笔记
        快速学习3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(二)
        3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(二)|学习笔记
        |
        存储 SQL 关系型数据库
        PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.19. pg_lsn Type
        8.19. pg_lsn Type pg_lsn数据类型可以被用来存储 LSN(日志序列号)数据,LSN 是一个指向 WAL 中的位置的指针。这个类型是XLogRecPtr的一种表达并且是 PostgreSQL的一种内部系统类型。
        1364 0
        |
        SQL 关系型数据库 Shell
        3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(一)|学习笔记
        快速学习3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(一)
        |
        SQL 关系型数据库 数据库
        3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(三)|学习笔记
        快速学习3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(三)
        |
        关系型数据库 分布式数据库
        PolarDB-X 1.0-SQL 手册-函数-转换函数
        DRDS 支持如下转换函数:
        163 0
        |
        SQL 关系型数据库 PostgreSQL
        |
        SQL 关系型数据库 PostgreSQL
        PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.15. 数组
        8.15. 数组 8.15.1. 数组类型的定义 8.15.2. 数组值输入 8.15.3. 访问数组 8.15.4. 修改数组 8.15.5. 在数组中搜索 8.15.6. 数组输入和输出语法 PostgreSQL允许一个表中的列定义为变长多维数组。
        1219 0
        |
        SQL 关系型数据库 PostgreSQL
        PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.7. 表达式索引
        11.7. 表达式索引 一个索引列并不一定是底层表的一个列,也可以是从表的一列或多列计算而来的一个函数或者标量表达式。这种特性对于根据计算结果快速获取表中内容是有用的。 例如,一种进行大小写不敏感比较的常用方法是使用lower函数: SELECT * FROM test1 WHERE low.
        1115 0