目录
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 发行版时,从上述头文件和数据文件准备而来的。尽管它特定于特定的 PostgreSQL 版本,但 postgres.bki
是平台无关的,并且安装在安装树的 share
子目录中。
genbki.pl
还为每个目录生成一个派生的头文件,例如,用于 pg_class
目录的 pg_class_d.h
。 此文件包含自动生成的宏定义,并且可能包含其他宏、枚举声明等等,这些宏、枚举声明对于读取特定目录的客户端 C 代码可能很有用。
大多数 PostgreSQL 开发人员不需要直接关心BKI文件,但是后端中几乎任何重要的功能添加都需要修改目录头文件和/或初始数据文件。 本章的其余部分提供了一些相关信息,并为了完整起见描述了BKI文件格式。
如果您在文档中发现任何不正确的内容,与您使用特定功能的体验不符,或者需要进一步澄清,请使用此表单报告文档问题。