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' のようなコンパイラ言語 で書かれ、Postgres に引数を取らずに opaque 型、指定されていないか定義されていない型を戻 す関数として登録されなければなりません。これは、問合せから 関数として呼び出しハンドラが直接呼び出されることを防ぐものです。
とは言っても、ハンドラによって提供される言語を用いた 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 +--------------------------+--------------------------+-------+ | Field | Type | Length| +--------------------------+--------------------------+-------+ | lanname | name | 32 | | lancompiler | text | var | +--------------------------+--------------------------+-------+ lanname |lancompiler --------+-------------- internal|n/a lisp |/usr/ucb/liszt C |/bin/cc sql |postgres
以下は 'C' で書かれた PL ハンドラ用の雛型です。
#include "executor/spi.h" #include "commands/trigger.h" #include "utils/elog.h" #include "fmgr.h" /* for FmgrValues struct */ #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) { /* * Called as a function */ retval = ... } else { /* * Called as a trigger procedure */ 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';