次に重要なテーブルは、 pg_opclass です。このテーブルは、与えられたインデックスアクセスメソッドでサポートされる演算子クラスそれぞれにに関して、演算子クラス名と入力データ型を定義します。複数の異なるアクセスメソッドに同一のクラス名を使用することができます (例えば、B-tree と ハッシュアクセスメソッドは両方とも oid_ops という名前の演算子クラスを持ちます)が、各アクセスメソッドは pg_opclass の別々の行として現れなければなりません。 pg_opclass 行の OID は、特定の演算子と関連し、その演算子クラスのサポートルーチンをサポートする他のテーブル内で外部キーとして使用されます。
作成した演算子クラスの名前(例えば complex_abs_ops)を pg_opclass に追加する必要があります。
INSERT INTO pg_opclass (opcamid, opcname, opcintype, opcdefault, opckeytype)
VALUES (
(SELECT oid FROM pg_am WHERE amname = 'btree'),
'complex_abs_ops',
(SELECT oid FROM pg_type WHERE typname = 'complex'),
true,
0);
SELECT oid, *
FROM pg_opclass
WHERE opcname = 'complex_abs_ops';
oid | opcamid | opcname | opcintype | opcdefault | opckeytype
--------+---------+-----------------+-----------+------------+------------
277975 | 403 | complex_abs_ops | 277946 | t | 0
(1 row)
追加した pg_opclass の OID は上の例で示した値とは異なります。しかしこれは気にしないで下さい。ここで型の OID を得たのと同じように、この値は後でシステムから得ることができます。
上記の例は、ユーザがこの新しい演算子クラスをcomplex データ型のデフォルトの B-tree演算子クラスにしようとしていると仮定しています。そうでない場合は、単に opcdefault を偽に設定して下さい。 opckeytype についてはここでは説明しません。これは B-tree 演算子クラスでは常に 0 にすべきです。