Table of Contents
PostgreSQL 使用许多不同的系统目录来跟踪 数据库对象(例如表和函数)的存在与属性。 物理上系统目录与普通用户表没有区别,但后端 C 代码了解每个目录的结构和 属性,能够在低层级直接操纵它。 因此,例如试图即时修改目录的结构是不可取的;那会破坏 C 代码中内建的 关于目录行如何排布的假设。 不过,目录的结构可以在大版本之间变化。
目录的结构在源码树的
src/include/catalog/ 目录中经过特殊格式化的
C 头文件里声明。
对于每个目录都有一个以该目录命名的头文件
(例如 pg_class 对应
pg_class.h),它定义了该目录拥有的列的集合,
以及一些其他基本属性,例如它的 OID。
许多目录拥有必须在 initdb
的 “bootstrap”(引导)阶段
载入的初始数据,以便让系统达到能够执行 SQL 命令的状态。
(例如,pg_class.h 必须包含它自己以及每个其他
系统目录和索引的条目。)
这些初始数据以可编辑的形式保存在同样位于
src/include/catalog/ 目录中的数据文件里。
例如,pg_proc.dat 描述了必须插入
pg_proc 目录的全部初始行。
为了创建目录文件并把初始数据载入其中,一个以 bootstrap 模式运行的后端
会读取一个包含命令和初始数据的
BKI(Backend Interface,后端接口)文件。
这种模式下使用的 postgres.bki 文件
是在构建 PostgreSQL 发行版时,由名为
genbki.pl 的 Perl 脚本从前述的头文件和数据文件
准备出来的。
postgres.bki 虽然特定于某个
PostgreSQL 发布版本,但它是平台无关的,
会被安装到安装树的 share 子目录中。
genbki.pl 还会为每个目录生成一个派生头文件,例如
pg_class 目录对应的
pg_class_d.h。
这个文件包含自动生成的宏定义,也可能包含其他宏、枚举声明等对读取
特定目录的客户端 C 代码有用的内容。
大多数 PostgreSQL 开发者不需要直接关注 BKI 文件,但后端中几乎所有非平凡的特性增加都需要 修改目录头文件和/或初始数据文件。 本章其余部分提供这方面的一些信息,并且为了完整性而描述 BKI 文件格式。