暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PG系统表添加

Thornger 2021-04-12
3840


    PG的系统表添加相对而言是比较简单的,本文不会介绍理论知识。我们会从头添加一个student系统表来描述添加系统表的流程。我们的pg_student表包含两个字段(student_oid,student_name)。

  1. 查询当前系统中还没有使用的OID,在/src/include/catalog下的unused_oids 可以查看还剩哪些OID没有被使用。

  2. 添加系统表文件,因为PG的机制,BKI会读取catalog文件夹下的.h文件生成postgres.bki文件。所以系统表文件一般添加在catalog下。

  3. 添加系统表索引文件,PG的系统表查找会放进catcache中,后期利用SearchSysCache根据索引进行查询。

  4. 修改cacheinfo结构体,添加相应的信息。PG启动的时候,会读取syscache.c文件中cacheinfo结构体中的信息构建系统表缓存。

  5. 添加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查询该系统表。


文章转载自Thornger,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论