CREATE OPERATOR — 新しい演算子を定義する
CREATE OPERATORname( {FUNCTION|PROCEDURE} =function_name[, LEFTARG =left_type] [, RIGHTARG =right_type] [, COMMUTATOR =com_op] [, NEGATOR =neg_op] [, RESTRICT =res_proc] [, JOIN =join_proc] [, HASHES ] [, MERGES ] )
CREATE OPERATORは、新しい演算子nameを定義します。
演算子を定義したユーザがその所有者となります。
スキーマ名が指定されていた場合、その演算子は指定したスキーマに作成されます。
スキーマ名が指定されなかった場合、現在のスキーマに作成されます。
演算子名として使用できるのは、以下に示す文字を使った、NAMEDATALEN-1(デフォルトでは63)文字までの文字列です。
+ - * / < > = ~ ! @ # % ^ & | ` ?
名前の選択には以下に示すいくつかの制約があります。
--と/*はコメントの開始とみなされてしまうため、演算子名の一部として使うことができません。
複数の文字からなる演算子名は、下記の文字のうちの1つ以上を含まない限り、+または-で終わることができません。
~ ! @ # % ^ & | ` ?
例えば、@-は演算子名として許されますが、*-は許されません。
この制約により、PostgreSQLがSQLに準拠する問い合わせをトークン同士の間に空白を要求することなしに解析することが可能になります。
演算子名として=>を使用することは廃止される予定です。
将来のリリースで完全に許されなくなるかもしれません。
演算子!=は入力時に<>に変換されるので、これらの2つの名前は常に等価です。
少なくともLEFTARGとRIGHTARGのどちらかは定義しなければなりません。
二項演算子では、両方を定義しなければなりません。
右単項演算子ではLEFTARGのみ、左単項演算子ではRIGHTARGのみが定義されなければなりません。
function_name関数は、CREATE FUNCTIONを使って事前に定義されていなければなりません。また、指定された型の正しい数の引数(1つか2つ)を受け付けるよう定義する必要があります。
CREATE OPERATORの構文では、キーワードFUNCTIONとPROCEDUREは等価ですが、参照されている関数はどの場合も関数であって、プロシージャであってはなりません。
ここで、キーワードPROCEDUREを使用することは歴史的なものであり、廃止予定です。
他の句は演算子最適化用の句(省略可能)です。 これらの意味は38.14で説明されています。
演算子を作成するためには、
引数の型と戻り値の型に対するUSAGE権限と背後にある関数に対するEXECUTE権限を持たなければなりません。
交代演算子または否定子演算子を指定する場合は、これらの演算子を所有していなければなりません。
name
定義される演算子の名前です。
使用できる文字は上を参照してください。
この名前は、例えばCREATE OPERATOR myschema.+ (...)のように、スキーマ修飾可能です。
修飾されていなければ、演算子は現在のスキーマに作成されます。
異なるデータ型について処理するものであれば、同じスキーマ内の2つの演算子は同じ名前を持つことができます。
これをオーバーロードと言います。
function_name演算子を実装するために使用する関数です。
left_type演算子の左オペランドのデータ型です(左オペランドが存在する場合のみ)。 このオプションは左単項演算子では省略されます。
right_type演算子の右オペランドのデータ型です(右オペランドが存在する場合のみ)。 このオプションは右単項演算子では省略されます。
com_opこの演算子の交代演算子です。
neg_opこの演算子の否定子です。
res_procこの演算子の制約選択評価関数です。
join_procこの演算子の結合選択評価関数です。
HASHESこの演算子がハッシュ結合をサポートできることを示します。
MERGESこの演算子がマージ結合をサポートできることを示します。
スキーマ修飾された演算子名をcom_opまたは他のオプション引数に与えるには、以下の例のようにOPERATOR()構文を使用してください。
COMMUTATOR = OPERATOR(myschema.===) ,
詳細については38.13を参照してください。
CREATE OPERATORで演算子の語彙優先順位を指定することはできません。
パーサの優先順位に関する動作は固定であるためです。
詳細な優先順位については4.1.6を参照してください。
廃止されたオプションSORT1、SORT2、LTCMP、およびGTCMPは、マージ結合可能演算子に関連したソート演算子の名前を指定するために使用されていました。
代わりにB-tree演算子族を検索することで関連する演算子の情報を見つけることができるようになりましたので、これは必要がなくなりました。
これらの内のいずれかのオプションが指定された場合、暗黙的にMERGESを真に設定するだけで、それ以外は無視します。
データベースからユーザ定義の演算子を削除するにはDROP OPERATORを使用してください。 データベース内の演算子を変更するにはALTER OPERATORを使用してください。
以下のコマンドは、データ型boxに対する領域等価性を判定する新しい演算子を定義します。
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
FUNCTION = area_equal_function,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_function,
JOIN = area_join_function,
HASHES, MERGES
);
CREATE OPERATORはPostgreSQLの拡張です。
標準SQLには、ユーザ定義の演算子についての規定はありません。