"CREATE LANGUAGE" SQL 11/05/95 日本語PostgreSQL 日本語PostgreSQL

名称

create language - 関数のための新しい言語を定義します

形式

create [trusted] procedural language 'lanname'
	handler call_handler
	lancompiler 'comment'
    

説明

このコマンドで、Postgres のユーザは Postgres の新しい言語を登録することができます。その後、関数とトリガ手続きはこの新しい言語で定義できます。ユーザは新しい言語を登録するには Postgres のスーパーユーザの権限を持っていなくてはなりません。

lanname は新しい手続き言語の名前です。システムカタログ pg_language に新しいエントリが挿入される前に小文字に変換されます。function(l) language(l) でも行われます。ですから、言語名は大文字小文字を区別しません。手続き言語は Postgres の組み込み言語を上書きできません。

引数の handler はPL 手続きを実行するのに呼び出される前もって登録してある関数の名前です。

lancompiler 引数は文字列で、新しい pg_language のエントリの lancompiler 属性に挿入されます。現在 Postgres はこの属性を何にもつかいません。

trusted キーワードを指定すると、この言語の呼び出しハンドラは安全とされます。- つまり、権限のないユーザにアクセス制御関係の機能を提供しないということです。もしこのキーワードがないと、言語を登録するときに、Postgres のスーパーユーザ権限のあるユーザのみが新しい関数を作るのにこの言語を使うことができるようになります。('C' 言語のように)

PL ハンドラを書く

手続き言語の呼び出しハンドラは 'C' のようなコンパイラ言語で書かれなくてはなりません。また、opaque型を返す引数を取らない関数として Postgres に登録されます。これは呼び出しハンドラが問い合わせから直接呼び出されるのを防ぐためです。しかし、ハンドラから提供される言語のPL 関数あるいはトリガ手続きが呼び出されるときには、実際は引数があります。

トリガマネージャから呼び出されると、唯一の引数が手続きの pg_proc エントリのオブジェクトID になります。トリガマネージャからの他の情報はグローバルの CurrentTriggerData ポインタに見ることができます。

関数マネージャから呼び出されると、引数は手続きの pg_proc エントリのオブジェクトID、PL 関数に与えられる引数の数、FmgrValues 構造体の引数、そして関数がその戻り値が SQL の NULL 値であるかどうかを呼び出し元に知らせるboolean へのポインタとなります。

pg_proc エントリを取り出し、引数と呼び出された手続きの戻り値の型を調べるのは呼び出しハンドラによります。function(l) からのas句は pg_proc のエントリの prosrc 属性に見ることができます。これは手続き言語そのもののソーステキスト (PL/Tcl のような)で、ファイルへのパス、もしくは呼び出しハンドラが細かく何をするべきかを告げる何らかのものとなります。

次に挙げるのは、'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) { /* * 関数として呼ばれた */
retval = ... } else { /* * トリガ手続きとして呼ばれた */ trigdata = CurrentTriggerData; CurrentTriggerData = NULL;
retval = ... }
*isNull = false; return retval; }
完全な PL 呼び出しハンドラには、ほんの数千行のコードを ... の代わりに加えるだけです。これをローダブルモジュールにコンパイルする方法はfunction(l) を参照してください。次のコマンドはサンプルの手続き言語を登録します:

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';

参照

function(l) language(l) .

制限

手続き言語の呼び出しハンドラは 'C' 言語で登録されなくてはならないので、'C' 関数のすべての制限を受け継ぎます。

バグ

現在、手続き言語を一度定義すると、変更することはできません。