CREATE LANGUAGE — 新しい手続き言語を定義する
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGEnameCREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnameHANDLERcall_handler[ INLINEinline_handler] [ VALIDATORvalfunction]
CREATE LANGUAGEは新しい手続き言語をPostgreSQLデータベースに登録します。
この後で、関数とプロシージャをその新しい言語で定義できるようになります。
PostgreSQL 9.1から、ほとんどの手続き言語は「拡張」としてまとめられました。
したがってCREATE LANGUAGEではなくCREATE EXTENSIONを使用してインストールすべきです。
CREATE LANGUAGEを直接使用することは拡張インストール用スクリプトに限定されなければなりません。
おそらくアップグレードの結果「むきだしの」言語がデータベース内に存在する場合、CREATE EXTENSION を用いて拡張に変換することができます。
langname FROM unpackaged
CREATE LANGUAGEは、言語名とその言語で作成された関数の実行に責任を持つハンドラ関数を関連付けます。
言語ハンドラについての詳細は、第56章を参照してください。
CREATE LANGUAGEコマンドには2種類の構文があります。
最初の構文は、ユーザは必要な言語の名前のみを単に指定するものです。
この場合、PostgreSQLサーバはpg_pltemplateシステムカタログを参照し、正しいパラメータを決定します。
2番目の構文では、ユーザは言語名の他に言語のパラメータも入力します。
この形式で、pg_pltemplateで定義されていない言語を作成することができますが、この手法は廃棄予定です。
指定された言語名に対応するpg_pltemplateカタログの項目をサーバが見つけると、コマンドに言語のパラメータが含まれていたとしてもカタログのデータを使用します。
この動作により、言語のサポート関数に関する古すぎる情報を含む、古いダンプファイルからの読み込みが簡単になります。
通常、新しい言語を登録するには、ユーザはPostgreSQLのスーパーユーザ権限を持たなければなりません。
しかし、言語がpg_pltemplateカタログ内に記載され、データベース所有者による作成可能印(tmpldbacreateが真)が付いていれば、データベース所有者はそのデータベース内に新しい言語を登録することができます。
デフォルトで、信頼された言語はデータベース所有者による作成ができます。
しかし、これはスーパーユーザによるpg_pltemplateの変更により調整できます。
言語作成者が言語の所有者になり、後で削除したり、名前を変えたり、別の所有者を割り当てたりすることができます。
CREATE OR REPLACE LANGUAGEは新しい言語を作成、または、既存の定義を置き換えます。
言語がすでに存在する場合、パラメータは指定された値またはpg_pltemplateから取り出された値にしたがって更新されますが、言語の所有権と権限に関する設定は変更されません。
また、その言語で作成された既存の関数も依然として有効であるものとみなされます。
言語を作成する際に通常要求される権限に加え、ユーザはスーパーユーザまたは既存言語の所有者でなければなりません。
REPLACEの場合、主に言語が存在することを確認するために使用することを意味します。
その言語がpg_pltemplate項目を持つ場合、REPLACEは既存の定義を実際にはまったく変更しません。
ただし、言語が作成された後でpg_pltemplate項目が変更されたという通常ではない場合は例外です。
TRUSTEDTRUSTEDは、他の方法ではユーザがアクセスできないデータに対しては、その言語でのアクセスが許されないことを指定します。
言語の登録時にこのキーワードを省略すると、PostgreSQLのスーパーユーザ権限を持つユーザのみが、この言語を使って新しい関数を作れるようになります。
PROCEDURALこれには意味はありません。
name新しい手続き言語の名前です。 この名前はデータベースの言語の中で一意でなければなりません。
後方互換を保持するため、この名前を単一引用符で囲むこともできます。
HANDLER call_handlercall_handlerは手続き言語の関数を実行するために呼び出される関数の名前で、事前に登録しておく必要があります。
このハンドラは、Version-1呼び出し規約に則って、C言語のようなコンパイル言語で書かれている必要があります。また、引数を取らずlanguage_handler型を返す関数として、PostgreSQLに登録されていなければなりません。
language_handler型は、単に関数を呼び出しハンドラとして識別するのに使用するプレースホルダ型です。
INLINE inline_handlerinline_handlerはこの言語で無名コードブロックを実行(DOコマンド)するために呼び出される、事前に登録された関数の名前です。
inline_handler関数が指定されない場合、その言語では無名コードブロックをサポートしません。
このハンドラ関数は、DOコマンドの内部表現となるinternal型の引数を1つ取らなければならず、また、通常voidを返します。
ハンドラの戻り値は無視されます。
VALIDATOR valfunctionvalfunctionは、事前に登録された検証用関数の名前です。新しい関数が当該言語で作成された場合、その関数を検証するために呼び出されます。
検証用関数が指定されていない場合、新しい関数は作成時にチェックされません。
検証用関数は、oid型の引数を1つ取る必要があります。
この引数は作成される関数のOIDになります。
また、通常void型を返します。
検証用関数は、通常、関数本体が構文上正しいかどうかを検査するために使用されます。
しかし、それだけでなく、関数のプロパティも検査可能です。例えば、その言語が処理できない特定のデータ型が引数に含まれていないかなどがチェックできます。
エラーを通知するには、検証用関数でereport()関数を使用すべきです。
関数の戻り値は無視されます。
指定した言語名に対応するpg_pltemplateの項目がサーバにある場合、TRUSTEDオプションとサポート関数名は無視されます。
手続き言語を削除するにはDROP LANGUAGEを使用してください。
システムカタログpg_language( 52.29参照)には、現在インストールされている言語に関する情報が記録されています。
またpsqlのコマンド\dLはインストールされた言語を一覧表示します。
手続き言語で関数を作成するには、ユーザはその言語に対するUSAGE権限を持たなければなりません。
デフォルトでは、信頼された言語についてはPUBLICに(つまり全員に)USAGEが付与されています。
これは必要に応じて取り消すことができます。
手続き言語は各データベースに局所的です。
しかし、言語をtemplate1データベースにインストールすることができます。
この場合、その後に作成されたすべてのデータベースで自動的にその言語は使用できるようになります。
呼び出しハンドラ関数とインラインハンドラ関数(もしあれば)、検証関数(もしあれば)は、サーバがpg_pltemplate内にその言語に関する項目を持っていない場合には、存在しなければなりません。
しかし、その項目があったとしても、関数がすでに存在しているとは限りません。
データベース内に存在していなければ自動的に定義されます。
(言語を実装する共有ライブラリがインストレーションで利用できない場合、これによりCREATE LANGUAGEが失敗する可能性があります。)
PostgreSQL 7.3より前のバージョンでは、ハンドラ関数が返すプレースホルダ型をlanguage_handler型ではなくopaque型と宣言する必要がありました。
古いダンプファイルのロードをサポートするために、CREATE LANGUAGEはopaque型を返すと宣言された関数を受け入れます。
しかし、注意を促すメッセージを表示し、宣言された関数の戻り値型をlanguage_handlerに変換します。
標準的な手続き言語を作成する推奨方法は単に以下のように行うことです。
CREATE LANGUAGE plperl;
pg_pltemplateカタログ内に存在しない言語では、以下のような処理が必要です。
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
CREATE LANGUAGEはPostgreSQLの拡張です。