Postgresql 中文操作指南

Chapter 75. System Catalog Declarations and Initial Contents

Table of Contents

PostgreSQL 使用许多不同的系统目录来跟踪数据库对象(如表和函数)的存在和属性。实际上,系统目录与普通用户表没有区别,但后端 C 代码知道每个目录的结构和属性,并且可以在较低级别直接操作它。因此,例如,我们不建议在实际操作中尝试更改目录的结构;这会打破 C 代码中关于目录行布局方式的内置假设。但是,不同版本之间的目录结构可能会发生变化。

目录的结构在源树的 src/include/catalog/ 目录中用特定格式的 C 标头文件声明。对于每个目录,有一个以目录命名的标头文件(例如, pg_classpg_class.h ),该文件定义了目录具有的列集,以及一些其他基本属性,如其 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 目录的 pg_class_d.h 。此文件包含自动生成的宏定义,并且可能包含其他可用于读取特定目录的客户端 C 代码的宏、枚举声明等。

大多数 PostgreSQL 开发人员无需直接关注 BKI 文件,但是后端的几乎所有非琐碎功能添加都会要求修改目录头文件和/或初始数据文件。本章的其余部分将提供一些相关信息,并为了完整性而描述 BKI 文件格式。