zoukankan      html  css  js  c++  java
  • 如何为PostgreSQL创建自定义内建函数

    1. 函数 version(),没有参数,作为例子简洁明了。如果需要参数,可以查阅 adt 下其他函数定义,也是非常简单的事情,这就是开源给我们带来的知识宝库;

        1.  
          postgres=# select version();
        2.  
                                                               version                                                     
        3.  
          -----------------------------------------------------------------------------------------------------------------
        4.  
           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
        5.  
          (1 row)
        6.  
           
        7.  
          postgres=#
      1. 定义在 src/backend/utils/adt/version.c 里边:

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

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

        1. DATA(insert OID =  89 (  version		   PGNSP PGUID 12 0 f f f f t f s 25 "" _null_ _null_ _null_ _null_ pgsql_version _null_ _null_ _null_ ));
    2. 定义我们自己的函数:

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

        1. extern Datum quanzl_version(PG_FUNCTION_ARGS);
      2. proc.h:

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

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

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

  • 相关阅读:
    2018-2-13-安装-aria2
    ..USERstm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!
    zubax_gnss移植到STM32F407
    ChibiOS/RT移植到STM32F407
    arm-none-eabi/bin/ld: build/com.zubax.gnss.elf section `.text' will not fit in region `flash'
    Traceback (most recent call last): File "../zubax_chibios/tools/make_boot_descriptor.py", line 251
    Eclipse 交叉编译环境
    PX4/Pixhawk uORB
    FreeRTOS 任务创建和删除(静态)
    FreeRTOS 任务创建和删除(动态)
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/15774067.html
Copyright © 2011-2022 走看看