CREATE OPERATOR CLASS

定义一个新的运算符类。

概要

CREATE OPERATOR CLASS <name> [DEFAULT] FOR TYPE <data_type>  
  USING <index_method> [ FAMILY <family_name> ] AS 
  { OPERATOR <strategy_number> <operator_name> [ ( <op_type>, <op_type> ) ] [ FOR SEARCH | FOR ORDER BY <sort_family_name> ]
  | FUNCTION <support_number> [ ( <op_type> [ , <op_type> ] ) ] <function_name> (<argument_type> [, ...] )
  | STORAGE <storage_type>
  } [, ... ]

描述

CREATE OPERATOR CLASS 创建一个新的运算符类。运算符类定义特定数据类型如何与索引配合使用。该类指定某些运算符将在此数据类型和索引方法中承担特定角色或策略,同时规定当索引列选用该运算符类时,索引方法应调用的支持函数。操作符类使用的所有操作符和函数必须在创建操作符类之前定义。用于实现操作符类的任何函数都必须定义为IMMUTABLE。

若指定模式名称,则操作符类将在指定模式中创建;否则创建于当前模式。同一模式中两个操作符类仅当它们对应不同索引方法时才能使用相同名称。

定义运算符类的用户将成为其所有者。目前,创建者必须是超级用户。(此限制是因为错误的运算符类定义可能导致服务器混乱甚至崩溃。)

CREATE OPERATOR CLASS 语法目前不会检查运算符类定义是否包含索引方法所需的所有运算符和函数,也不会验证这些运算符与函数是否构成自洽集合。用户有责任确保所定义的运算符类有效。

相关运算符类可归入运算符家族。若要在现有家族中添加新运算符类,请在CREATE OPERATOR CLASS语句中指定FAMILY选项。若未指定该选项,新类将被置于与之同名的家族中(若该家族不存在,数据库将自动创建)。

参数

  • name

    • 要定义的运算符类的名称(可选带模式限定)。同一模式中两个运算符类仅当它们对应不同的索引方法时才能具有相同名称。
  • DEFAULT

    • 若存在,则将该运算符类设为其数据类型的默认运算符类。对于特定数据类型和索引方法,最多只能有一个运算符类作为默认值。
  • data_type

    • 此运算符类所适用的列数据类型。
  • index_method

    • 此操作符类所对应的索引方法名称。
  • family_name

    • 要添加此操作符类的现有操作符家族名称。若未指定,则使用与操作符类同名的家族(若不存在则创建该家族)。
  • strategy_number

    • 索引方法的策略编号,用于标识与操作符类关联的操作符。操作符类关联的操作符通过策略编号进行标识,这些编号用于在操作符类上下文中识别每个操作符的语义。
  • operator_name

    • 与操作符类关联的操作符名称(可选带模式限定)。
  • op_type

    • 在OPERATOR子句中,指定运算符的操作数数据类型,或使用NONE表示左单项运算符或右单项运算符。当操作数数据类型与运算符类的数据类型相同时,通常可省略操作数数据类型。

    • 在FUNCTION子句中,若函数支持的操作数数据类型与函数的输入数据类型(针对B树比较函数和哈希函数)或类的数据类型(针对B树排序支持函数以及GiST、SP-GiST、GIN和BRIN运算符类中的所有函数)不同,则需指定该操作数数据类型。这些默认值是正确的,因此在FUNCTION子句中无需指定op_type,除非该B树排序支持函数旨在支持跨数据类型比较。

  • sort_family_name

    • 现有 B 树运算符家族的名称(可选带模式限定),该家族描述了与排序运算符关联的排序顺序。

    • 如果既未指定 FOR SEARCH 也未指定 FOR ORDER BY,则默认使用 FOR SEARCH。

  • support_number

    • 索引方法中与操作符类关联的函数的支持函数编号。
  • function_name

    • 作为操作符类索引方法支持函数的函数名称(可选带模式限定)。
  • argument_type

    • 函数的参数数据类型。
  • storage_type

    • 索引中实际存储的数据类型。通常与列数据类型相同,但某些索引方法(当前包括GiST、GIN和BRIN)允许其不同。除非索引方法允许使用不同类型,否则必须省略STORAGE子句。若列data_type指定为anyarray,则storage_type可声明为anyelement,以表明索引条目属于为特定索引创建的实际数组类型对应的元素类型成员。 OPERATOR、FUNCTION 和 STORAGE 子句可以以任意顺序出现。

注意

由于索引机制在使用函数前不会检查访问权限,因此将函数或运算符包含在运算符类中,等同于授予其公共执行权限。对于运算符类中常用的函数类型而言,这通常不会构成问题。

操作符不应通过SQL函数定义。SQL函数很可能被内联到调用查询中,这将阻止优化器识别该查询与索引匹配。

用于实现操作符类的任何函数都必须定义为IMMUTABLE。

在数据库 6.0 之前,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 是数据库扩展功能。SQL 标准中不存在 CREATE OPERATOR CLASS 语句。

另见

ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY, CREATE FUNCTION