バージョンごとのドキュメント一覧

CREATE OPERATOR

CREATE OPERATOR <refpurpose>define a new operator</refpurpose> — 新しい演算子を定義する

概要

CREATE OPERATOR name (
    {FUNCTION|PROCEDURE} = function_name
    [, LEFTARG = left_type ] [, RIGHTARG = right_type ]
    [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
    [, RESTRICT = res_proc ] [, JOIN = join_proc ]
    [, HASHES ] [, MERGES ]
)

説明

<title>Description</title>

<command>CREATE OPERATOR</command> defines a new operator, <replaceable class="parameter">name</replaceable>. The user who defines an operator becomes its owner. If a schema name is given then the operator is created in the specified schema. Otherwise it is created in the current schema. CREATE OPERATORは、新しい演算子nameを定義します。 演算子を定義したユーザがその所有者となります。 スキーマ名が指定されていた場合、その演算子は指定したスキーマに作成されます。 スキーマ名が指定されなかった場合、現在のスキーマに作成されます。

The operator name is a sequence of up to <symbol>NAMEDATALEN</symbol>-1 (63 by default) characters from the following list: 演算子名として使用できるのは、以下に示す文字を使った、NAMEDATALEN-1(デフォルトでは63)文字までの文字列です。


+ - * / < > = ~ ! @ # % ^ & | ` ?

There are a few restrictions on your choice of name: 名前の選択には以下に示すいくつかの制約があります。

  • <literal>&#45;-</literal> and <literal>/*</literal> cannot appear anywhere in an operator name, since they will be taken as the start of a comment. --/*はコメントの開始とみなされてしまうため、演算子名の一部として使うことができません。

  • A multicharacter operator name cannot end in <literal>+</literal> or <literal>-</literal>, unless the name also contains at least one of these characters: 複数の文字からなる演算子名は、下記の文字のうちの1つ以上を含まない限り、+または-で終わることができません。


    ~ ! @ # % ^ & | ` ?

    For example, <literal>@-</literal> is an allowed operator name, but <literal>*-</literal> is not. This restriction allows <productname>PostgreSQL</productname> to parse SQL-compliant commands without requiring spaces between tokens. 例えば、@-は演算子名として許されますが、*-は許されません。 この制約により、PostgreSQLがSQLに準拠する問い合わせをトークン同士の間に空白を要求することなしに解析することが可能になります。

  • The symbol <literal>=&gt;</literal> is reserved by the SQL grammar, so it cannot be used as an operator name. 記号=>はSQL文法で予約されているため、演算子名として使用できません。

The operator <literal>!=</literal> is mapped to <literal>&lt;&gt;</literal> on input, so these two names are always equivalent. 演算子!=は入力時に<>に変換されるので、これらの2つの名前は常に等価です。

For binary operators, both <literal>LEFTARG</literal> and <literal>RIGHTARG</literal> must be defined. For prefix operators only <literal>RIGHTARG</literal> should be defined. 二項演算子では、LEFTARGRIGHTARGの両方を定義しなければなりません。 前置演算子ではRIGHTARGのみを定義しなければなりません。

The <replaceable class="parameter">function_name</replaceable> function must have been previously defined using <command>CREATE FUNCTION</command> and must be defined to accept the correct number of arguments (either one or two) of the indicated types. function_name関数は、CREATE FUNCTIONを使って事前に定義されていなければなりません。また、指定された型の正しい数の引数(1つか2つ)を受け付けるよう定義する必要があります。

In the syntax of <literal>CREATE OPERATOR</literal>, the keywords <literal>FUNCTION</literal> and <literal>PROCEDURE</literal> are equivalent, but the referenced function must in any case be a function, not a procedure. The use of the keyword <literal>PROCEDURE</literal> here is historical and deprecated. CREATE OPERATORの構文では、キーワードFUNCTIONPROCEDUREは等価ですが、参照されている関数はどの場合も関数であって、プロシージャであってはなりません。 ここで、キーワードPROCEDUREを使用することは歴史的なものであり、廃止予定です。

The other clauses specify optional operator optimization attributes. Their meaning is detailed in <xref linkend="xoper-optimization"/>. 《マッチ度[90.370370]》他の句は演算子最適化用の句(省略可能)です。 これらの意味は36.15で説明されています。

To be able to create an operator, you must have <literal>USAGE</literal> privilege on the argument types and the return type, as well as <literal>EXECUTE</literal> privilege on the underlying function. If a commutator or negator operator is specified, you must own those operators. 《マッチ度[95.017794]》演算子を作成するためには、 引数の型と戻り値の型に対するUSAGE権限と背後にある関数に対するEXECUTE権限を持たなければなりません。 交代演算子または否定子演算子を指定する場合は、これらの演算子を所有していなければなりません。

パラメータ

<title>Parameters</title>
name

The name of the operator to be defined. See above for allowable characters. The name can be schema-qualified, for example <literal>CREATE OPERATOR myschema.+ (...)</literal>. If not, then the operator is created in the current schema. Two operators in the same schema can have the same name if they operate on different data types. This is called <firstterm>overloading</firstterm>. 定義される演算子の名前です。 使用できる文字は上を参照してください。 この名前は、例えばCREATE OPERATOR myschema.+ (...)のように、スキーマ修飾可能です。 修飾されていなければ、演算子は現在のスキーマに作成されます。 異なるデータ型について処理するものであれば、同じスキーマ内の2つの演算子は同じ名前を持つことができます。 これをオーバーロードと言います。

function_name

The function used to implement this operator. 演算子を実装するために使用する関数です。

left_type

The data type of the operator's left operand, if any. This option would be omitted for a prefix operator. 演算子の左オペランドのデータ型です(左オペランドが存在する場合のみ)。 このオプションは前置演算子では省略されます。

right_type

The data type of the operator's right operand. 演算子の右オペランドのデータ型です。

com_op

The commutator of this operator. この演算子の交代演算子です。

neg_op

The negator of this operator. この演算子の否定子です。

res_proc

The restriction selectivity estimator function for this operator. この演算子の制約選択評価関数です。

join_proc

The join selectivity estimator function for this operator. この演算子の結合選択評価関数です。

HASHES

Indicates this operator can support a hash join. この演算子がハッシュ結合をサポートできることを示します。

MERGES

Indicates this operator can support a merge join. この演算子がマージ結合をサポートできることを示します。

To give a schema-qualified operator name in <replaceable class="parameter">com_op</replaceable> or the other optional arguments, use the <literal>OPERATOR()</literal> syntax, for example: スキーマ修飾された演算子名をcom_opまたは他のオプション引数に与えるには、以下の例のようにOPERATOR()構文を使用してください。

COMMUTATOR = OPERATOR(myschema.===) ,

注釈

<title>Notes</title>

Refer to <xref linkend="xoper"/> and <xref linkend="xoper-optimization"/> for further information. 《機械翻訳》詳細については36.1436.15を参照してください。

When you are defining a self-commutative operator, you just do it. When you are defining a pair of commutative operators, things are a little trickier: how can the first one to be defined refer to the other one, which you haven't defined yet? There are three solutions to this problem: 《機械翻訳》自己可換演算子を定義するときは、単にそれを行います。 可換演算子のペアを定義するときは、少し厄介です。 最初に定義されたものが、まだ定義されていないもう一方を参照できるようにするには、どうすればよいのでしょうか?この問題には3つの解決策があります。

  • One way is to omit the <literal>COMMUTATOR</literal> clause in the first operator that you define, and then provide one in the second operator's definition. Since <productname>PostgreSQL</productname> knows that commutative operators come in pairs, when it sees the second definition it will automatically go back and fill in the missing <literal>COMMUTATOR</literal> clause in the first definition. 《機械翻訳》1つ目の方法は、最初の演算子を定義する際にCOMMUTATOR句を省略し、2番目の演算子の定義では、COMMUTATOR句に最初の演算子を与えるという方法です。 PostgreSQLは交代演算子が対になっていることがわかっていますので、2番目の定義を見た時に、自動的に最初の定義に戻ってその未定義になっているCOMMUTATOR句を設定します。

  • Another, more straightforward way is just to include <literal>COMMUTATOR</literal> clauses in both definitions. When <productname>PostgreSQL</productname> processes the first definition and realizes that <literal>COMMUTATOR</literal> refers to a nonexistent operator, the system will make a dummy entry for that operator in the system catalog. This dummy entry will have valid data only for the operator name, left and right operand types, and owner, since that's all that <productname>PostgreSQL</productname> can deduce at this point. The first operator's catalog entry will link to this dummy entry. Later, when you define the second operator, the system updates the dummy entry with the additional information from the second definition. If you try to use the dummy operator before it's been filled in, you'll just get an error message. 《機械翻訳》もう 1 つの、より単純な方法は、両方の定義にCOMMUTATOR句を含めることです。 PostgreSQLが最初の定義を処理し、COMMUTATORが存在しない演算子を参照していることに気付いた場合、システムカタログ内にその演算子のダミーエントリを作成します。 このダミーエントリは、演算子名、左右のオペランド型、および所有者に対してのみ有効なデータを持ちます。 PostgreSQLが現時点で推論できるのはこれだけです。 最初のオペレータのカタログエントリは、このダミーエントリにリンクします。 後で2番目の演算子を定義すると、システムは2番目の定義からの追加情報でダミー・エントリを更新します。 ダミーオペレータを使用する前に入力しようとすると、エラーメッセージが表示されます。

  • Alternatively, both operators can be defined without <literal>COMMUTATOR</literal> clauses and then <command>ALTER OPERATOR</command> can be used to set their commutator links. It's sufficient to <command>ALTER</command> either one of the pair. 《機械翻訳》あるいは、両方の演算子をCOMMUTATOR句なしで定義し、その後でALTER OPERATORを使用してそれらの交換子リンクを設定することができます。 どちらか一方のペアをALTERすることで十分です。

In all three cases, you must own both operators in order to mark them as commutators. 《機械翻訳》3つの場合すべてにおいて、オーダーで両方の演算子を所有して、それらを交換子としてマークする必要があります。

Pairs of negator operators can be defined using the same methods as for commutator pairs. 《機械翻訳》否定演算子のペアは、交換演算子のペアと同じ方法で定義できます。

It is not possible to specify an operator's lexical precedence in <command>CREATE OPERATOR</command>, because the parser's precedence behavior is hard-wired. See <xref linkend="sql-precedence"/> for precedence details. CREATE OPERATORで演算子の語彙優先順位を指定することはできません。 パーサの優先順位に関する動作は固定であるためです。 詳細な優先順位については4.1.6を参照してください。

The obsolete options <literal>SORT1</literal>, <literal>SORT2</literal>, <literal>LTCMP</literal>, and <literal>GTCMP</literal> were formerly used to specify the names of sort operators associated with a merge-joinable operator. This is no longer necessary, since information about associated operators is found by looking at B-tree operator families instead. If one of these options is given, it is ignored except for implicitly setting <literal>MERGES</literal> true. 廃止されたオプションSORT1SORT2LTCMP、およびGTCMPは、マージ結合可能演算子に関連したソート演算子の名前を指定するために使用されていました。 代わりにB-tree演算子族を検索することで関連する演算子の情報を見つけることができるようになりましたので、これは必要がなくなりました。 これらの内のいずれかのオプションが指定された場合、暗黙的にMERGESを真に設定するだけで、それ以外は無視します。

Use <link linkend="sql-dropoperator"><command>DROP OPERATOR</command></link> to delete user-defined operators from a database. Use <link linkend="sql-alteroperator"><command>ALTER OPERATOR</command></link> to modify operators in a database. データベースからユーザ定義の演算子を削除するにはDROP OPERATORを使用してください。 データベース内の演算子を変更するにはALTER OPERATORを使用してください。

<title>Examples</title>

The following command defines a new operator, area-equality, for the data type <type>box</type>: 以下のコマンドは、データ型boxに対する領域等価性を判定する新しい演算子を定義します。

CREATE OPERATOR === (
    LEFTARG = box,
    RIGHTARG = box,
    FUNCTION = area_equal_function,
    COMMUTATOR = ===,
    NEGATOR = !==,
    RESTRICT = area_restriction_function,
    JOIN = area_join_function,
    HASHES, MERGES
);

互換性

<title>Compatibility</title>

<command>CREATE OPERATOR</command> is a <productname>PostgreSQL</productname> extension. There are no provisions for user-defined operators in the SQL standard. CREATE OPERATORPostgreSQLの拡張です。 標準SQLには、ユーザ定義の演算子についての規定はありません。

関連項目

<title>See Also</title> ALTER OPERATOR, CREATE OPERATOR CLASS, DROP OPERATOR