数据库内核研发学习之路(三)创建postgres内置函数

本章之前已经讲明白了我们的postgres如何进行编译安装,这是很重要的一步,接下来就是学会对postgres进行小的改动,然后保证依然能够顺利编译安装运行!

本章续讲内容如何创建一个内置函数。

1、内置函数和用户自定义函数的区别

熟悉数据库的大家都知道,我们在登录数据库之后也能使用create function语句创建函数,那我们这里的内置函数有什么区别呢?

  1. 内置函数和用户自定义函数的执行权限不同。内置函数默认执行权限为所有用户都能执行,而用户自定义函数默认只有创建的它的用户才能执行,但是支持使用grant语句进行权限的赋予。
  2. 内置函数和用户自定义函数的可见性不同。内置函数在所有实例下的所有数据库都可以使用,而用户自定义只能在创建的数据库下可见,如果想要在其他数据库也能使用,则需要重新另外创建。
  3. 内置函数和用户自定义函数的可维护程度不同。内置函数如果需要修改和删除必须修改内核代码然后重新编译安装才能生效,而用户自定义函数可以直接使用create function和drop function进维护。

2、内置函数的创建

知晓了内置函数和用户自定义函数的区别之后就到了内置函数的创建的时候了,内置函数的创建其实也比较简单,主要可以分为三部分。声明、实现、重新编译安装。

2.1内置函数的声明

内置函数的声明在src/include/catalog/pg_proc.dat文件里面,效仿之前的例子可知,这里需要写的内容示例如下:

{ oid => '4999', descr => 'test',proname => 'my_add', proleakproof => 't', prorettype => 'int4',proargtypes => 'int4', prosrc => 'my_add' }, 

这里对以上代码做一些解释,首先oid是内核中对象的oid,是唯一不可重复的,那如何知道我该使用哪个作为oid不会重复呢,下面有介绍;然后是descr,这表示该函数的描述;然后是proname,表示函数的名字,然后是proleakproof表示函数没有副作用,除了通过返回值之外,不会传递有关参数的任何信息。任何可能根据其参数的值引发错误的函数都不是防泄漏的;prorettype表示返回值类型;proargtypes表示函数参数类型;prosrc表示函数名字,如何调用函数。

更多关于该字段详细描述可见如下链接:

PostgreSQL:文档:16:53.39. pg_proc - PostgreSQL 中文

 接下来讲述如何获取一个没有被使用的oid,其实方法很简单,在上述文件的同级目录下,也就是在src/include/catalog/目录下有一个unused_oids脚本文件,我们直接在该目录下执行该文件,可得如下数据:

出现的这个id都是未被使用的id,也就是唯一不重复的可以使用的id,然后再将上述信息添加进去,如图所示 。

 这里我是这么理解的,其实这里的pg_proc就是一张表,我们在里面加的这段文字,就是标志着我增加了一个系统函数的一些信息。

 2.2内置函数的实现

前面对我们要增加的内置函数进行声明之后,接下来就是对这个函数实现。在src/backend/utils/adt下的pgstatfuncs.c文件增加如下函数实现:

3、重新编译安装PG

 当我们修改了内核源码之后,如果想要修改的内容生效,则需要重新编译安装PG数据库,并且初始化一个新的data目录。这里需要注意的是在我们执行。configure命令之前我们需要使用make maintainer-clean命令清除一下,确保成功。

make maintainer-clean命令执行结果如下,无报错则是执行成功,我这里实在源码的根目录执行的,也就是configure命令所在的目录执行的。

 接下来就是检查依赖,执行configure命令,可以选择还是安装到原来的目录,也可以选择安装到一个新的目录,在重新安装之前记得先关停数据库服务。如图所示,可以知道无数据库服务在运行。

 然后除此之外,我们再将之前的data目录更换一个名字。

 然后就可以开始重新安装编译PG了,这里要求和上一篇文章相似,看上一篇文章即可,具体的执行结果如下:

大家不用在意是否一样,只需要在乎是否有报错出现即可,无报错信息则视为执行成功。接下来就是开始编译安装。执行make -j32 && make install命令即可。这样子写是指在执行make命令的时候采用并行执行,并且在执行完之后接着执行make install命令。

 4、初始化新的data目录检查内置函数是否添加成功

前面的编译安装没有出现报错,如果出现一些依赖缺失的问题,试着看上一个博客解决,接下来就是重新初始化一个data,验证内置函数是否添加成功。

初始化成功,启动数据库服务,验证结果如下可知,postgres内置函数添加成功!

下一期更新如何新增一个拓展函数 !

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

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

相关文章

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【查询密钥别名集(ArkTS)】

查询密钥别名集(ArkTS) HUKS提供了接口供应用查询密钥别名集。 开发步骤 初始化密钥属性集。用于查询指定密钥别名集TAG,TAG仅支持HUKS_TAG_AUTH_STORAGE_LEVEL。调用接口[listAliases],查密钥别名集。 HarmonyOS与OpenHarmony鸿蒙文档籽料&#xff1…

入门小结:JavaScript小白语法

一、变量 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

Boost中线程的使用

目录 boost的线程基本用法 boost:condition thread_group 线程组 thread_pool boost的线程基本用法 boost::thread Thread_GenerateUuid;boost::thread Thread_ShowUuid;boost::mutex mutex;std::queue<std::string>UuidQueue;void procGenerateUuid();void showUuid…

vmware_虚拟机安装zabbix_超快超简单

TIPS: 一开始用docker 和 安装包&#xff0c;安装zabbix总是有问题&#xff0c;后发现zabbix官方提供了装好的虚拟机 1、下载VMware pro 个人免费版 官网地址如下 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro 如果提示注册&am…

服务器数据恢复—开盘修复raid5阵列硬盘故障的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌P2000存储&#xff0c;存储中有一组由8块硬盘&#xff08;包含一块热备盘&#xff09;组建的raid5阵列。上层部署VMWARE ESX虚拟化平台。 服务器存储故障&#xff1a; 存储在运行过程中有两块硬盘指示灯亮黄色。经过运维人员的初步检…

Go语言中GC(垃圾回收回收机制)三色标记与混合写屏障

5、Golang三色标记混合写屏障GC模式全分析 (yuque.com) 第1讲-课程目标_哔哩哔哩_bilibili Golang三色标记GC混合写屏障 Go V1.3之前的标记清除&#xff08;mark and sweep) 垃圾回收、内存管理、自动适放、三色标记法、STW (stop the world) 图的遍历&#xff1f;可达性分…

【Git】(基础篇二)—— Git操作

Git操作 在了解git理论知识之后&#xff0c;本文将结合实践操作为你讲解git的底层逻辑 Git的安装和配置 git官网下载&#xff1a;https://git-scm.com/ 下载后安装时除了选择安装地址外&#xff0c;其余都保持默认下一步即可。 安装好后鼠标右键会出现两个新的选项【Open …

基于 JAVA 的旅游网站设计与实现

点击下载源码 塞北村镇旅游网站设计 摘要 城市旅游产业的日新月异影响着村镇旅游产业的发展变化。网络、电子科技的迅猛前进同样牵动着旅游产业的快速成长。随着人们消费理念的不断发展变化&#xff0c;越来越多的人开始注意精神文明的追求&#xff0c;而不仅仅只是在意物质消…

项目JetCache的常见配置与使用

Hello, 大家好&#xff0c;今天本汪给大家带来的是JetCache在项目中的常见配置与用法讲解&#xff0c;接下来&#xff0c;随本汪一起来看看吧 一、介绍 官网地址&#xff1a;https://github.com/alibaba/jetcache JetCache 是一种 Java 缓存抽象&#xff0c;它为不同的缓存…

秘密,一般人我不告诉他.偷偷告诉你信创产品采购的正确打开方式:python爬虫实现

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” 采购XX有没有找你诉说 , 某某ZFCG网上的信创产品, 品种太多太杂,无法细分查找,某某详情页面要一个个看, 真费时费力,于是乎… !!!以下内容仅供学习使用,便于快速筛选找到需求产品!!!请勿…

【算法/序列】等差数列子序列算术序列最长对称子串

概念&#xff1a; 等差数列&#xff1a;任意两项的差总等于同一个常数 子数组 &#xff1a;是数组中的一个连续序列。 子序列&#xff1a;是通过从原序列删除零个或多个元素并在不改变顺序的情况下排列其余元素而获得的序列 算术序列&#xff1a;是一个数字列表&#xff0c;其中…

【时时三省】(C语言基础)变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 变量 可以改变的量 比如 int age&#xff1d;20 &#xff08;类型 变量的名字&#xff1d;0&#xff09; 如果后面要改可以直接代入 age&#xff1d;age1 age可以是任何字母 变量的分类…

【C++】类和对象的基本概念与使用

本文通过面向对象的概念以及通俗易懂的例子介绍面向对象引出类和对象。最后通过与之有相似之处的C语言中的struct一步步引出C中的类的定义方式&#xff0c;并提出了一些注意事项&#xff0c;最后描述了类的大小的计算方法。 一、什么是面向对象&#xff1f; 1.面向对象的概念 …

【C++编程】标准模板库 STL 的基本概念

STL 从广义上分为&#xff1a;容器、算法、迭代器 容器、算法之间通过迭代器进行无缝连接 STL 六大组件&#xff1a; 容器&#xff1a;各种数据结构&#xff0c;如 vector、list、deque、set、map 等&#xff0c;用来存放数据 序列式容器&#xff1a;物理存放上有序关联式容器&…

约束条件和数据库的用户管理

数据库的增删改查 查 约束条件和用户管理 删 约束条件&#xff1a; 主键 主键约束 primary key 用于标识表中的主键列的值&#xff0c;而且这个值是全表当中唯一的&#xff0c;而且值不能为null。 一个表只能有一个主键。 外键&#xff1a;用来建立表与表之间的关系。…

微信小游戏 彩色试管 倒水游戏 逻辑 (四)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义了一个名为 WaterFlow class&#xff0c;该类继承自 cc.Graphics&#xff0c;用于在 Cocos Creator 中创建和显示水流的动画效果。下面是对代码的详细解释&#x…

FPGA FIR fdatool filter designer MATLAB

位数问题 fdatool 先确定输入信号的位宽&#xff0c;比如17位在fdatool中&#xff0c;选set quantization parameters 选input/output 设置input word length 为17bit(not confirmed) fir compiler implementation 注意&#xff1a; 当设置输入位宽为16位时&#xff0c;ip核…

Linux系统部署MySQL数据库

1.Linux插入光盘&#xff0c;使用df-h获取光盘信息&#xff0c;默认/dev/sr0文件为光盘文件 使用命令 mount -o ro /dev/sr0 /media进行手动挂载 mount -o ro /dev/sr0 /media 2.进入cd /etc/yum.repos.d目录 编辑配置yum库&#xff0c;编辑vim yum.repos [BaseOS] nameba…

Flutter 状态管理新境界:多Provider并行驱动UI

前言 在上一篇文章中&#xff0c;我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中&#xff0c;使用 Provider 管理多个不同的状态时&#xff0c;你可以为每个状态创建一个单独的 ChangeNotifierProvider…

node+MySQL+Express实现账户登录,注册,重置之登录篇

nodeMySQLExpress实现账户登录 实现技术开发工具项目结构效果图app.js代码db.jsrouter下的account.jsdb下的account.jslogin.html数据库结构 实现技术 node.js,MySQL5.7(8.0以上版本会报错)&#xff0c;layui(前端框架)&#xff0c;Express notify(消息通知layui插件) 开发工…