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

news2024/9/20 8:11:41

本章之前已经讲明白了我们的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.coloradmin.cn/o/1931102.html

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

相关文章

国产精品ORM框架-SqlSugar详解 进阶功能 集成整合 脚手架应用 附源码 云草桑 专题二

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题一-CSDN博客 sqlsugar 官网-CSDN博客 4、进阶功能 5、集成整合 6、脚手架应用 4、进阶功能 4.1、生命周期 Queryable 什么时候操作库 Queryable是一个引用类型 Queryable拷贝机制 {ISugarQueryable<Student> quer…

[Vulnhub] devt-improved slog_users+vim权限提升+nano权限提升+passwd权限提升+Lxc逃逸权限提升

信息收集 IP AddressOpening Ports192.168.101.149TCP:22,113,139,445,8080 $ nmap -p- 192.168.101.149 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | …

Python基础语法篇(上)

Python基础语法&#xff08;上&#xff09; 一、基知二、基本数据类型&#xff08;一&#xff09;标准数据类型&#xff08;二&#xff09;数据类型转换 三、字符串基本操作&#xff08;一&#xff09;字符串的索引和切片&#xff08;二&#xff09;字符串的拼接 三、运算符四、…

51单片机嵌入式开发:11、 STC89C52RC 实现一个滑动的led点阵程序

STC89C52RC 实现一个滑动的led点阵程序 1 概述2 LED点阵介绍2.1 LED概述2.2 LED点阵注意事项 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 扩展74HC595&#xff08;后续专题开展&#xff09;6 总结 第十一节 1…

MySQL篇:主从复制

概述 话不多说&#xff0c;直接上概念&#xff1a; DDL&#xff08;Data Definition Language&#xff09;语句&#xff1a; 数据定义语言&#xff0c;主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等。 DML&#xff…

Redis实战—附近商铺、用户签到、UV统计

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P88 - P95 目录 附近商铺 数据导入 功能实现 用户签到 签到功能 连续签到统计 UV统计 附近商铺 利用Redis中的GEO数据结构实现附近商铺功能&#xff0c;常见命令如下图所示。…

逻辑漏洞-支付漏洞

【实验目的】 通过本次实验&#xff0c;掌握最基础的支付漏洞 【实验环境】 win7操作机&#xff1a;10.0.0.2 centos7靶机&#xff1a;10.0.0.3 【实验步骤】 1. 启动实验环境 点击“启动场景”按钮&#xff0c;成功启动后&#xff0c;点击操作机按钮进入操作界面。 打开浏…

景区客流统计系统提升服务精准度

在当今旅游业蓬勃发展的时代&#xff0c;景区面临着越来越多的挑战和机遇。如何在保障游客良好体验的同时&#xff0c;实现景区的高效管理和可持续发展&#xff0c;成为了摆在景区管理者面前的重要课题。景区客流统计系统的出现&#xff0c;为解决这一问题提供了有力的支持&…

如何通过成熟的外发平台,实现文档安全外发管理?

文档安全外发管理是企业信息安全管理的重要组成部分&#xff0c;它涉及到企业向外发送的文件&#xff0c;需要进行严格的控制和管理&#xff0c;防止敏感或机密信息的泄露。以下是一些关键考虑因素&#xff1a; 文件外发的挑战&#xff1a;企业在文件外发时面临的主要挑战包括…

Python数据分析-植物生长数据分析(机器学习模型和神经网络模型)

一、研究背景 植物生长受多种环境因素的影响&#xff0c;包括土壤类型、日照时间、浇水频率、肥料类型、温度和湿度等。这些因素不仅影响植物的生长速度和健康状况&#xff0c;还对植物在不同生长阶段的表现有显著影响。随着气候变化和环境污染问题的加剧&#xff0c;研究如何…

【NLP实战】基于TextCNN的新闻文本分类

TextCNN文本分类在pytorch中的实现 基于TextCNN和transformers.BertTokenizer的新闻文本分类实现&#xff0c;包括训练、预测、数据加载和准确率评估。 目录 项目代码TextCNN网络结构相关模型仓库准备工作项目调参预测与评估 1.项目代码 https://github.com/NeoTse0622/Te…

数电基础 - 硬件描述语言

目录 一. 简介 二. Verilog简介和基本程序结构 三. 应用场景 四. Verilog的学习方法 五.调式方法 一. 简介 硬件描述语言&#xff08;Hardware Description Language&#xff0c;HDL&#xff09;是用于描述数字电路和系统的形式化语言。 常见的硬件描述语言包括 VHDL&…

如何落地实际场景,解决跨境传输共性需求?免费白皮书可下载

在全球化的背景下&#xff0c;海外市场对于数据驱动的产品和服务的需求不断增加&#xff0c;各行业数据跨境传输也日趋频繁&#xff0c;在这种前景下&#xff0c;越来越多的企业寻求更深度的跨国业务及合作&#xff0c;因此&#xff0c;企业数据跨境流动也成为了势不可挡的趋势…

LabVIEW异步和同步通信详细分析及比较

1. 基本原理 异步通信&#xff1a; 原理&#xff1a;异步通信&#xff08;Asynchronous Communication&#xff09;是一种数据传输方式&#xff0c;其中数据发送和接收操作在独立的时间进行&#xff0c;不需要在特定时刻对齐。发送方在任何时刻可以发送数据&#xff0c;而接收…

Internet 控制报文协议 —— ICMPv4 和 ICMPv6 详解

ICMP 是一种面向无连接的协议&#xff0c;负责传递可能需要注意的差错和控制报文&#xff0c;差错指示通信网络是否存在错误 (如目的主机无法到达、IP 路由器无法正常传输数据包等。注意&#xff0c;路由器缓冲区溢出导致的丢包不包括在 ICMP 响应范围内&#xff0c;在 TCP 负责…

[C++]——同步异步日志系统(6)

同步异步日志系统 一、日志器模块设计1.1 同步日志器模块设计1.1.1 局部日志器建造者模式设计1.1.2 同步日志器基本功能测试 1.2 异步日志器模块设计1.2.1 单缓冲区设计1.2.2 异步工作线程的设计&#xff08;双缓冲区思想&#xff09;1.2.3 异步日志器设计1.2.4 异步日志器建造…

5.串口通信

文章目录 串口的介绍TTLRS-232RS-485 分类方式串口并口同步异步 相关寄存器SCONPCONTMODSBUFIE 中断处理函数代码编写main.cdelay.cdelay.hUart.cUart.hmain.h回环 继电器ESP8266AT指令代码编写main.cdefine.cdefine.hsend.csend.hreceive.cdelay.cdelay.h 串口的介绍 UART&am…

项目发布部署:如何发布.NETCore项目到IIS服务器?

前言&#xff1a;本文将详细介绍如何发布.NET Core项目到IIS服务器。首先&#xff0c;第一步需要安装IIS&#xff0c;介绍了在本地电脑和服务器中进行安装。然后需要安装SDK和运行时才能发布.NETCore项目。其次介绍了如何发布.NETCore项目和Vue项目&#xff0c;并配置IIS。最后…

自适应键盘,自带隐藏键盘的输入框(UITextField)

引言 在iOS开发中&#xff0c;输入框占据着举足轻重的地位。与安卓不同&#xff0c;iOS输入框经常面临键盘遮挡的问题&#xff0c;或者无法方便地取消键盘。为了解决这些问题&#xff0c;有许多针对iOS键盘管理的库&#xff0c;如IQKeyboardManager、TPKeyboardAvoiding和Keyb…

数仓实践:维度建模标准规范定义

一、引言 指以维度建模作为理论基础,构建总线矩阵,划分和定义数据域、业务过程、维度、度量/原子指标、业务限定、时间周期、统计粒度、派生指标。 规范定义如下: 二、名词术语 名词解释数据域面向业务分析,将业务过程或者维度进行抽象的集合。其中,业务过程可以概括为…