CREATE [ TRUSTED ] PROCEDURAL LANGUAGE 'langname' HANDLER call_handler LANCOMPILER 'comment'
TRUSTED はその言語の呼び出しハンド ラが安全であることを指定します。 つまり、権限のないユーザがアクセス制限を迂回できないようにする 機能です。このキーワードを省略して言語を登録した場合、 Postgres のスーパユーザ権限 を持つユーザのみ、新しい関数を生成するこの言語 ('C' 言語のように)を使用することができます。
新しい手続き言語の名前。 言語名は大文字・小文字を区別しません。 手続き言語は Postgres に組み込まれている 言語を上書きすることができません。
call_handler は PL プロシージャを実行するために呼び出される、登録済の 関数の名前です。
LANCOMPILER 引数は、新規の pg_language 項目の LANCOMPILER 属性に挿入される 文字列です。 現時点で Postgres は この属性を全く使用しません。
CREATE LANGUAGE によって、 Postgres ユーザは Postgres に新しい言語を登録 することができます。 これにより、その新規言語を用いて関数やトリガプロシージャを 定義することができます。新規言語を登録するためには Postgres のスーパユーザの 権限が必要です。
手続き言語用の呼び出しハンドラは 'C' のようなコンパイラ言語 で記述された、引数を取らない、未指定、未定義型などのプレース ホルダである opaque 型を返す関数として Postgres に登録されなければなりま せん。 これは、呼び出しハンドラが直接問い合わせによって呼ばれる関数 として呼び出されることを防ぐものです。
とは言っても、ハンドラによって提供される言語を用いた PL 関数または トリガプロシージャが実行される場合、実際の呼び出しにおいて引数が 与えられなければなりません。
トリガマネージャから呼ばれた場合、引数はプロシージャの pg_proc 項目のオブジェクト ID だけです。 トリガマネージャからのその他情報は、全て、グローバル変数である CurrentTriggerData ポインタの中 にあります。
関数マネージャから呼び出された場合の引数は、プロシージャの pg_proc 項目のオブジェクト ID、 PL 関数に与える引数の数、 FmgrValues 構造体に格納された引数、及び、戻り値が SQL の NULL 値で あるかどうか関数が呼び出し元に通知するブール値に対する ポインタです。
pg_proc 項目の取り出し、および、呼び出さ れたプロシージャの引数と戻される型の分析は、呼び出しハンドラに 依存します。 プロシージャの CREATE FUNCTION の AS 句は、pg_proc テーブル項目の prosrc 属性の中にあります。 これは、( PL/Tcl の場合のような)手続き言語のソース原文 そのものであったり、あるファイルのパス名であったり、 あるいは呼び出しハンドラに細部で何を行うのかを通知する なんらかのものであったりします。
関数を作成する場合は CREATE FUNCTION を 使用して下さい。
手続き言語を削除する場合は DROP LANGUAGE を使用して下さい。
より詳しくは、pg_language テーブルを参照 して下さい。
Table "pg_language" Attribute | Type | Modifier ---------------+---------+---------- lanname | name | lanispl | boolean | lanpltrusted | boolean | lanplcallfoid | oid | lancompiler | text | lanname | lanispl | lanpltrusted | lanplcallfoid | lancompiler ----------+---------+--------------+---------------+------------- internal | f | f | 0 | n/a C | f | f | 0 | /bin/cc sql | f | f | 0 | postgres
手続き言語用呼び出しハンドラは 'C' 言語で Postgres に登録されなければ なりませんので、 'C' 関数の全ての機能と制約事項が継承 されます。
現在では、一度作成されてしまった手続き言語の定義を変更する ことができません。
これは 'C' で作成された、PL ハンドラの雛型です。
#include "executor/spi.h" #include "commands/trigger.h" #include "utils/elog.h" #include "fmgr.h" /* FmgrValues 構造体用 */ #include "access/heapam.h" #include "utils/syscache.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" Datum plsample_call_handler( Oid prooid, int pronargs, FmgrValues *proargs, bool *isNull) { Datum retval; TriggerData *trigdata; if (CurrentTriggerData == NULL) { /* * 関数として呼び出された場合 */ retval = ... } else { /* * トリガプロシージャとして呼び出された場合 */ trigdata = CurrentTriggerData; CurrentTriggerData = NULL; retval = ... } *isNull = false; return retval; }
PL 呼び出しハンドラを完結させるには些細なことではなく、 実際は数千行のコードを追加しなければなりません。 読み込み可能モジュールにコンパイルする方法に関する情報については CREATE FUNCTION を参照して下さい。
以下のコマンドで手続き言語の例を登録します。
CREATE FUNCTION plsample_call_handler () RETURNS opaque AS '/usr/local/pgsql/lib/plsample.so' LANGUAGE 'C'; CREATE PROCEDURAL LANGUAGE 'plsample' HANDLER plsample_call_handler LANCOMPILER 'PL/Sample';