加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何为PostgreSQL创建自定义内建函数

发布时间:2020-12-13 17:15:04 所属栏目:百科 来源:网络整理
导读:函数 version(),没有参数,作为例子简洁明了。如果需要参数,可以查阅 adt 下其他函数定义,也是非常简单的事情,这就是开源给我们带来的知识宝库; postgres=#selectversion();version------------------------------------------------------------------
  1. 函数 version(),没有参数,作为例子简洁明了。如果需要参数,可以查阅 adt 下其他函数定义,也是非常简单的事情,这就是开源给我们带来的知识宝库;

    1. postgres=#selectversion();
      version
      -----------------------------------------------------------------------------------------------------------------
      PostgreSQL9.5develonx86_64-unknown-linux-gnu,compiledbygcc(GCC)4.9.220150212(RedHat4.9.2-6),64-bit
      (1row)
      
      postgres=#
    2. 定义在 src/backend/utils/adt/version.c 里边:

      1. Datum
        pgsql_version(PG_FUNCTION_ARGS)
        {
        	PG_RETURN_TEXT_P(cstring_to_text(PG_VERSION_STR));
        }
    3. 其他文件内的定义,/src/include/utils/builtins:

      1. /*version.c*/
        externDatumpgsql_version(PG_FUNCTION_ARGS);
    4. 最关键的定义,让用户可以看到,/src/include/catalog/proc.h,这个文件编译前会被脚本处理生成 BKI(自行查阅文档)脚本,初始化数据库时在 pg_proc 里边定义函数,类型为internal,这个类型是有别于其他类型的(比如C,定义在外部库中),关于这些定义的含义,篇幅有限请自行学习吧:

      1. DATA(insertOID=89(version		PGNSPPGUID121000fffftfs0025""_null__null__null__null_pgsql_version_null__null__null_));
  2. 定义我们自己的函数:

    1. Datum
      quanzl_version(PG_FUNCTION_ARGS)
      {
      	PG_RETURN_TEXT_P(cstring_to_text(“Quan'sDatabase”));
      }
    2. builtins.h 在 pgsql_version下添加定义:

      1. externDatumquanzl_version(PG_FUNCTION_ARGS);
    3. proc.h:

      1. DATA(insertOID=90(quan_version		PGNSPPGUID121000fffftfs0025""_null__null__null__null_quanzl_version_null__null__null_));
      2. 这里的 OID = 90 至关重要,并不是随意选取,必须是未使用的,怎么找呢,PG为我们提供了脚本,在src/include/catalog/下的unused_oids,轻松知道哪个可用。(还有一个duplicate_oids用于排错)

  3. 编译、运行,就这么简单

  4. 时间关系,上述过程未经验证,可能有错误,但大致步骤如此。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读