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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python+Flask+SQLite的豆瓣电影可视化系统

FlaskMySQLEcharts 基于PythonFlaskSQLite的豆瓣电影可视化系统 Echarts 不支持登录注册,并且信息存储在数据库中 不含爬虫代码,或爬虫代码已失效 简介 基于PythonFlaskMySQL的豆瓣电影可视化系统,采用Echart构建图表,支持自定…

【数据结构】二叉树全攻略,从实现到应用详解

​ 💎所属专栏:数据结构与算法学习 💎 欢迎大家互三:2的n次方_ ​ 🍁1. 树形结构的介绍 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做…

动手学深度学习6.3 填充和步幅-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:填充和步幅_哔哩哔哩_bilibili 代码实现_哔哩哔哩_bilibili 本节教材地址:6.3. 填充和…

旗晟巡检机器人的应用场景有哪些?

巡检机器人作为现代科技的杰出成果,已广泛应用于各个关键场景。从危险的工业现场到至关重要的基础设施,它们的身影无处不在。它们以精准、高效、不知疲倦的特性,担当起保障生产、守护安全的重任,为行业发展注入新的活力。那么&…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述

3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别、跟踪及A2X(Aircraft-to-Everything)服务的支持。 3GPP TS 23.256 技术规范: 以下是文档的核心内容总结: UAV系…

深入理解PostgreSql域类型(Domain),灵活定义数据约束,让表结构设计更加严谨

在PostgreSQL中,域(Domain)是一种用户定义的数据类型,它基于系统内已存在的数据类型,并可以附加约束条件。使用域可以增强数据的完整性和一致性,因为它允许开发者对特定列设定更为具体的规则,比…

Mysql缓存调优的基本知识(附Demo)

目录 前言1. 配置2. 缓存3. 策略 前言 基本的知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)Mysql优化高级篇(全)Mysql底层原理详细剖析常见面试题(全) MySQL…

集群架构-web服务器(接入负载均衡+数据库+会话保持redis)--15454核心配置详解

紧接着前面的集群架构深化—中小型公司(拓展到大型公司业务)–下面图简单回顾一下之前做的及故障核心知识总结(等后期完全整理后,上传资源希望能帮大家) web集群架构-接入负载均衡部署web02服务器等 web集群-搭建web0…

Abaqus基于CT断层扫描的三维重建插件CT2Model 3D

插件介绍 AbyssFish CT2Model 3D V1.0 插件可将采用X射线等方法获取的计算机断层扫描(CT)图像在Abaqus有限元软件内进行三维重建,进而高效获取可供模拟分析的有限元模型。插件可用于医学影像三维重构、混凝土细观三维重建、岩心数字化等领域…

数据结构-C语言-排序(2)

代码位置:test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言: 1.1-排序定义: 排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序) 1.2-排序分…

2-36 基于matlab的流行学习算法程序

基于matlab的流行学习算法程序。通过GUI的形式将MDS、PCA、ISOMAP、LLE、Hessian LLE、Laplacian、Dissusion MAP、LTSA八种算法。程序以可视化界面进行展示,可直接调用进行分析。多种案例举例说明八种方法优劣,并且可设置自己数据进行分析。程序已调通&…

STM32智能工业自动化监控系统教程

目录 引言环境准备智能工业自动化监控系统基础代码实现:实现智能工业自动化监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:工业自动化与管理问题解决方案与优化收尾与总结 1. 引言 智能…

百度人脸识别Windows C++离线sdk C#接入

百度人脸识别Windows C离线sdk C#接入 目录 说明 设计背景 • 场景特点: • 客户特点: • 核心需求: SDK 包结构 效果 代码 说明 自己根据SDK封装了动态库,然后C#调用。 功能接口 设计背景 • 场景特点: -…

【漏洞复现】深信服 行为感知系统 日志中心 c.php 远程命令执行

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

PTA - 嵌套列表求和

使用递归函数对嵌套列表求和 函数接口定义: def sumtree(L) L是输入的嵌套列表。 裁判测试程序样例: /* 请在这里填写答案 */L eval(input()) print(sumtree(L)) # 调用函数 输入样例: 在这里给出一组输入。例如: [1,[2…

PriorityQueue 阅读记录

1、前言 1、优先队列,底层通过数组来构造树(二叉树) 来实现的。 2、默认是最小堆(取出来的是最小值),可以通过传入一个比较器 comparator 来构造一个最大堆。 3、传入的参数不能为空,否则抛出NPE问题。 4、最大堆的…

系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述

系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述 3.1.1 信息系统的定义3.1.1.1 信息系统3.1.1.2 信息化3.1.2 信息系统的发展3.1.2.1 初始阶段3.1.2.2 传播阶段3.1.2.3 控制阶段3.1.2.4 集成阶段3.1.2.5 数据管理阶段3.1.2.6 成熟阶段3.1.3 信息系统的分类3.…

读人工智能全传15意向立场

1. 物理立场 1.1. 可以解释一个实体行为 1.2. 在物理立场中,我们使用自然法则(物理、化学等)来预测系统的行为结果 1.3. 虽然物理立场在解释这种行为的时候非常有效,但无法应用于理解或者预测人类行为 1.3.1. …

六边形动态特效404单页HTML源码

源码介绍 动态悬浮的六边形,旁边404文字以及跳转按钮,整体看着像科技二次元画风,页面简约美观,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 完整源码 <!DOCTYPE html> <html><head…

关于springboot的@DS(““)多数据源的注解无法生效的原因

对于com.baomidou.dynamic.datasource.annotation的DS注解&#xff0c;但凡有一个AOP的修改都会影响到多数据源无法生效的问题&#xff0c;本次我是添加了方法上添加了Transactional&#xff0c;例如下图&#xff1a; 在方法上写了这个注解&#xff0c;会影响到DS("db2&qu…