CREATE OPERATOR CLASS — 定义一个新的操作符类
CREATE OPERATOR CLASSname[ DEFAULT ] FOR TYPEdata_typeUSINGindex_method[ FAMILYfamily_name] AS { OPERATORstrategy_numberoperator_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 创建一个新的操作符类。操作符类定义一种特定的数据类型如何与索引一起使用。操作符类指定某些操作符将为该数据类型和该索引方法充当特定的角色或“策略”。当为索引列选择该操作符类时,操作符类还指定该索引方法要使用的支持函数。在该操作符类被创建之前,它用到的所有操作符和函数都必须已经定义。
如果给出了模式名,则该操作符类会在指定的模式中创建。否则,它会在当前模式中创建。同一模式中的两个操作符类只有在针对不同索引方法时才能具有相同的名称。
定义操作符类的用户将成为其拥有者。目前,创建用户必须是超级用户。(做出这一限制是因为错误的操作符类定义可能会使服务器混乱甚至崩溃。)
目前,CREATE OPERATOR CLASS 不会检查操作符类定义是否包含索引方法所需的全部操作符和函数,也不会检查这些操作符和函数是否构成一个自洽的集合。定义一个有效的操作符类是用户自己的责任。
相关的操作符类可以被分组到操作符族中。要向现有的操作符族添加一个新的操作符类,请指定 FAMILY 选项,该选项位于 CREATE OPERATOR CLASS 中。如果没有此选项,新类会被放入一个与新类同名的操作符族中(如果该操作符族尚不存在,则创建它)。
更多信息请参阅 Section 36.16。
name要创建的操作符类的名称。名称可以带模式限定。
DEFAULT如果指定,该操作符类将成为其数据类型的默认操作符类。对于特定的数据类型和索引方法,最多只能有一个操作符类作为默认。
data_type此操作符类所针对的列数据类型。
index_method此操作符类所针对的索引方法的名称。
family_name要将此操作符类加入的现有操作符族的名称。如果未指定,则使用与该操作符类同名的操作符族(如果它尚不存在,则创建它)。
strategy_number与操作符类相关联的一个操作符的索引方法策略号。
operator_name与操作符类相关联的一个操作符的名称(可以选择带模式限定)。
op_type 在 OPERATOR 子句中,表示该操作符的操作数数据类型,或者用 NONE 表示前缀操作符。在操作数数据类型与操作符类的数据类型相同的常见情况下,可以省略操作数数据类型。
在 FUNCTION 子句中,表示该函数旨在支持的操作数数据类型,适用于它与函数的输入数据类型(对于 B-tree 比较函数和哈希函数)或该类的数据类型(对于 B-tree 排序支持函数、B-tree 相等映像函数以及 GiST、SP-GiST、GIN 和 BRIN 操作符类中的所有函数)不同的情况。这些默认值是正确的,因此 op_type 无需在 FUNCTION 子句中指定,除非是打算支持跨数据类型比较的 B-tree 排序支持函数。
sort_family_name 一个现有 btree 操作符族的名称(可以选择带模式限定),该操作符族描述与排序操作符相关联的排序顺序。
如果既未指定 FOR SEARCH 也未指定 FOR ORDER BY,则默认为 FOR SEARCH。
support_number与操作符类相关联的一个函数的索引方法支持函数号。
function_name作为该操作符类的索引方法支持函数的一个函数的名称(可以选择带模式限定)。
argument_type该函数的参数数据类型。
storage_type 实际存储在索引中的数据类型。通常它与列数据类型相同,但某些索引方法(目前为 GiST、GIN、SP-GiST 和 BRIN)允许它不同。除非索引方法允许使用不同的类型,否则必须省略 STORAGE 子句。如果列 data_type 被指定为 anyarray,则 storage_type 可以被声明为 anyelement,以表明索引条目是属于每个特定索引所针对的实际数组类型的元素类型的成员。
OPERATOR、FUNCTION 和 STORAGE 子句可以按任意顺序出现。
由于索引机制在使用函数之前不会检查对函数的访问权限,因此将一个函数或操作符包含在操作符类中就等同于授予公众对它的执行权限。对于在操作符类中有用的那几类函数来说,这通常不是问题。
操作符不应由 SQL 函数来定义。SQL 函数很可能会被内联到调用它的查询中,这会阻止优化器识别出该查询匹配某个索引。
下面的示例命令为数据类型 _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 语句。