CREATE LANGUAGE

Name

CREATE LANGUAGE  --  関数用に新規言語を定義します。

Synopsis

CREATE [ TRUSTED ] PROCEDURAL LANGUAGE 'langname'
    HANDLER call_handler
    LANCOMPILER 'comment'
  

入力

TRUSTED

TRUSTED はその言語に対する呼び出し ハンドラが安全であることを指定します。すなわち、 権限のないユーザがアクセス制限を迂回出来ないようにする 機能です。言語登録の時、このキーワードが省略されると Postgres のスーパユーザ権限 を持つユーザのみ、新しい関数を生成するこの言語 ('C' 言語のように)を使用することが出来ます。

langname

新しい手続き言語の名前です。 言語名は大文字・小文字を区別します。手続き言語は Postgres に組み込まれている 言語のうち一つも上書きしません。

HANDLER call_handler

call_handler は PL プロシージャを実行するために呼び出される、登録済の 関数の名前です。

comment

LANCOMPILER 引数は、新規の pg_language 項目の LANCOMPILER 属性に挿入される 文字列です。 とは言っても、現時点で Postgres は この属性を使用しません。

出力

CREATE

言語が正常に作成されたときに戻るメッセージです。

ERROR: PL handler function funcname() doesn't exist

関数 funcname() が見付からなかった場合に返されるエラーです。

説明

CREATE LANGUAGE によって、 Postgres ユーザは Postgres に新しい言語を登録 することが出来ます。 そうすると、その新規言語を用いて関数やトリガプロシージャを 定義することが出来ます。新規言語を登録するためには Postgres のスーパユーザの 権限が必要です。

PL ハンドラを書くには

手続き言語用の呼び出しハンドラは 'C' のようなコンパイラ言語 で書かれ、Postgres に引数を取らずに opaque 型、指定されていないか定義されていない型を戻 す関数として登録されなければなりません。これは、問合せから 関数として呼び出しハンドラが直接呼び出されることを防ぐものです。

とは言っても、ハンドラによって提供される言語を用いた PL 関数または トリガプロシージャが実行される場合、実際の呼び出しにおいて引数が 与えられなければなりません。

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' 言語で Postgres に登録されなければ なりませんので、 'C' 関数の全ての機能と制約事項が継承 されます。

バグ情報

現在では、一度作成されてしまった手続き言語の定義を変更する ことが出来ません。

使用法

以下は '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';
   

互換性

CREATE LANGUAGE は Postgres の 拡張です。

SQL92

SQL92CREATE LANGUAGE 文はありません。