CREATE [ PROCEDURAL ] LANGUAGE name CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name HANDLER call_handler [ VALIDATOR valfunction ]
PostgreSQLユーザは、CREATE LANGUAGEを使って新しい手続き言語をPostgreSQLデータベースに登録することができます。 これにより、関数とトリガプロシージャを新しい言語で定義できるようになります。
CREATE LANGUAGEは、言語名とその言語で作成された関数の実行に責任を持つ呼び出しハンドラを、効率的に関連付けます。 言語呼び出しハンドラについての詳細は、第37章を参照してください。
CREATE LANGUAGEコマンドには2種類の形式があります。 最初の形式は、ユーザは必要な言語の名前のみを単に指定するものです。 この場合、PostgreSQLサーバはpg_pltemplateシステムカタログを参照し、正しいパラメータを決定します。 2番目の形式では、ユーザは言語名の他に言語のパラメータも入力します。 この形式で、pg_pltemplateで定義されていない言語を作成することができますが、この手法は廃棄予定です。
指定された言語名に対応するpg_pltemplateカタログの項目をサーバが見つけると、コマンドに言語のパラメータが含まれていたとしてもカタログのデータを使用します。 この動作により、古すぎる言語のサポート関数に関する情報を含む、古いダンプファイルからの読み込みが簡単になります。
通常、新しい言語を登録するには、ユーザはPostgreSQLのスーパーユーザ権限を持たなければなりません。 しかし、言語がpg_pltemplateカタログ内に記載され、データベース所有者による作成可能印(tmpldbacreateが真)が付いていれば、データベース所有者はそのデータベース内に新しい言語を登録することができます。 デフォルトで、信頼された言語はデータベース所有者による作成ができます。 しかし、これはスーパーユーザによるpg_pltemplateの変更により調整できます。 言語作成者が言語の所有者になり、後で削除したり、名前を変えたり、別の所有者を割り当てたりすることができます。
TRUSTEDは、その言語の呼び出しハンドラが安全であることを指定します。 安全であるとは、権限を持たないユーザにはアクセス制限を無視する機能を一切与えないということです。 言語の登録時にこのキーワードを省略すると、PostgreSQLのスーパーユーザ権限を持つユーザのみが、この言語を使って新しい関数を作れるようになります。
これはノイズワードです。
新しい手続き言語の名前です。 言語名は大文字/小文字の区別がありません。 この名前はデータベースの言語の中で一意でなければなりません。
後方互換を保持するため、この名前を単一引用符で囲むこともできます。
call_handlerは手続き言語の関数を実行するために呼び出される関数の名前で、事前に登録しておく必要があります。 このハンドラは、Version-1呼び出し規約に則って、C言語のようなコンパイル言語で書かれている必要があります。また、引数を取らずlanguage_handler型を返す関数として、PostgreSQLに登録されていなければなりません。 language_handler型は、単に関数を呼び出しハンドラとして識別するのに使用するプレースホルダ型です。
valfunctionは、事前に登録された検証用関数の名前です。新しい関数が当該言語で作成された場合、その関数を検証するために呼び出されます。 検証用関数が指定されていない場合、新しい関数は作成時にチェックされません。 検証用関数は、oid型の引数を1つ取る必要があります。 この引数は作成される関数のOIDになります。 また、通常void型を返します。
検証用関数は、通常、関数本体が構文上正しいかどうかを検査するために使用されます。
しかし、それだけでなく、関数のプロパティも検査可能です。例えば、その言語が処理できない特定のデータ型が引数に含まれていないかなどがチェックできます。
エラーを通知するには、検証用関数でereport()
関数を使用すべきです。
関数の戻り値は無視されます。
サーバが指定した言語名に対応するpg_pltemplateの項目を見つけた場合、TRUSTEDオプションとサポート関数名は無視されます。
createlangはCREATE LANGUAGEに対する簡単なラッパプログラムです。 これを使用して簡単にシェルコマンドラインから手続き言語をインストールすることができます。
手続き言語を削除するには、DROP LANGUAGE、またはdroplangを使用してください(後者を勧めます)。
システムカタログpg_language
( 項44.22参照)には、現在インストールされている言語に関する情報が記録されています。
また、createlangにはインストールされた言語を列挙するオプションがあります。
手続き言語で関数を作成するには、ユーザはその言語に対するUSAGE権限を持たなければなりません。 デフォルトでは、信頼された言語のUSAGEはPUBLICに(つまり全員に)付与されています。 これは必要に応じて取り除くことができます。
手続き言語は各データベースに局所的です。 しかし、言語をtemplate1データベースにインストールすることができます。 この場合、その後に作成されたすべてのデータベースで自動的にその言語は使用できるようになります。
呼び出しハンドラ関数と検証関数(もしあれば)は、サーバがpg_pltemplate内にその言語に関する項目を持っていない場合には、存在しなければなりません。 しかし、その項目があったとしても、関数がすでに存在しているとは限りません。 データベース内に存在していなければ自動的に定義されます。 (言語を実装する共有ライブラリがインストレーションで利用できない場合、これによりCREATE LANGUAGEが失敗する可能性があります。)
PostgreSQL 7.3より前のバージョンでは、ハンドラ関数が返すプレースホルダ型をlanguage_handler型ではなくopaque型と宣言する必要がありました。 古いダンプファイルのロードをサポートするために、CREATE LANGUAGEはopaque型を返すと宣言された関数を受け入れます。 しかし、注意を促すメッセージを表示し、宣言された関数の戻り値型をlanguage_handlerに変換します。