CREATE LANGUAGE — 新しい手続き言語を定義する
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGEname
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
HANDLERcall_handler
[ INLINEinline_handler
] [ VALIDATORvalfunction
]
CREATE LANGUAGE
は新しい手続き言語をPostgreSQLデータベースに登録します。
これにより、関数とトリガプロシージャをその新しい言語で定義できるようになります。
PostgreSQL 9.1から、ほとんどの手続き言語は「拡張」としてまとめられました。
したがってCREATE LANGUAGE
ではなくCREATE EXTENSIONを使用してインストールすべきです。
CREATE LANGUAGE
を直接使用することは拡張インストール用スクリプトに限定されなければなりません。
おそらくアップグレードの結果「むきだしの」言語がデータベース内に存在する場合、CREATE EXTENSION
を用いて拡張に変換することができます。
langname
FROM unpackaged
CREATE LANGUAGE
は、言語名とその言語で作成された関数の実行に責任を持つハンドラ関数を関連付けます。
言語ハンドラについての詳細は、第55章を参照してください。
CREATE LANGUAGE
コマンドには2種類の構文があります。
最初の構文は、ユーザは必要な言語の名前のみを単に指定するものです。
この場合、PostgreSQLサーバはpg_pltemplate
システムカタログを参照し、正しいパラメータを決定します。
2番目の構文では、ユーザは言語名の他に言語のパラメータも入力します。
この形式で、pg_pltemplate
で定義されていない言語を作成することができますが、この手法は廃棄予定です。
指定された言語名に対応するpg_pltemplate
カタログの項目をサーバが見つけると、コマンドに言語のパラメータが含まれていたとしてもカタログのデータを使用します。
この動作により、言語のサポート関数に関する古すぎる情報を含む、古いダンプファイルからの読み込みが簡単になります。
通常、新しい言語を登録するには、ユーザはPostgreSQLのスーパーユーザ権限を持たなければなりません。
しかし、言語がpg_pltemplate
カタログ内に記載され、データベース所有者による作成可能印(tmpldbacreate
が真)が付いていれば、データベース所有者はそのデータベース内に新しい言語を登録することができます。
デフォルトで、信頼された言語はデータベース所有者による作成ができます。
しかし、これはスーパーユーザによるpg_pltemplate
の変更により調整できます。
言語作成者が言語の所有者になり、後で削除したり、名前を変えたり、別の所有者を割り当てたりすることができます。
CREATE OR REPLACE LANGUAGE
は新しい言語を作成、または、既存の定義を置き換えます。
言語がすでに存在する場合、パラメータは指定された値またはpg_pltemplate
から取り出された値にしたがって更新されますが、言語の所有権と権限に関する設定は変更されません。
また、その言語で作成された既存の関数も依然として有効であるものとみなされます。
言語を作成する際に通常要求される権限に加え、ユーザはスーパーユーザまたは既存言語の所有者でなければなりません。
REPLACE
の場合、主に言語が存在することを確認するために使用することを意味します。
その言語がpg_pltemplate
項目を持つ場合、REPLACE
は既存の定義を実際にはまったく変更しません。
ただし、言語が作成された後でpg_pltemplate
項目が変更されたという通常ではない場合は例外です。
TRUSTED
TRUSTED
は、他の方法ではユーザがアクセスできないデータに対しては、その言語でのアクセスが許されないことを指定します。
言語の登録時にこのキーワードを省略すると、PostgreSQLのスーパーユーザ権限を持つユーザのみが、この言語を使って新しい関数を作れるようになります。
PROCEDURAL
これには意味はありません。
name
新しい手続き言語の名前です。 この名前はデータベースの言語の中で一意でなければなりません。
後方互換を保持するため、この名前を単一引用符で囲むこともできます。
HANDLER
call_handler
call_handler
は手続き言語の関数を実行するために呼び出される関数の名前で、事前に登録しておく必要があります。
このハンドラは、Version-1呼び出し規約に則って、C言語のようなコンパイル言語で書かれている必要があります。また、引数を取らずlanguage_handler
型を返す関数として、PostgreSQLに登録されていなければなりません。
language_handler
型は、単に関数を呼び出しハンドラとして識別するのに使用するプレースホルダ型です。
INLINE
inline_handler
inline_handler
はこの言語で無名コードブロックを実行(DOコマンド)するために呼び出される、事前に登録された関数の名前です。
inline_handler
関数が指定されない場合、その言語では無名コードブロックをサポートしません。
このハンドラ関数は、DO
コマンドの内部表現となるinternal
型の引数を1つ取らなければならず、また、通常void
を返します。
ハンドラの戻り値は無視されます。
VALIDATOR
valfunction
valfunction
は、事前に登録された検証用関数の名前です。新しい関数が当該言語で作成された場合、その関数を検証するために呼び出されます。
検証用関数が指定されていない場合、新しい関数は作成時にチェックされません。
検証用関数は、oid
型の引数を1つ取る必要があります。
この引数は作成される関数のOIDになります。
また、通常void
型を返します。
検証用関数は、通常、関数本体が構文上正しいかどうかを検査するために使用されます。
しかし、それだけでなく、関数のプロパティも検査可能です。例えば、その言語が処理できない特定のデータ型が引数に含まれていないかなどがチェックできます。
エラーを通知するには、検証用関数でereport()
関数を使用すべきです。
関数の戻り値は無視されます。
指定した言語名に対応するpg_pltemplate
の項目がサーバにある場合、TRUSTED
オプションとサポート関数名は無視されます。
手続き言語を削除するにはDROP LANGUAGEを使用してください。
システムカタログpg_language
( 51.29参照)には、現在インストールされている言語に関する情報が記録されています。
またpsqlのコマンド\dL
はインストールされた言語を一覧表示します。
手続き言語で関数を作成するには、ユーザはその言語に対するUSAGE
権限を持たなければなりません。
デフォルトでは、信頼された言語についてはPUBLIC
に(つまり全員に)USAGE
が付与されています。
これは必要に応じて取り消すことができます。
手続き言語は各データベースに局所的です。
しかし、言語をtemplate1
データベースにインストールすることができます。
この場合、その後に作成されたすべてのデータベースで自動的にその言語は使用できるようになります。
呼び出しハンドラ関数とインラインハンドラ関数(もしあれば)、検証関数(もしあれば)は、サーバがpg_pltemplate
内にその言語に関する項目を持っていない場合には、存在しなければなりません。
しかし、その項目があったとしても、関数がすでに存在しているとは限りません。
データベース内に存在していなければ自動的に定義されます。
(言語を実装する共有ライブラリがインストレーションで利用できない場合、これによりCREATE LANGUAGE
が失敗する可能性があります。)
PostgreSQL 7.3より前のバージョンでは、ハンドラ関数が返すプレースホルダ型をlanguage_handler
型ではなくopaque
型と宣言する必要がありました。
古いダンプファイルのロードをサポートするために、CREATE LANGUAGE
はopaque
型を返すと宣言された関数を受け入れます。
しかし、注意を促すメッセージを表示し、宣言された関数の戻り値型をlanguage_handler
に変換します。
標準的な手続き言語を作成する推奨方法は単に以下のように行うことです。
CREATE LANGUAGE plperl;
pg_pltemplate
カタログ内に存在しない言語では、以下のような処理が必要です。
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
CREATE LANGUAGE
はPostgreSQLの拡張です。