跳到主要内容

为 PostgreSQL 编写C语言拓展

学习 PostgreSQL 最终要回归到改进 PostgreSQL 上,在本章中,我们将就如何编写C语言内核拓展模块展开讨论。

PostgreSQL 模块的组织方式

在 PostgreSQL 中,模块往往被组织为单个的或是一系列的函数,并根据操作系统平台的不同,选择不同的接口来展开工作,而根据模块重要性的不同,以及对接需求的不同,内核内外的模块可以划分为如下的几个类别。

  • 为其它模块提供支持的模块
    它们往往是一些内核中的“基础设施”,起着重要的支撑作用,也不会直接面向用户开放,典型的代表就是 Cache(缓存)模块。
  • 对用户开放的内置函数模块
    它们被登记于 src/include/catalog/pg_proc.dat 文件中,面向用户提供某一类型的服务,典型的代表就是 generate_series 函数。
  • 外部C语言函数模块
    这些C语言模块的编写方法与内置函数没有本质差别,区别在于它们需要在 PostgreSQL 运行的时候,才能够以动态方式加载进入(内置函数将会在编译的时候,以静态方式加载进入)。
  • 外部其它语言函数模块
    这些模块同样以动态方式加载进入,但是无法调用任何的内核组件,它们不在我们的讨论范畴之中。

C语言拓展模块的组织方式

站在内核的角度来看,因为拓展模块往往以动态链接库(实质便是被打包起来的一组函数)的形式存在,因此C语言模块往往需要按照如下的形式,来进行组织。

  • 对模块本身的描述
    这一类文件被称为“控制文件”,以“.control”后缀收尾,它们用于描述拓展本身的信息,比如插件的名称,作者,描述,版本号等。
  • 对模块导出函数的描述文件
    它们是一组 SQL 文件,又被称为“安装文件”,通过 CREATE FUNCTION 等语句,完成C语言接口函数的登记。
  • 实现模块的源文件
    它们用于实现整个C语言模块,具体的内容与组织方式由程序员决定。

C语言拓展模块的加载流程

process

参考材料