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

  1. 函数 version(),没有参数,作为例子简洁明了。如果需要参数,可以查阅 adt 下其他函数定义,也是非常简单的事情,这就是开源给我们带来的知识宝库;
    1. postgres=# select version();
                                                           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=#
    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 */
        extern Datum pgsql_version(PG_FUNCTION_ARGS);
    4. 最关键的定义,让用户可以看到,/src/include/catalog/proc.h,这个文件编译前会被脚本处理生成 BKI(自行查阅文档)脚本,初始化数据库时在 pg_proc 里边定义函数,类型为internal,这个类型是有别于其他类型的(比如C,定义在外部库中),关于这些定义的含义,篇幅有限请自行学习吧:
      1. 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_ ));
  2. 定义我们自己的函数:
    1. Datum
      quanzl_version(PG_FUNCTION_ARGS)
      {
      	PG_RETURN_TEXT_P(cstring_to_text(“Quan‘s Database”));
      }
    2. builtins.h 在 pgsql_version下添加定义:
      1. extern Datum quanzl_version(PG_FUNCTION_ARGS);
    3. proc.h:
      1. 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_ ));
      2. 这里的 OID = 90 至关重要,并不是随意选取,必须是未使用的,怎么找呢,PG为我们提供了脚本,在 src/include/catalog/下的 unused_oids,轻松知道哪个可用。(还有一个duplicate_oids用于排错)
  3. 编译、运行,就这么简单
  4. 时间关系,上述过程未经验证,可能有错误,但大致步骤如此。
时间: 2024-10-06 17:45:12

如何为PostgreSQL创建自定义内建函数的相关文章

创建自定义的Middleware中间件

创建自定义的Middleware中间件 阅读目录 何为Middleware中间件 使用Inline方式注册Middleware 使用Inline+ AppFunc方式注册Middleware 定义原生Middleware类的形式来注册Middleware 使用Katana Helper来注册Middleware Middleware的执行顺序 小结 经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middle

微信公众平台如何创建自定义菜单?

微信现在的功能越来越强大了,申请认证后的开发者能自定义菜单,用户直接点击微信界面下方的菜单,就能直接去到指定的页面,下面小编用[微信公众平台测试号]为大家演示一下怎么创建自定义菜单. 工具/原料 认证后的微信公众平台 微信公众平台切换开发者模式 方法/步骤 登录[微信公众平台],选择[功能]菜单下面的[高级功能],进入[开发模式]. 由于小编的微信公众平台还没通过认证,下面用[申请测试账户]为大家演示. 微信公众平台接口测试帐号申请,无需公众帐号.快速申请接口测试号,直接体验和测试公众平台所有高

Drupal创建自定义表单,上传文件代码

Drupal中创建自定义表单,用来上传文件,对上传文件做一些操作.以下是放在Module中的代码: 一.菜单建立表单路径 /** Implementation of hook_menu(). */ function moduleName_menu () { $items = array(); $items['admin/import'] = array( 'title' => 'title', 'page callback' => 'drupal_get_form', 'page argume

创建自定义存储过程

--创建自定义存储过程--语法:--if exists(select * from sysobjects where name='')-- drop proc ''--go--create proc[edure] usp_名称-- 相当于方法的():创建参数--as-- 相当于方法{}:方法体--go--调用语法:--exec 存储过程名称 参数值,参数值 .....--创建存储过程,获取所有学员信息if exists(select * from sysobjects where name='u

通过反射创建自定义泛型的实例。

比如有这样一个泛型:Demo.GenericsSimple<T,TT> 我想要通过反射创建一个Demo.GenericsSimple<string,int>的实例可以通过下面的格式进行创建: System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("命名空间.User`形参数量N[[1形参类型全名,形参类型所在的程 序集名称],[2形参类型全名,形参类型所在的程序集名称],[3形参类型全名,形参类型

带你走近AngularJS - 创建自定义指令

为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义指令的功能,并且AngularJS 是目前唯一提供Web应用可复用能力的框架. 目前有很多JavaScript 产品提供插件给Web开发人员.例如, Bootstrap 就是当前比较流行的提供样式和JavaScript插件的前端开发工具包.但是开发人员在使用Booostrap中的插件时, 必须切换到JavaScript 模式来写 jQuery

使用Python创建自定义机器人向群组人员发送消息

创建机器人 打开需要创建机器人的群组,点击 群组机器 人的图标 点击 + 号键创建机器人 点击 自定义 创建自定义机器人 点击 添加 设置机器人头像,机器人名称,机器人属组,点击下一步 复制API(webhook),点击完成 编写Python脚本 注意:修改脚本内requrl的值为机器人的webhook地址 脚本使用说明: 使用方法:脚本后面跟要发送的消息 at所有人将 isAtAll 的值改为True at指定人在 atMobiles 列表定义被at人的手机,列表形式 requrl的值为机器人

【微信公众平台开发】创建自定义菜单(四)

1.根据微信公众平台文档,得知创建自定义菜单有如下规则: a.目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以"..."代替.请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来.建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果. 注:所以最多只能创建15个功能菜单,多了就出错了! b. 目前自定义菜单接口可实现两种类型按钮,如下: click: 用户点击

Azure VMSS ---- PowerShell创建自定义镜像的VMSS集群

前面一篇文章介绍了如何用PowerShell创建标准镜像的VMSS集群.http://www.cnblogs.com/hengwei/p/7391178.html 本文将介绍,如何用PowerShell创建自定义镜像的VMSS集群. 1 创建VM,对其进行个性化配置,比如安装httpd,增加Date Disk等,并把此VM捕获成Image 2 以这个Image创建VMSS集群 一 创建并捕获Image 这个操作在前面的文章中也介绍过: http://www.cnblogs.com/hengwei