PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# CREATE OPERATOR

## 名前

CREATE OPERATOR -- 新しい演算子の定義

## 概要

    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つ）を受け付けるように定義されていなければなりません。

他の句は省略可能な演算子最適化用の句です。 これらの意味は項31.13で説明されています。

## パラメータ

`name`

  定義される演算子の名前です。 使用できる文字は上を参照してください。 この名前は、例えば`CREATE OPERATOR myschema.+ (...)`のようにスキーマで修飾されている場合があります。 修飾されていなければ、演算子は現在のスキーマで作成されます。 異なるデータ型について処理するものであれば、同じスキーマ内の2つの演算子は同じ名前を持つことができます。 これはオーバーロードといいます。

`funcname`

  演算子を実装するために使用される関数です。

`lefttype`

  もしある場合は、演算子の左オペランドのデータ型です。 このオプションは左単項演算子では省略されます。

`righttype`

  もしある場合は、演算子の右オペランドのデータ型です。 このオプションは右単項演算子では省略されます。

`com_op`

  この演算子の交代演算子です。

`neg_op`

  この演算子の否定子です。

`res_proc`

  この演算子の制約選択評価関数です。

`join_proc`

  この演算子の結合選択評価関数です。

`HASHES`

  この演算子がハッシュ結合をサポートできることを示します。

`MERGES`

  この演算子がマージ結合をサポートできることを示します。

`left_sort_op`

  この演算子がマージ結合をサポートできる場合、この演算子の左辺データ型をソートする小なり演算子です。

`right_sort_op`

  この演算子がマージ結合をサポートできる場合、この演算子の右辺データ型をソートする小なり演算子です。

`less_than_op`

  この演算子がマージ結合をサポートできる場合、この演算子の入力データ型を比較する小なり演算子です。

`greater_than_op`

  この演算子がマージ結合をサポートできる場合、この演算子の入力データ型を比較する大なり演算子です。

スキーマ修飾された演算子名を`com_op`または他のオプション引数に与えるには、以下の例のように`OPERATOR()`構文を使用してください。

    COMMUTATOR = OPERATOR(myschema.===) ,

## 注釈

詳細については項31.12を参照してください。

データベースからユーザ定義の演算子を削除するには、DROP OPERATORを使用してください。 データベース内の演算子を変更するにはALTER OPERATORを使用してください。

## 例

以下のコマンドは、`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は、それぞれ<および>とみなされます。

    );

## 互換性

`CREATE OPERATOR`はPostgreSQLの拡張です。 標準SQLには、ユーザ定義の演算子についての規定はありません。

## 関連項目

ALTER OPERATOR, CREATE OPERATOR CLASS, DROP OPERATOR

前のページ | ホーム | 次のページ
CREATE LANGUAGE | 上に戻る | CREATE OPERATOR CLASS