*.bki
バックエンドインタフェイス (BKI) ファイルは、既に存在するデータベースシステムなしでデータベース関数を実行することができる特別なブートストラップ(bootstrap)モードで走っているバックエンドへの入力となるスクリプトです。ですから、BKI ファイルは一番最初にデータベースシステムを作る時に使われます。
initdbは BKI ファイルを単にデータベースシステムの作成に使うのみです。しかし、initdbの BKI ファイルが内部的に生成されたものです。global1.bki.source と local1.template1.bki.source のファイルをを使って生成されたもので、Postgres のライブラリディレクトリにあります。Postgres のインストールの一部としてそこにインストールされています。これら .source ファイルは Postgres の組み立てプロセスの一部として組み立てられます。genbkiという組み立てプログラムが呼び出されています。genbki は入力として Postgres のソースファイルを取って、そうした表を記述する表と Cのヘッダファイルを組み立てます。
Postgres のバックエンドは BKI ファイルを下のように処理します。もし global1.bki.source ファイルが手もとに例としてあるなら、この記述は容易に理解できるでしょう。(上で述べたように、この .source ファイルは厳密には BKI ファイルではありませんが、結果としての BKI ファイルがどのようなものであるかを推測することはできるでしょう)
コマンドはコマンド名とそれに続く空白で区切られた引数とから構成されています。コマンドへの引数で "$" で始まるものは特別に扱われます。もし "$$" が最初の 2文字なら、最初の "$" は無視され、それから引数は通常通りに処理されます。もし "$" のすぐ後がスペースなら、 NULL 値として扱われます。そうでなければ、"$" に続く文字は引数がマクロの値と置き換えられるようにするマクロ名です。このマクロが定義されていないとエラーとなります。
マクロは
define macro マクロ名 = マクロ値
で定義して、
undefine macro マクロ名
で定義を取り除いて、定義の時と同じ文法で再定義します。
一般的なコマンドとマクロコマンドは次のようになります。
classnameというクラスを後の操作のためにオープンします。
classnameというオープンしたクラスをクローズします。もしclassnameが既にオープンされた状態でなければエラーとなります。もしclassnameが与えられなければ、現在オープンされているクラスが閉じられます。
現在オープンされているクラスを出力します。
value1 、value2などをその属性値として、またoid_valueをその OID として使い、オープンしているクラスに新しいインスタンスを挿入します。もしoid_valueが"0"でなければ、この値がそのインスタンスのオブジェクト識別子となります。そうでなければ、エラーとなります。
上記と同様ですが、システムが一意なオブジェクト識別子を生成します。
括弧内に与えられた属性でclassnameというクラスを作ります。
classnameというクラスを書き込みのためにオープンしますが、システムカタログに現存するものは記録しません。(これは主にブートストラップの手助けとするためのものです。)
classnameというクラスを削除します。
( opclass attr | function({attr}) )
classnameというクラスにindex_nameというインデックスをamnameアクセスメソッドを用いて作ります。インデックスのフィールドはname1 、name2などで、collection_1 、collection_2などがそれぞれの演算子の集合となります。
Cのような形式で宣言された引数argsでfunction_nameを実行した結果の型rettypeを持つmacro_nameという名前の関数への関数のプロトタイプを定義します。
filenameというファイルから読まれるmacnameという名前のマクロを定義します。
つぎのコマンド群は、421のオブジェクトとしてint_opsのコレクションを含む"pg_opclass"クラスを生成し、クラスを出力して、クローズします。
create pg_opclass (opcname=char16)
open pg_opclass
insert oid=421 (int_ops)
print
close pg_opclass