PG的系统表添加相对而言是比较简单的,本文不会介绍理论知识。我们会从头添加一个student系统表来描述添加系统表的流程。我们的pg_student表包含两个字段(student_oid,student_name)。
查询当前系统中还没有使用的OID,在/src/include/catalog下的unused_oids 可以查看还剩哪些OID没有被使用。
添加系统表文件,因为PG的机制,BKI会读取catalog文件夹下的.h文件生成postgres.bki文件。所以系统表文件一般添加在catalog下。
添加系统表索引文件,PG的系统表查找会放进catcache中,后期利用SearchSysCache根据索引进行查询。
修改cacheinfo结构体,添加相应的信息。PG启动的时候,会读取syscache.c文件中cacheinfo结构体中的信息构建系统表缓存。
添加Makefile文件,将新添加的系统表头文件添加进去。
教程:
1、检查剩余的OID信息,因为系统表至少需要占用一个OID(有兴趣的可以查看genbki.h),我们运行./unused_oids 脚本。

2、加系统表文件对应的头文件,我们在/src/include/catalog下添加一个头文件"student.h",并且在student.h中添加必要的信息。添加信息时要遵从PG的机制。例如:要包含"genbki.h",同时要使用CATALOG宏来定义系统表信息,而且需要包含"catalog/genbki.h"。

"pg_student" 表示将要添加的系统表的名称
4997表示表的OID信息,该信息我们用宏"StudentId"表示。
这里的4977表示上面没有使用的OID号。
添加我们需要的两列:Oid类型的"student_oid"列和"student_name"列
添加必要的宏定义,这些定义主要是为了后期编码方便。例如:StudentId、Natts_student_Number、Anum_student_name、Anum_student_name。
3、添加索引文件,修改indexing.h添加该系统表的索引信息。我们例子中添加的是唯一索引:
"pg_student_index" 表示索引的名字
4998表示索引的OID
后面跟普通表创建索引,student_oid表示表的列,oid_ops表示该列为OID类型。
4、在syscache.h中的 SysCacheIdentifier添加添加缓存标识符信息。
注意:SysCacheIdentifier中的标识符是按照字符编码顺序排列的,把你的标识符添加到合适的位置。
5、在syscache.c的cacheinfo结构体中添加对应的描述符结构。

其中"StudentId"表示需要缓存的系统表,对应上文中的系统表中的宏定义Oid信息。
TestStudentIndex表示缓存中需要使用索引信息,对应第二部分索引的OID信息
表示索引的所使用的的列的个数。
"Anum_student_oid"表示索引所使用的系统表的列位置,表示系统表的第一个列的位置。
8表示所使用的hash桶信息。系统启动时初始的hash桶个数。
6、修改Makefile信息,对应\src\backend\catalog中的Makefile。添加新添加的系统表头文件

这样的话,系统表就添加完成了。
我们编译安装后查询系统表

可以看到我们用\d查询看到我们系统中没有创建普通表,但是我们可以使用select查询该系统表。




