他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

第69章 システムカタログの宣言と初期内容

目次

69.1. システムカタログの宣言ルール
69.2. システムカタログ初期データ
69.2.1. データファイル形式
69.2.2. OIDの割当
69.2.3. OID参照検索
69.2.4. データファイルの編集方法
69.3. BKIファイル形式
69.4. BKIコマンド
69.5. BKIファイルのブートストラップの構成
69.6. BKIの例

PostgreSQLは、テーブルや関数のようなデータベースオブジェクトの存在の有無と特性を追跡するために、多くの異なるシステムカタログを使用します。 物理的な観点ではシステムカタログとユーザーテーブルの間に違いはありませんが、バックエンドのCコードはそれぞれのカタログの構造と特性を把握しており、直接カタログを低レベルで操作することができます。 ですから、たとえばカタログの構造を思いつきで変更しようとするのはおすすめできません。そのことによって、Cのコードに組み込まれているカタログの行のレイアウトに関する前提を壊してしまうことになるからです。 とはいえ、カタログの構造はメジャーバージョン間で変更されることがあります。

カタログの構造は、ソースツリーのsrc/include/catalog/ディレクトリの中の特殊な形式のCヘッダーファイルに宣言されています。 とりわけ、個々のカタログに対応して、カタログと同じ名前のヘッダーファイルが存在し(たとえば、pg_classに対してpg_class.hというように)、カタログが持つ一連のカラムやOIDのような基本的な特性を定義しています。 そのほか、カタログ構造を定義している重要なファイルとしては、すべてのシステムカタログに存在するインデックスの構造を定義するindexing.hや、カタログによっては必要としているTOASTテーブルの構造を定義するtoasting.hなどがあります。

SQLコマンドを実行可能な状態にまでシステムを持っていくために、多くのカタログはinitdbbootstrapフェーズで読み込まなければならない初期データを持っています。 (たとえば、pg_class.hは、他のシステムカタログとインデックス同様、自分自身のエントリを含んでいなければなりません。) この初期データも、src/include/catalog/ディレクトリに格納されているデータファイル中に編集可能な形式で保存されています。 たとえば、pg_proc.datは、pg_procカタログに挿入されるべき初期の行を記述しています。

カタログファイルを作り初期データをそこにロードするために、ブートストラップモードで実行中のバックエンドは、コマンドと初期データを含むBKI(Backend Interface: バックエンドインタフェース)ファイルを読み込みます。 このモードで使用されるpostgres.bkiは、genbki.plというPerlスクリプトを使って、PostgreSQLディストリビューションを構築する過程で前述のヘッダーとデータファイルから作成されます。 postgres.bkiPostgreSQLの特定のリリースに固有のものですが、プラットフォームからは独立しており、インストレーションツリーのshareサブディレクトリにインストールされます。

genbki.plは、他にも各々のカタログで使用する、たとえばpg_classのためのpg_class_d.hのような派生ファイルを生成します。 このファイルには自動生成されたマクロ定義が含まれているほか、他のマクロとenum宣言も含まれており、特定のカタログを読み込むクライアントCコードに役立ちます。

ほとんどのPostgres開発者は直接BKIファイルのことを気にかける必要はありませんが、バックエンドに些細ではない機能を追加する際にはカタログヘッダーファイル、あるいはまた初期データファイルの変更が必要になるでしょう。 この章の残りの部分でそれについての情報をお届けします。 また網羅性のために、BKIファイルのフォーマットも説明します。