当前位置: 首页 > news >正文

数据库内核研发学习之路(三)创建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内置函数添加成功!

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux 安装多个jdk,切换使用
  • OPC通信从入门到精通_2_OPC通信详解和C#客户端编程(OPC基础概念;OPC通信仿真(KepServer作为OPC服务器;使用Modbus Slave和另外软件仿真2个PLC设备);C#程序)
  • Android使用AndServer在安卓设备上搭建服务端(Java)(Kotlin)两种写法
  • 大语言模型LLM
  • 详解python基本语法
  • 每日一练——第四题
  • vue自制表格
  • 什么是TCP
  • vue3+TS从0到1手撸后台管理系统
  • rust + python+ libtorch
  • python用selenium网页模拟时xpath无法定位元素解决方法2
  • Spark中的JOIN机制
  • 集合的定义和特点
  • springboot个人证书管理系统-计算机毕业设计源码16679
  • <数据集>夜间车辆识别数据集<目标检测>
  • 《深入 React 技术栈》
  • angular组件开发
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • const let
  • golang 发送GET和POST示例
  • iOS | NSProxy
  • Javascript弹出层-初探
  • MQ框架的比较
  • python学习笔记 - ThreadLocal
  • Sass 快速入门教程
  • STAR法则
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • webgl (原生)基础入门指南【一】
  • Yii源码解读-服务定位器(Service Locator)
  • 大主子表关联的性能优化方法
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • elasticsearch-head插件安装
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​如何在iOS手机上查看应用日志
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #java学习笔记(面向对象)----(未完结)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #职场发展#其他
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)bark-ml
  • (12)Linux 常见的三种进程状态
  • (2020)Java后端开发----(面试题和笔试题)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (zhuan) 一些RL的文献(及笔记)
  • (二十六)Java 数据结构
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (计算机网络)物理层
  • (原創) 物件導向與老子思想 (OO)
  • (转)四层和七层负载均衡的区别
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复