CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method AS { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ RECHECK ] | FUNCTION support_number funcname ( argument_type [, ...] ) | STORAGE storage_type } [, ... ]
CREATE OPERATOR CLASS 定义一个新的操作符类。一个操作符类定义一种特定的数据类型如何与一种索引一起使用。操作符类声明特定的操作符可以为这种数据类型以及这种索引方法填充特定的角色或者"策略"。操作符类还声明索引方法在为一个索引字段选定该操作符类的时候要使用的支持过程。所有操作符类使用的函数和操作符都必须在创建操作符类之前定义。
如果给出了模式名字,那么操作符类就在指定的模式中创建。否则就在当前模式中创建。在同一个模式中的两个操作符类可以有同样的名字,但它们必须用于不同的索引方法。
定义操作符类的用户将成为其所有者。目前,创造者必须是超级用户。作这样的限制是因为一个有问题的操作符类定义会让服务器困惑,甚至崩溃。
CREATE OPERATOR CLASS 既不检查这个类定义是否包含所有索引方法需要的操作符以及函数,也不检查这些操作符和函数是否形成一个自包含的集合。定义一个合法的操作符类是用户的责任。
参考节33.14获取更多信息。
将要创建的操作符类的名字(可以用模式修饰)
表示该操作符类将成为它的数据类型的缺省操作符类。对于某个数据类型和访问方式而言,最多有一个操作符类是缺省的。
这个操作符类处理的字段的数据类型
这个操作符类处理的索引方法的名字
一个操作符和这个操作符类关联的索引方法的策略数
一个和该操作符类关联的操作符的名字(可以用模式修饰)
一个操作符的输入数据类型,或者是 NONE 表示左目或者右目操作符。通常情况下可以省略输入数据类型,因为这个时候它们和操作符类的数据类型相同。
如果出现,那么索引对这个操作符是"有损耗的",因此,使用这个索引检索的行必须重新检查,以保证它们真正满足和此操作符相关的条件子句。
索引方法对一个与操作符类关联的函数的支持过程数
一个函数的名字(可以有模式修饰),这个函数是索引方法对此操作符类的支持过程。
函数参数的数据类型
实际存储在索引里的数据类型。通常它和字段数据类型相同,但是一些索引方法(到目前为止只有 GIN 和 GiST)允许它是不同的。除非索引方法允许使用一种不同的类型,否则必须省略 STORAGE 子句。
OPERATOR, FUNCTION, STORAGE 子句可以按照任意顺序出现。
因为索引机制不在使用函数前检查其访问机制,在操作符类中包含操作符或者函数等价于授权给所有人执行权限。这对于那些用于操作符类的函数通常不会导致什么问题。
操作符不应该用 SQL 函数定义。一个 SQL 函数很可能是内联到调用它的查询里面,这样将阻止优化器识别这个查询是否可以使用索引。
下面的例子命令为数据类型 _int4(int4 数组)定义了一个 GiST 索引操作符类。参阅 contrib/intarray/ 获取完整的例子。
CREATE OPERATOR CLASS gist__int_ops DEFAULT FOR TYPE _int4 USING gist AS OPERATOR 3 &&, OPERATOR 6 = RECHECK, OPERATOR 7 @>, OPERATOR 8 <@, OPERATOR 20 @@ (_int4, query_int), FUNCTION 1 g_int_consistent (internal, _int4, int4), FUNCTION 2 g_int_union (bytea, 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);