CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ] [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ] [, RESTRICT = res_proc ] [, JOIN = join_proc ] [, HASHES ] [, MERGES ] [, SORT1 = left_sort_op ] [, SORT2 = right_sort_op ] [, LTCMP = less_than_op ] [, GTCMP = greater_than_op ] )
CREATE OPERATORは、新しい演算子 nameを定義します。演算子を定義したユーザがその所有者となります。 スキーマ名が指定されていた場合、その演算子は指定したスキーマで作成されます。 さもなくば、現在のスキーマで作成されます。
演算子名は、以下に示す文字で、NAMEDATALEN-1(デフォルトでは63)文字数までの文字列です。
+ - * / < > = ~ ! @ # % ^ & | ` ?
名前の選択には以下に示すいくつかの制約があります。--と/*は演算子名のどこにも使うことができません。 コメントの開始とみなされてしまうからです。
複数文字の演算子名は、下記のうちの1つ以上を含まない限り+または-で終わることができません。
~ ! @ # % ^ & | ` ?
たとえば、@-は演算子名として許されますが、*-は許されません。 この制約により、PostgreSQLがSQLに準拠する問い合わせをトークン同士の間にスペースを要求することなしに解析することが可能になります。
演算子!=は入力時に<>に写像されるので、これらの2つの名前は常に等価です。
少なくとも LEFTARG と RIGHTARG のどちらかは定義されなければなりません。 二項演算子では両方が定義されなければなりません。 右単項演算子では LEFTARG のみが定義されなければならず、左単項演算子では RIGHTARG のみが定義されなければなりません。
funcnameプロシージャは、CREATE FUNCTIONを使って事前に定義されていなければならず、指定された型の正しい数の引数(1つか2つ)を受け付けるように定義されていなければなりません。
他の句は省略可能な演算子最適化用の句です。 これらの意味は項33.11で説明されています。
定義される演算子です。 使用できる文字は上を参照してください。 この名前は、スキーマで修飾されている場合があります。例 CREATE OPERATOR myschema.+ (...) 修飾されていなければ、演算子は現在のスキーマで作成されます。 異なるデータ型について処理するものであれば、同じスキーマ内の2つの演算子は同じ名前を持つことができます。 これはオーバーロードといいます。
演算子を実装するために使用される関数です。
もしある場合は、演算子の左辺の引数の型です。 このオプションは左単項演算子では省略されます。
もしある場合は、演算子の右辺の引数の型です。 このオプションは右単項演算子では省略されます。
この演算子の交代演算子です。
この演算子の否定子です。
この演算子の制約選択評価関数です。
この演算子の結合選択評価関数です。
この演算子がハッシュ結合をサポートできることを示します。
この演算子がマージ結合をサポートできることを示します。
この演算子がマージ結合をサポートできる場合、この演算子の左辺データ型をソートする小なり演算子です。
この演算子がマージ結合をサポートできる場合、この演算子の右辺データ型をソートする小なり演算子です。
この演算子がマージ結合をサポートできる場合、この演算子の入力データ型を比較する小なり演算子です。
この演算子がマージ結合をサポートできる場合、この演算子の入力データ型を比較する大なり演算子です。
スキーマ修飾された演算子名を com_op または他のオプション引数に与えるには、以下の例のように OPERATOR() 構文を使用してください。
COMMUTATOR = OPERATOR(myschema.===) ,
以下のコマンドは、boxデータ型に対する領域等価性を判定する新しい演算子を定義します。
CREATE OPERATOR === ( LEFTARG = box, RIGHTARG = box, PROCEDURE = area_equal_procedure, COMMUTATOR = ===, NEGATOR = !==, RESTRICT = area_restriction_procedure, JOIN = area_join_procedure, HASHES, SORT1 = <<<, SORT2 = <<< -- ソート演算子が与えられているため、MERGES が暗黙指定されています。 -- LTCMP および GTCMP は、それぞれ < および > とみなされます。 );