Skip to content

第 75 章. 系统目录声明和初始内容

目录

75.1. 系统目录声明规则
75.2. 系统目录初始数据
75.2.1. 数据文件格式
75.2.2. OID 分配
75.2.3. OID 引用查找
75.2.4. 自动创建数组类型
75.2.5. 编辑数据文件的秘诀
75.3. 文件格式
75.4. 命令
75.5. 引导 文件的结构
75.6. BKI 示例

PostgreSQL使用许多不同的系统目录来跟踪数据库对象(例如表和函数)的存在和属性。从物理上看,系统目录和普通用户表之间没有区别,但后端 C 代码了解每个目录的结构和属性,并且可以在底层直接操作它。因此,例如,不建议尝试动态更改目录的结构;这会破坏 C 代码中关于目录行如何布局的假设。但是,目录的结构可以在主要版本之间发生变化。

目录的结构在源树的src/include/catalog/目录中以特殊格式的 C 头文件声明。对于每个目录,都有一个以目录命名的头文件(例如,pg_class.h对应于pg_class),它定义了目录具有的列集,以及一些其他基本属性,例如其 OID。

许多目录都具有初始数据,必须在initdb的“引导”阶段将这些数据加载到其中,以使系统达到能够执行 SQL 命令的程度。(例如,pg_class.h必须包含一个自己的条目,以及一个用于每个其他系统目录和索引的条目。)此初始数据以可编辑形式保存在数据文件中,这些文件也存储在src/include/catalog/目录中。例如,pg_proc.dat描述必须插入到pg_proc目录中的所有初始行。

为了创建目录文件并将此初始数据加载到其中,以引导模式运行的后端会读取包含命令和初始数据的BKI(后端接口)文件。在此模式下使用的postgres.bki文件是通过一个名为genbki.pl的 Perl 脚本从上述标头和数据文件中准备的,同时构建PostgreSQL发行版。尽管postgres.bki特定于某个PostgreSQL版本,但它与平台无关,并且安装在安装树的share子目录中。

genbki.pl还为每个目录生成一个派生标头文件,例如pg_class_d.h用于pg_class目录。此文件包含自动生成的宏定义,并且可能包含其他宏、枚举声明等,这些宏、枚举声明等可用于读取特定目录的客户端 C 代码。

大多数 PostgreSQL 开发人员不必直接关注BKI文件,但后端中几乎任何非平凡的功能添加都需要修改目录标头文件和/或初始数据文件。本章的其余部分提供了一些相关信息,并完整描述了BKI文件格式。