CREATE OPERATOR CLASS — 新しい演算子クラスを定義する
CREATE OPERATOR CLASSname
[ DEFAULT ] FOR TYPEdata_type
USINGindex_method
[ FAMILYfamily_name
] AS { OPERATORstrategy_number
operator_name
[ (op_type
,op_type
) ] [ FOR SEARCH | FOR ORDER BYsort_family_name
] | FUNCTIONsupport_number
[ (op_type
[ ,op_type
] ) ]function_name
(argument_type
[, ...] ) | STORAGEstorage_type
} [, ... ]
CREATE OPERATOR CLASS
は新しい演算子クラスを作成します。
演算子クラスは、特定のデータ型がインデックスでどのように使用されるかを定義します。
演算子クラスにより、データ型およびインデックスメソッドの特定の役割もしくは「戦略」に、どの演算子を使用するかが指定されます。
また、インデックスの列に対して演算子クラスが選択される際、演算子クラスによってインデックスメソッドが使用するサポートプロシージャが指定されます。
演算子クラスで使用される全ての演算子および関数は、演算子クラスを作成できるようになる前に定義しておく必要があります。
スキーマ名が与えられている場合、その演算子クラスは指定されたスキーマに作成されます。 スキーマ名がなければ、演算子クラスは現在のスキーマに作成されます。 異なるインデックスメソッドに使用する場合のみ、同じスキーマ内の2つの演算子クラスに同じ名前を付けることができます。
演算子クラスは、それを定義したユーザが所有者となります。 現在、演算子クラスを作成するには、スーパーユーザである必要があります。 (誤った演算子クラスを定義すると、サーバを混乱させ、サーバクラッシュの原因とさえなり得るため、この制限が付けられています)。
現在、CREATE OPERATOR CLASS
では、インデックスメソッドに必要な全ての演算子および関数が演算子クラス定義に含まれているかどうか、また、演算子や関数の形式がそれ自身で整合性を持っているかを検査しません。
ユーザの責任において、有効な演算子クラスを定義してください。
関連する演算子クラスを演算子族にまとめることができます。
既存の演算子族に新しい演算子クラスを追加するためには、CREATE OPERATOR CLASS
でFAMILY
オプションを指定してください。
このオプションを指定しないと、新しい演算子クラスはそのクラスと同じ名前の演算子族内に置かれます(この演算子族が存在しない場合は作成します)。
詳細については36.14. インデックス拡張機能へのインタフェースを参照してください。
name
作成する演算子クラスの名前です。 演算子クラス名は、スキーマ修飾することができます。
DEFAULT
DEFAULT
を付けると、その演算子クラスが、そのデータ型のデフォルトの演算子クラスになります。
特定のデータ型およびインデックスメソッドのデフォルトにできる演算子クラスは最大1つまでです。
data_type
この演算子クラスを使用する列のデータ型です。
index_method
この演算子クラスを使用するインデックスメソッドの名前です。
family_name
この演算子クラスの追加先となる既存の演算子族の名前です。 指定されない場合、演算子クラスと同じ名前の演算子族が使用されます(演算子族が存在しない場合は作成します)。
strategy_number
演算子クラスに関連する演算子のインデックスメソッドの戦略番号です。
operator_name
演算子クラスに関連する演算子の名前です(スキーマ修飾名でも可)。
op_type
OPERATOR
句では、演算子の入力データ型、もしくは、左単項演算子か右単項演算子を表すNONE
を指定します。
演算子クラスのデータ型と同じである通常の場合、入力データ型は省略可能です。
FUNCTION
句では、関数の入力データ型(B-Tree比較関数およびハッシュ関数用)またはクラスのデータ型(B-treeソートサポート関数とGiST、SP-GiST、GIN、BRIN演算子クラスのすべての関数用)と異なる場合、関数がサポートする予定の演算対象データ型です。
これらのデフォルトは常に正確です。
このため、しかしデータ型を跨がる比較をサポートする予定のB-treeソートサポート関数は除き、FUNCTION
句でop_type
を指定する必要はありません。
sort_family_name
順序付け演算子に関連したソート順序を記述する、既存のbtree
演算子族の名前(スキーマ修飾可)です。
FOR SEARCH
もFOR ORDER BY
も指定されていない場合、FOR SEARCH
がデフォルトです。
support_number
演算子クラスに関連する関数用のインデックスメソッドのサポートプロシージャの番号です。
function_name
演算子クラス用のインデックスメソッドのサポートプロシージャとなる関数の名前です(スキーマ修飾名でも可)。
argument_type
関数のパラメータのデータ型です。
storage_type
インデックスに実際に格納されるデータ型です。
通常、このデータ型は列のデータ型と同じです。
しかし、異なるデータ型を許可するインデックスメソッドも存在します(現時点ではGiST、GIN、BRIN)。
インデックスメソッドが異なるデータ型の使用を許可していなければ、STORAGE
句を指定してはいけません。
OPERATOR
、FUNCTION
、STORAGE
は任意の順番で記述できます。
インデックス機構は、使用する前に関数に関するアクセス権限を検査しませんので、 関数や演算子を演算子クラスに含めることは、PUBLICに実行権限を与えることと同じです。 通常、演算子クラスで有用な種類の関数ではこれは問題になりません。
演算子はSQL関数で定義してはなりません。 SQL関数は呼び出し元の問い合わせにインライン化されることが多いので、オプティマイザでその問い合わせがインデックスに一致するかどうかを認識できなくなってしまうからです。
PostgreSQL 8.4より前までは、OPERATOR
句にRECHECK
オプションを含めることができました。
インデックス演算子に「損失がある」かどうかは実行時にその場で決定されるようになりましたので、これはサポートされなくなりました。
これにより、演算子に損失があるかもしれないしないかもしれないような場合を効率的に扱うことができるようになりました。
以下のコマンド例では、_int4
データ型(int4
の配列)のGiSTインデックス演算子クラスを定義しています。
この例の詳細については、intarrayモジュールを参照してください。
CREATE OPERATOR CLASS gist__int_ops DEFAULT FOR TYPE _int4 USING gist AS OPERATOR 3 &&, OPERATOR 6 = (anyarray, anyarray), OPERATOR 7 @>, OPERATOR 8 <@, OPERATOR 20 @@ (_int4, query_int), FUNCTION 1 g_int_consistent (internal, _int4, smallint, oid, internal), FUNCTION 2 g_int_union (internal, internal), FUNCTION 3 g_int_compress (internal), FUNCTION 4 g_int_decompress (internal), FUNCTION 5 g_int_penalty (internal, internal, internal), FUNCTION 6 g_int_picksplit (internal, internal), FUNCTION 7 g_int_same (_int4, _int4, internal);
CREATE OPERATOR CLASS
はPostgreSQLの拡張です。
標準SQLにはCREATE OPERATOR CLASS
文はありません。