PostgreSQL 添加系统表
本文将介绍如何在 PostgreSQL 中创建一个新的系统表。PostgreSQL 将系统表都存放在 src/include/catalog
目录下,如下图所示:
从目录结构来看,我们大概可以猜测到 PostgreSQL 将系统表的定义和数据分别存放在两个不同的文件中,例如,系统表 pg_class
,其表结构定义在 pg_class.h
文件中,而数据则在 pg_class.dat
文件中。此外每个表都在数据库内部都有一个唯一的 OID 来作为标识。PostgreSQL 提供了脚本来检查未使用的 OID 以及是否包含重复的 OID,它们分别为 unused_oids
和 duplicate_oids
。所有的系统表都将由 src/backend/catalog/Catalog.pm
进行处理,该文件负责将系统表文件转换为 Perl 数据结构。
在了解了 PostgreSQL 关于系统表的基本概念之后,我们尝试添加一个自己的系统表 pg_play
。
系统表头文件
正如我们上面看到的,我们需要在 src/include/catalog
目录下新建一个 pg_play.h
的头文件,其内容如下:
1 | /*------------------------------------------------------------------------- |
每个系统表头文件都应该包含 catalog/genbki.h
头文件,该文件中定义了 CATALOG
, BKI_BOOTSTRAP
等相关的宏。其中 CATALOG
宏的作用就是定义一个结构体变量,它的定义如下:
1 |
而 catalog/pg_class_d.h
文件则是编译时由 src/backend/catalog/genbki.pl
生成的一个头文件,该文件中包含了系统表属性列的编号定义。例如,pg_play
系统表生成的内容如下:
1 | /*------------------------------------------------------------------------- |
系统表编译配置
如上所述,我们添加了系统表定义,现在我们要做的就是将其添加到编译环境中,从而使得 PostgreSQL 在编译时可以去处理我们定义的 pg_play
系统表。在 src/backend/catalog/Makefile
文件中有一个 CATALOG_HEADERS
目标,如下所示:
1 | CATALOG_HEADERS := \ |
我们在末尾我们新建的 pg_play
系统表头文件。现在,我们在重新编译、安装并初始化数据库即可看到我们新建的 pg_play
系统表。如下图所示:
默认元组添加
如果我们需要想 pg_play
系统表中添加一些默认元组,我们可以创建一个 pg_play.dat
的文件,其内容如下:
1 | #---------------------------------------------------------------------- |
然后需要在 src/backend/catalog/Makefile
文件的 POSTGRES_BKI_DATA
目标中添加 pg_play.dat
。最后重新编译、安装并初始化数据库即可。
备注
- 该方法适合于 PostgreSQL 11 以及后续版本,PostgreSQL 10 及之前的版本可能存在略微差异,但大致相同。