CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE langname HANDLER call_handler [ VALIDATOR valfunction ]
PostgreSQLユーザは、CREATE LANGUAGEを使って新しい言語を PostgreSQLに登録することができます。これにより、関数とトリガプロシージャはこの新しい言語で定義可能になります。ユーザは新しい言語を登録するためにはPostgreSQLのスーパーユーザ権限を持っていなければいけません。
CREATE LANGUAGE は効率的に言語名と、その言語で作成された関数の実行に責任をもつ呼び出しハンドラを関連づけます。言語呼び出しハンドラについてのより詳細は プログラマガイド を参照して下さい。
手続き言語は各データベースに局所的なものであることに注意して下さい。デフォルトで全てのデータベースで使用できる言語を作成するためには、template1 データベースにインストールされなければなりません。
TRUSTED は、その言語の呼び出しハンドラが 安全であることを指定します。つまり、権限を持たないユーザにはアクセス制限を無視する機能を何も与えないということです。 もし言語を登録するときにこのキーワードが省略されると、PostgreSQLのスーパーユーザ権限を持つユーザのみが新しい関数を作るためにこの言語を使うことができるようになります。
この単語はノイズです。
新しい手続き言語の名前です。言語名は大文字/小文字の区別がありません。手続き言語はどのPostgreSQLの組み込み言語をも上書きすることはできません。
後方互換のため、この名前を単一引用符で括ることもできます。
call_handlerは、 事前に登録されていた関数の名前で、この手続き言語の関数 を実行するために呼び出されるものです。 手続き言語用の呼び出しハンドラは、C 言語のようなコンパイル言語でバージョン 1 呼び出し規約を使用して作成し、引数をとらない language_handler 型を返す関数として、PostgreSQL に登録されなければなりません。language_handler 型は、単に関数を呼び出しハンドラとして識別するのに使用するプレースホルダ型です。
valfunction は、事前登録済みの関数の名前で、新しい関数がその言語で作成された場合、その新しい関数を検証するために呼び出されます。 検証用関数が指定されていない場合、新しい関数は作成時にチェックされません。 また、検証用関数は、oid 型の引数を 1 つ取る必要があります。この引数は、作成される関数の OID になり、通常 void 型を返します。
検証用関数は通常、関数本体が構文上正しいかどうかを検査するために使用されます。しかし、それだけでなく、たとえばその言語が特定の引数データ型を処理できないといった、関数の他のプロパティも参照可能です。 エラーを知らせるには、検証用関数で elog() 関数を使用してください。 関数の戻り値は無視されます。
通常このコマンドはユーザが直接実行するものではありません。PostgreSQL 配布物に含まれる手続き言語では、createlang スクリプトが使用されなければなりません。 これは正確な呼び出しハンドラのインストールも行ないます。(createlang は内部的にCREATE LANGUAGE を呼び出します。)
PostgreSQL 7.3 より前のバージョンでは、ハンドラ関数を language_handler 型ではなくプレースホルダ型 opaque 型を返すように宣言する必要がありました。 古いダンプファイルのロードをサポートするため、CREATE LANGUAGE では opaque 型を返すように宣言された関数を受け入れます。しかし、NOTICE を発行し、宣言された関数の戻り値型を language_handler に変換します。
新しい関数を作成するには、CREATE FUNCTION コマンドを使用して下さい。
手続き言語を削除するには、DROP LANGUAGE を使用して下さい。 droplang スクリプトを使用する方が良いでしょう。
pg_language システムカタログは現時点でインストールされた手続き言語の情報を記録します。
Table "pg_language" Attribute | Type | Modifier ---------------+-----------+---------- lanname | name | lanispl | boolean | lanpltrusted | boolean | lanplcallfoid | oid | lanvalidator | oid | lanacl | aclitem[] | lanname | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl -------------+---------+--------------+---------------+--------------+-------- internal | f | f | 0 | 2246 | c | f | f | 0 | 2247 | sql | f | t | 0 | 2248 | {=U}
現在、権限を除き、作成済みの手続き言語の定義を変更することはできません。
手続き言語を使用可能にするには、ユーザに USAGE 権限を与える必要があります。 その言語が「信頼できる (trusted)」と分かっている場合は、createlang プログラムで全ユーザに自動的に権限を与えます。