本章之前已经讲明白了我们的postgres如何进行编译安装,这是很重要的一步,接下来就是学会对postgres进行小的改动,然后保证依然能够顺利编译安装运行!
本章续讲内容如何创建一个内置函数。
1、内置函数和用户自定义函数的区别
熟悉数据库的大家都知道,我们在登录数据库之后也能使用create function语句创建函数,那我们这里的内置函数有什么区别呢?
- 内置函数和用户自定义函数的执行权限不同。内置函数默认执行权限为所有用户都能执行,而用户自定义函数默认只有创建的它的用户才能执行,但是支持使用grant语句进行权限的赋予。
- 内置函数和用户自定义函数的可见性不同。内置函数在所有实例下的所有数据库都可以使用,而用户自定义只能在创建的数据库下可见,如果想要在其他数据库也能使用,则需要重新另外创建。
- 内置函数和用户自定义函数的可维护程度不同。内置函数如果需要修改和删除必须修改内核代码然后重新编译安装才能生效,而用户自定义函数可以直接使用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内置函数添加成功!
下一期更新如何新增一个拓展函数 !