.h 文件(如 pg_force_view.h)服务于编译时的 C 语言环境。它的核心作用是:
-
定义内存布局 (
struct): 它定义了当 PostgreSQL 后端进程从磁盘读取一行数据到内存后,这行数据在内存中应该如何组织。struct FormData_pg_force_view就是这个内存布局的精确描述,它告诉 C 编译器每个字段是什么类型(Oid,char,text*)以及它们的顺序。 -
提供类型安全: 定义了
Form_pg_force_view这个指针类型,让 C 代码在访问表数据时有类型检查,增加了代码的健壮性。 -
声明常量和 OID: 它通过宏(
#define)和CATALOG宏参数,向 C 语言代码暴露了这张表、它的索引、以及列的 OID。这使得 C 代码可以通过这些易于理解的常量名(如ForceViewRelationId)来引用它们,而不是硬编码数字。
简而言之,.h 文件是 PostgreSQL 后端程序(postgres)在运行时理解和操作这个表的数据结构的基础
- .dat 文件:
.dat 文件(如 pg_force_view.dat)主要服务于 PostgreSQL 的构建和初始化 (initdb) 过程。它的核心作用是:
-
定义 SQL 和物理结构: 它用一种元数据格式描述了这张表在数据库中的“SQL 层面”的属性。它定义了列的 SQL 名称(
fvoid,ident_case)、SQL 数据类型(通过atttypid间接定义)、约束(如attnotnull)等。 -
指挥
initdb: 构建脚本genbki.pl会读取.dat文件,并生成一个.bki文件。initdb在引导模式下执行这个.bki文件里的指令,从而在数据库物理文件中真正地CREATE TABLE,并创建索引。 -
提供初始数据 (如果是数据文件): 对于像
pg_class.dat这样的文件,它还提供了必须在数据库创建之初就存在的初始行。 -
自动化生成代码: 它的
MAKE_SYSCACHE宏会触发genbki.pl自动生成 C 代码(更新syscache.h和syscache.c),将 SQL 世界的索引与 C 语言世界的缓存机制关联起来。
简而言之,.dat 文件是创建数据库集群时,用来在磁盘上构建这张表的物理和逻辑结构的指令集。没有它,initdb 就不知道要创建这样一张表。
特性
.h 文件 (头文件)
.dat 文件
服务对象
C 编译器、PostgreSQL 后端进程
genbki.pl 脚本、initdb 命令
描述层面
内存中的数据结构 (C struct)
磁盘上的表结构 (SQL Schema)
生命周期
编译时 (Compile-time)
构建与初始化时 (Build/Init-time)
核心内容
C 类型定义、常量、OID 声明
表/列属性、索引、初始数据、Syscache 定义
最终产物
被编译进 postgres 可执行文件
驱动 initdb 创建物理表,并触发 C 代码生成
简单说
程序怎么“用”这个表
数据库怎么“建”这个表