PostgreSQL-UDF用户自定义函数-扩展插件

news2024/11/24 1:03:50

目录

  • PostgreSQL-UDF用户自定义函数-扩展插件
    • 零、前置条件
    • 一、创建 .c 和 .sql 文件
      • 创建.c文件
      • 创建.sql文件
    • 二、创建 .control 和 Makefile 文件
      • 创建 .control 文件
      • 创建 Makefile 文件
    • 三、编译 & 链接
    • 四、psql(或者其他PG backend)中创建扩展

PostgreSQL-UDF用户自定义函数-扩展插件

零、前置条件

  1. ggc
  2. postgresql

一、创建 .c 和 .sql 文件

创建.c文件

  • 进入PG源码的contib/目录下面,这个目录下面都是用于PG进行功能扩展的插件。
  • 创建我们的插件(UDF同义词:插件;扩展;用户自定义函数)目录demo/
  • 在我们的插件目录下创建.c.sql文件,后续第二步中还会创建用于编译和链接的Makefile文件和.control文件。
[root@localhost ~]# cd /root/pgsoft/postgresql-15.3/contrib/
[root@localhost contrib]# mkdir demo
[root@localhost contrib]# cd demo
# 创建.c文件
[root@localhost demo]# vim demo.c
  • UDF函数的.c文件写法见该链接第二步。
  • .c文件内容如下:
#include "postgres.h"
#include "fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(my_sum); //PG中需要使用PG_FUNCTION_INFO_V1()来声明函数名

Datum my_sum(PG_FUNCTION_ARGS); 

Datum my_sum(PG_FUNCTION_ARGS){ //定义函数体,这里定义的函数体功能是返回传参的两整型数相加的结果
        

        int32 a = PG_GETARG_INT32(0);
        int32 b = PG_GETARG_INT32(1);

        int32 sum = a + b;
        PG_RETURN_INT32(sum);

}

创建.sql文件

  • .sql文件中主要是写入创建FUNCTIONTYPE的SQL语句。
  • vim新建一个以插件名+插件版本号命名的.sql文件(这里demo是插件名,--1.0是版本号)。
[root@localhost demo]# vim demo--1.0.sql
  • .sql具体内容如下:
CREATE FUNCTION my_sum(INTEGER,INTEGER) 
RETURNS INTEGER 
AS '$libdir/demo' 
LANGUAGE C STRICT;
  • 注意:SQL语句中的函数名要和上面.c中定义的函数保持一致。
  • 其中$libdir这个变量是PG安装位置下的静态库文件的默认存储路径,可以用[root@localhost ~]# pg_config --pkglibdir这一命令查看具体的路径,可以不用管,后面直接接与插件名一致的目录即可,这里接的是demo
  • 如果.c文件中定义了多个函数,.sql文件中的AS后面需要指明是demo.c中的哪一个函数,即:
CREATE FUNCTION …
… …
AS '$libdir/demo', 'my_sum'
… …

二、创建 .control 和 Makefile 文件

创建 .control 文件

  • 在PostgreSQL中,后缀为.control的文件是一个扩展的控制文件。它用于管理和描述特定扩展的元数据和配置信息。
  • 控制文件通常与扩展相关联,并存储了有关扩展的重要信息,例如扩展的名称、版本、所需依赖项等。这些文件还可以包含其他配置选项,以更好地定义和管理扩展的行为。
  • 通过使用.control文件,PostgreSQL能够根据需要加载和卸载扩展,并确保正确配置和使用扩展。这些文件对于扩展的安装、更新和卸载过程都起着重要作用。
  • 总结:.control文件是PostgreSQL中扩展的元数据文件,用于管理和配置扩展的属性和行为。
[root@localhost demo]# vim demo.control
  • .control文件基本内容如下:
comment = 'test demo'
default_version = '1.0'
module_pathname = '$libdir/demo'
relocatable = true
  • comment配置项:用于提供关于扩展的注释或描述性文本。它允许开发人员向用户提供有关扩展功能、用途或其他相关信息的说明。这些注释可以帮助用户更好地理解和使用扩展.
  • relocatable配置项:用于指定扩展是否可重定位。如果设置为true,则表示扩展可以在不重新编译数据库的情况下移动到不同的安装位置。这对于在多个数据库实例之间共享和部署扩展非常有用。默认情况下,该配置项的值是false
  • 注意:default_version要与最新版本的.sql文件名中的版本号保持一致。

创建 Makefile 文件

  • Makefile文件本质上是shell命令的集合,用于一系列源代码文件的自动化编译,用make指令执行一个Makefile文件,可以根据文件中的编译规则对一系列源代码文件进行不同的编译。
  • 这里贴一个Linux下编译链接相关文件的流程说明(根据自己的理解总结的图,有错误敬请指出):
    在这里插入图片描述
  • 回到正题,Makefile文件由变量们和编译规则构成:
    • 定义变量的基本格式是变量名 = 变量值,使用变量的基本格式和shell一致$(变量名)
    • 对某个源码文件的编译规则编写的语法基本格式如下:
目标文件1:依赖文件1

(Tab键)规则1(依赖文件1怎么生成目标文件1的,也就是用依赖文件生成目标文件的方法)

目标文件2:依赖文件2

(Tab键)规则2(依赖文件2怎么生成目标文件2的)
  • 依赖文件对应上图.c.cpp等源码文件,目标文件对应上图中.o文件。
  • 规则对应编译命令gcc [编译选项] (编译对象)
  • 实例:
demo.o:demo.c
	gcc -c demo.c
  • 更多Makefile格式相关的内容见 Makefile-详细说明 和 手把手教你写一个 Makefile 文件。
  • Makefile基本内容如下:
MODULES = demo

EXTENSION = demo
DATA = demo--1.0.sql 
PGFILEDESC = "demo - various functions that return tables" # 描述
OBJS = demo.o # 待生成的目标文件的名字,可以有多个,用空格分开
CC = gcc # 编译器的名称

REGRESS = tablefunc

LDFLAGES_SL += $(filter -lm, $(LIBS)) # 这一句的作用是如果有多个源码文件编译生成的.o目标文件,把这些.o文件打包成一个静态库文件,什么是打包?为什么要打包?什么是链接?解释均见上图

# 下面这一段中主要是一个条件分支语句,分别是用PGXS和不用PGXS进行扩展编译的情况。
# 变量PGXS:如果您正在考虑contribute PostgreSQL扩展模块,那么为它们建立一个可移植的构建系统可能相当困难。
# 因此,PostgreSQL安装为扩展提供了一个称为PGXS的构建基础设施,从而可以简单地针对已经安装的服务器来构建简单的扩展模块。
# PGXS主要用于包含C代码的扩展,尽管它也可以用于纯SQL扩展。
# 请注意,PGXS并不是一个通用的构建系统框架,可以用来构建任何与PostgreSQL接口的软件;它简单地自动化了简单服务器扩展模块的通用构建规则。对于更复杂的包,您可能需要编写自己的构建系统。

# 以上是对PGXS的解释,总结来说就是更方便用户自己进行扩展编译的一个模块
# ifdef NO_PGXS,如果不用PGXS进行编译,那么就需要手动设置编译选项、链接库路径等,需要利用Makefile.global文件中指定的pg_config中includefir和libdir指明lib库和include库的位置,如下图
# 走上面这个条件分支编译时有可能会出现缺少一些依赖文件的情况,需要在源码中找到文件复制到demo/目录下来
# else,就是用PGXS编译的情况(可以选择编译时加参数 USE_PGXS=1) ,此时 Makefile 会通过 abase 自带命令 pg_config 来查找 lib 库和 include 库的位置,而命令 pg_config 已默认加载在数据库 owner 的 PATH 环境变量中,可直接使用。

# 总之下面这一段通常情况下的扩展可以直接照搬,不用修改

# USE_PGXS = 1,如果加了这一句,进入else的条件分支
ifdef NO_PGXS
subdir = contrib/extensions
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
else # = ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
endif

  • PG源码地址/src/Makefile.global文件截图如下:
    在这里插入图片描述

三、编译 & 链接

  • 在demo目录下执行makemake install
[root@localhost demo]# make
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -O0 -fPIC -I. -I./ -I/opt/pgsql-15.3/include/server -I/opt/pgsql-15.3/include/internal  -D_GNU_SOURCE   -c -o demo.o demo.c -MMD -MP -MF .deps/demo.Po
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -O0 -fPIC demo.o -L/opt/pgsql-15.3/lib   -Wl,--as-needed -Wl,-rpath,'/opt/pgsql-15.3/lib',--enable-new-dtags  -shared -o demo.so

# 编译成功之后会出现 demo.o 和 demo.so 两个文件
[root@localhost demo]# ls
demo.c  demo.control  demo.o  demo.so  Makefile

[root@localhost demo]# make install
/usr/bin/mkdir -p '/opt/pgsql-15.3/share/extension'
/usr/bin/mkdir -p '/opt/pgsql-15.3/share/extension'
/usr/bin/mkdir -p '/opt/pgsql-15.3/lib'
/usr/bin/install -c -m 644 .//demo.control '/opt/pgsql-15.3/share/extension/'
/usr/bin/install -c -m 644 .//demo--1.0.sql  '/opt/pgsql-15.3/share/extension/'
/usr/bin/install -c -m 755  demo.so '/opt/pgsql-15.3/lib/'

# 扩展安装成功之后,PG安装目录下的./share/extensions/目录下会出现demo--1.0.sql文件和demo.control文件
[root@localhost demo]# ls /opt/pgsql-15.3/share/extension/
demo--1.0.sql     plpgsql.control             postgres_fdw.control
demo.control      postgres_fdw--1.0--1.1.sql
plpgsql--1.0.sql  postgres_fdw--1.0.sql

四、psql(或者其他PG backend)中创建扩展

posgres=# create extension demo;
CREATE EXTENSION
posgres=# 
posgres=# select my_sum(1,2);
 my_sum 
--------
      3
(1 row)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/893360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

illustrator-形状模式-路径查找器-路径偏移-扩展

文章目录 1.形状模式1.1.联集:形状相加1.2.减去顶层:形状减去共同部分1.3.交集:相同部分1.4.差集:形状不同部分 2.路径查找器2.1.分割2.2.修边2.3.合并2.4.裁剪2.5.轮廓2.6.减去后方对象 3.路径偏移4.扩展外观 打开路径查找器快捷…

吃雪糕也能涨知识了!猿辅导携手中街1946推出“冷知识冰棍”

为了给孩子们的暑假学习加点“料”,猿辅导近日脑洞大开,和中街1946携手推出了“冷知识冰棍”,以数学、英语、语文、科学4个科目为外包装,分别对应草莓山楂、青提菠萝、茉莉蓝莓和蜜桃乌龙等4种口味,为孩子们开启了夏日…

在 SwiftUI 中创建一个环形 Slider

文章目录 前言初始化环形轮廓将进度值和拇指位置绑定添加触摸手势为不同的坐标值设置滑块位置总结 前言 Slider 控件是一种允许用户从一系列值中选择一个值的 UI 控件。在 SwiftUI 中,它通常呈现为直线上的拇指选择器。有时将这种类型的选择器呈现为一个圆圈&#…

centos7、ky10_server(arm版、x86版)将程序做成系统服务

前提条件 提供启动脚本、停止脚本 启动脚本 生成app启动脚本 touch app_start.sh cat > app_start.sh << EOF chmod -R 777 /home/zenglg/appcd /home/zenglg/app/apache-tomcat/bin./startup.sh EOF 停止脚本 生成app.停止脚本 touch app_stop.sh cat > app_sto…

ssm学校运动会信息管理系统源码和论文

ssm学校运动会信息管理系统027 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 在当今社会上&#xff0c;体育运动越来越普及&#xff0c;参与运动会的人越来越多&#xff0c;但是目前对运动会信息管理还…

常见的Web安全漏洞有哪些,Web安全漏洞常用测试方法介绍

Web安全漏洞是指在Web应用程序中存在的可能被攻击者利用的漏洞&#xff0c;正确认识和了解这些漏洞对于Web应用程序的开发和测试至关重要。 一、常见的Web安全漏洞类型&#xff1a; 1、跨站脚本攻击(Cross-Site Scripting&#xff0c;XSS)&#xff1a;攻击者通过向Web页面注入…

C语言之extern “C“详解与使用方法

前言 在你工作过的系统里&#xff0c;不知能否看到类似下面的代码。 这好像没有什么问题&#xff0c;你应该还会想&#xff1a;“嗯⋯是啊&#xff0c;我们的代码都是这样写的&#xff0c;从来没有因此碰到过什么麻烦啊&#xff5e;”。 你说的没错&#xff0c;如果你的头文件…

如何使用Redis实现附近商家查询

导读 在日常生活中&#xff0c;我们经常能看见查询附近商家的功能。 常见的场景有&#xff0c;比如你在点外卖的时候&#xff0c;就可能需要按照距离查询附近几百米或者几公里的商家。 本文将介绍如何使用Redis实现按照距离查询附近商户的功能&#xff0c;并以SpringBoot项目…

偷偷告诉你,线上便宜的卡你就得忍受这些毛病!

很多人都觉得线上的流量卡资费便宜&#xff0c;都想随手申请一张&#xff0c;在这里&#xff0c;小编偷偷的告诉大家一下&#xff0c;线上的流量卡资费虽然便宜&#xff0c;但是缺点也有不少&#xff0c;看完你能接受吗&#xff1f; ​ 我们先说一说线上流量卡的优势&#xff1…

如何自定义IIS的页面

到C:\inetpub\wwwroot 文件夹下面有一个 iisstart.htm文件 修改它内容如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns"http://www.w3.org/1999/xhtml&…

没有放入回收站的文件如何找回?这个方法可以帮你

在我们平常使用电脑时&#xff0c;经常需要删除一些文件或文件夹。通常情况下&#xff0c;这些文件会被移动到回收站&#xff0c;以便我们在需要时可以轻松恢复。然而&#xff0c;有时候我们希望直接永久删除文件&#xff0c;而不经过回收站。不过&#xff0c;在使用这些方法之…

九耶丨阁瑞钛伦特-Spring boot与Spring cloud 之间的关系

Spring Boot和Spring Cloud是两个相互关联的项目&#xff0c;它们可以一起使用来构建微服务架构。 Spring Boot是一个用于简化Spring应用程序开发的框架&#xff0c;它提供了自动配置、快速开发的特性&#xff0c;使得开发人员可以更加轻松地创建独立的、生产级别的Spring应用程…

Azure Bastion的简单使用

什么是Azure Bastion Azure Bastion 是一个提供安全远程连接到 Azure 虚拟机&#xff08;VM&#xff09;的服务。传统上&#xff0c;访问 VM 需要使用公共 IP 或者设立 VPN 连接&#xff0c;这可能存在一些安全风险。Azure Bastion 提供了一种更安全的方式&#xff0c;它是一个…

SB-B300、CKN1262、CKN55160楔块式单向离合器

SB-A130 S8-8130 SB-A150 SB-B150 SB-B180 SB-B180 SB-B200 SB-B200 SB-B250 SB-B250 SB-B300 SB-B300 CKN1262 CKN1568 CKN2075 CKN2590 CKN30100 CKN35110 CKN40125 CKN45130 CKN40150 CKN55160 CKN60170 CKN70190 CKN80210 CKN90230 CKN系列为楔块…

jmeter实用随机字符串常用变量 生成指定位数汇总

前言 在日常接口测试、压力测试时&#xff0c;我们需要生成大量的随机变量。例如&#xff1a;姓名、手机号、随机字符串等。这时候使用Jmeter内置的一些方法的随机生成变量&#xff0c;便成了解决问题的一种方式。 一、姓名随机生成 1.引入代码 ${__RandomString(1,赵钱孙李…

【Java转Go】快速上手学习笔记(三)之基础篇二

【Java转Go】快速上手学习笔记&#xff08;二&#xff09;之基础篇一 了解了基本语法、基本数据类型这些使用&#xff0c;接下来我们来讲数组、切片、值传递、引用传递、指针类型、函数、map、结构体。 目录 数组和切片值传递、引用传递指针类型defer延迟执行函数map结构体匿名…

历时数月钻研推流/对比各种流媒体服务程序/PK总结

1 前言 大量测试下来&#xff0c;网页显示视频流实时性从高到低依次是 webrtc > ws-flv > flv > hls。播放器打开rtsp/rtmp视频流实时性由具体的播放器控制&#xff0c;比如缓存大小和缓存时间&#xff0c;是否音视频同步等。由于flv拉流同源地址最大支持6路同时播放…

docker-php扩展

生成扩展骨架 环境&#xff1a;docker-compose、php74 1.本地要有一份 php-src git clone https://github.com/php/php-src.git cd php-src git checkout PHP-7.4.52.\www\php-src\ext可以看到有一个 ext_skel.php 文件 3.通过ext_skel.php脚本创建了一个hello扩展&#xf…

不用+号算加法(位运算实现)

最近在LeetCode上刷题看到一道非常有意思的题&#xff0c;如何不用号算加法&#xff1f;我觉得挺有意思的故而分享给大家。 在不能使用 号的情况下其实很容易想到运用位运算去解决问题&#xff0c;也就是用二进制去表示十进制加法的逻辑。所以我们可以先拆分十进制加法来帮助理…

「2024」预备研究生mem-三角形内心立体几何相接与相切

一、三角形内心&立体几何相接与相切 现场推算&#xff1a; 二、练习题