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

目录

  • 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;
#endifPG_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.cgcc -c demo.c
  • 更多Makefile格式相关的内容见 Makefile-详细说明 和 手把手教你写一个 Makefile 文件。
  • Makefile基本内容如下:
MODULES = demoEXTENSION = demo
DATA = demo--1.0.sql 
PGFILEDESC = "demo - various functions that return tables" # 描述
OBJS = demo.o # 待生成的目标文件的名字,可以有多个,用空格分开
CC = gcc # 编译器的名称REGRESS = tablefuncLDFLAGES_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.mzph.cn/news/49758.shtml

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

相关文章

【C++杂货铺】探索string的底层实现

文章目录 一、成员变量二、成员函数2.1 默认构造函数2.2 拷贝构造函数2.3 operator2.4 c_str()2.5 size()2.6 operator[ ]2.7 iterator2.8 reserve2.9 resize2.10 push_back2.11 append2.12 operator2.13 insert2.14 erase2.15 find2.16 substr2.17 operator<<2.18 opera…

【微服务】spring 条件注解从使用到源码分析详解

目录 一、前言 二、spring 条件注解概述 2.1 条件注解Conditional介绍 2.2 Conditional扩展注解 2.2.1 Conditional扩展注解汇总 三、spring 条件注解案例演示 3.1 ConditionalOnBean 3.2 ConditionalOnMissingBean 3.2.1 使用在类上 3.2.2 使用场景补充 3.3 Condit…

jvm-类加载子系统

1.内存结构概述 类加载子系统负责从文件系统或网络中加载class文件&#xff0c;class文件在文件开头有特定的文件标识 ClassLoader只负责class文件的加载&#xff0c;至于它是否运行&#xff0c;则由Execution Engine决定 加载的类信息存放于一块称为方法区的内存空间&#xff…

什么是安全测试报告,怎么获得软件安全检测报告?

安全测试报告 软件安全测试报告&#xff1a;是指测试人员对软件产品的安全缺陷和非法入侵防范能力进行检查和验证的过程&#xff0c;并对软件安全质量进行整体评估&#xff0c;发现软件的缺陷与 bug&#xff0c;为开发人员修复漏洞、提高软件质量奠定坚实的基础。 怎么获得靠谱…

Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)

Hadoop学习&#xff1a;深入解析MapReduce的大数据魔力之数据压缩&#xff08;四&#xff09; 4.1 概述1&#xff09;压缩的好处和坏处2&#xff09;压缩原则 4.2 MR 支持的压缩编码4.3 压缩方式选择4.3.1 Gzip 压缩4.3.2 Bzip2 压缩4.3.3 Lzo 压缩4.3.4 Snappy 压缩4.3.5 压缩…

学会Mybatis框架:让你的代码更具灵活性、可维护性、安全性和高效性【二.动态SQL】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Mybatis动态SQL如何应用 1.需求 2.…

分布式锁 总结

分布式锁 在应用开发中&#xff0c;特别是web工程开发&#xff0c;通常都是并发编程&#xff0c;不是多进程就是多线程。这种场景下极易出现线程并发性安全问题&#xff0c;此时不得不使用锁来解决问题。在多线程高并发场景下&#xff0c;为了保证资源的线程安全问题&#xff0…

五、修改官方FreeRTOS例程(STM32F1)

1、官方源码下载 (1)进入FreeRTOS官网&#xff1a;FreeRTOS官网 (2)下载FreeRTOS。(选择带示例的下载) 2、删减目录 (1)下载后解压的FreeRTOS文件如下图所示。 (2)删除下图中红框勾选的文件。 FreeRTOS-Plus&#xff0c;FreeRTOS的生态文件&#xff0c;非必需的。tools&…

【数据库】表操作 习题总结

目录 关系建表 数据库sql的执行顺序 内外连接的写法 1.设计一张商品表 2.设计一张老师表 3.设计一张图书表 4.查询练习 5.查询练习 6.设计一个考勤系统 7.设计一个学校宿舍管理系统 8.设计一个车辆违章系统 9.设计一个学校食堂管理系统 10.有一张员工表emp&#xf…

开源TTS+gtx1080+cuda11.7+conda+python3.9吊打百度TTS

一、简介 开源项目&#xff0c;文本提示的生成音频模型 https://github.com/suno-ai/bark Bark是由Suno创建的基于变换器的文本到音频模型。Bark可以生成极为逼真的多语种演讲以及其他音频 - 包括音乐、背景噪音和简单的声音效果。该模型还可以产生非言语沟通&#xff0c;如…

Android 11 Display亮灭屏

系统休眠唤醒的时候会涉及到亮灭屏&#xff0c;下面分析下系统&#xff08;高通8155平台&#xff09;Display亮灭屏流程 1. 点亮屏幕 点亮屏幕入口在framework/base/下面LightsService.java&#xff0c;然后通过调用SurfaceControl.java ,最终调用到framework/native下面的Sur…

【洁洁送书第五期】为什么我们要了解可观测性工程

导读 可观测性已成为一个热门话题&#xff0c;并广受关注。随着它的普及&#xff0c;“可观测性”不幸被误作“监控”或“系统遥测”的同义词。可观测性是软件系统的一个特征。而且&#xff0c;只有当团队采用新的实践进行持续开发时&#xff0c;才能在生产软件系统中有效利用这…

Day14-2-NodeJS后端开发流程

Day14-NodeJS后端工程化流程 一 apifox工具 apifox是目前最好的接口调试工具 1 环境搭建 安装登录创建项目接口里面创建对应文件夹在指定的文件夹里面创建接口2 GET请求 1 apifox发送GET请求 2 后端接收GET请求 router.get("/getUserinfo"

Azure防火墙

文章目录 什么是Azure防火墙如何部署和配置创建虚拟网络创建虚拟机创建防火墙创建路由表&#xff0c;关联子网、路由配置防火墙策略配置应用程序规则配置网络规则配置 DNAT 规则 更改 Srv-Work 网络接口的主要和辅助 DNS 地址测试防火墙 什么是Azure防火墙 Azure防火墙是一种用…

EndNote(四)【文献引文格式、同步、智能分组、引文报告、文献笔记导出】

参考文献格式&#xff1a;&#xff08;官网引文格式下载文章引文格式更新-word&#xff09; 官网引文格式下载 网址&#xff1a;Downloads | EndNote 点击output styles&#xff1a; 下下来之后&#xff0c;放在这个路径下&#xff1a; 双击看一下&#xff1a; ok. 比如我们要…

引领行业高质量发展|云畅科技参编《低代码开发平台创新发展路线图(2023)》

8月8日-9日&#xff0c;中国电子技术标准化研究院于北京顺利召开《低代码开发平台创新发展路线图&#xff08;2023&#xff09;》封闭编制会。云畅科技、浪潮、百度、广域铭岛等来自低代码开发平台解决方案供应商、用户方、科研院所等近30家相关单位的40余位专家参与了现场编制…

mybatis动态SQL的运用

一、mybatis动态SQL update 表名 set name?,age? where id? 如果我们的前台没有传参&#xff0c;比如没有传入我们的name值&#xff0c;name就会把字段值改为null&#xff0c;这就违背了我们编码的初衷。 许多人会使用类似于where 1 1 来作为前缀&#xff0c;在代码中会用i…

STL---vector

目录 1.vector的介绍及使用 2.vector接口说明及模拟实现 2.1vector定义 2.2vector迭代器的使用 2.3vector容量 2.4vector增删查改 3迭代器失效 4.使用memcpy拷贝 5.模拟实现 1.vector的介绍及使用 vector的文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数…

战略定位、战略咨询、战略定位咨询:一站式解决您的困惑

战略定位、战略咨询和战略定位咨询是三个密切相关但又不同的概念。它们都与企业的发展战略有关&#xff0c;但各自的侧重点不同。在这篇文章中&#xff0c;我们将详细介绍这三个词的定义&#xff0c;并为您提供一些实用的建议&#xff0c;帮助您更好地理解和应用这些概念。 战略…

ardupilot开发 --- 仿真篇

环境 安装wsl2&#xff0c;win11自带wsl&#xff0c;win10需要安装&#xff1b;git clone ardupilot 源码&#xff1b;安装 Linux下的build环境&#xff1b;安装 flightgear&#xff08;非必须&#xff09; sudo apt-get install flightgearbuild 想要仿真的载具类型&#xff…