目次
PostgreSQLは、テーブルや関数のようなデータベースオブジェクトの存在の有無と特性を追跡するために、多くの異なるシステムカタログを使用します。 物理的な観点ではシステムカタログとユーザーテーブルの間に違いはありませんが、バックエンドのCコードはそれぞれのカタログの構造と特性を把握しており、直接カタログを低レベルで操作することができます。 ですから、たとえばカタログの構造を思いつきで変更しようとするのはおすすめできません。そのことによって、Cのコードに組み込まれているカタログの行のレイアウトに関する前提を壊してしまうことになるからです。 とはいえ、カタログの構造はメジャーバージョン間で変更されることがあります。
カタログの構造は、ソースツリーのsrc/include/catalog/
ディレクトリの中の特殊な形式のCヘッダファイルに宣言されています。
個々のカタログに対応して、カタログと同じ名前のヘッダファイルが存在し(たとえば、pg_class
に対してpg_class.h
というように)、カタログが持つ一連の列やOIDのような基本的な特性を定義しています。
SQLコマンドを実行可能な状態にまでシステムを持っていくために、多くのカタログはinitdbの「bootstrap」フェーズで読み込まなければならない初期データを持っています。
(たとえば、pg_class.h
は、他のシステムカタログとインデックス同様、自分自身のエントリを含んでいなければなりません。)
この初期データも、src/include/catalog/
ディレクトリに格納されているデータファイル中に編集可能な形式で保存されています。
たとえば、pg_proc.dat
は、pg_proc
カタログに挿入されるべき初期の行を記述しています。
カタログファイルを作り初期データをそこにロードするために、ブートストラップモードで実行中のバックエンドは、コマンドと初期データを含むBKI(Backend Interface: バックエンドインタフェース)ファイルを読み込みます。
このモードで使用されるpostgres.bki
は、genbki.pl
というPerlスクリプトを使って、PostgreSQLディストリビューションを構築する過程で前述のヘッダーとデータファイルから作成されます。
postgres.bki
はPostgreSQLの特定のリリースに固有のものですが、プラットフォームからは独立しており、インストレーションツリーのshare
サブディレクトリにインストールされます。
genbki.pl
は、他にも各々のカタログで使用する、たとえばpg_class
のためのpg_class_d.h
のような派生ファイルを生成します。
このファイルには自動生成されたマクロ定義が含まれているほか、他のマクロとenum宣言も含まれており、特定のカタログを読み込むクライアントCコードに役立ちます。
ほとんどのPostgreSQL開発者は直接BKIファイルのことを気にかける必要はありませんが、バックエンドに些細ではない機能を追加する際にはカタログヘッダファイル、あるいはまた初期データファイルの変更が必要になるでしょう。 この章の残りの部分でそれについての情報をお届けします。 また網羅性のために、BKIファイルのフォーマットも説明します。