ALTER OPERATOR FAMILY

更改操作符族的定义。

概要

ALTER OPERATOR FAMILY <name> USING <index_method> ADD
  {  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> [, ...] )
  } [, ... ]

ALTER OPERATOR FAMILY <name> USING <index_method> DROP
  {  OPERATOR <strategy_number> ( <op_type> [ , <op_type> ] ) 
    | FUNCTION <support_number> ( <op_type> [ , <op_type> ] ) 
  } [, ... ]

ALTER OPERATOR FAMILY <name> USING <index_method> RENAME TO <new_name>

ALTER OPERATOR FAMILY <name> USING <index_method> OWNER TO { <new_owner> | CURRENT_USER | SESSION_USER }

ALTER OPERATOR FAMILY <name> USING <index_method> SET SCHEMA <new_schema>

描述

ALTER OPERATOR FAMILY 用于更改运算符家族的定义。您可以向家族添加运算符和辅助函数,从家族中移除它们,或更改家族名称或所有者。

当使用 ALTER OPERATOR FAMILY 将运算符和辅助函数添加到家族时,它们不属于家族内任何特定的运算符类,而只是“松散”地存在于家族中。这表明这些运算符和函数兼容该家族的语义,但并非特定索引正确运行的必需组件。(必需的运算符和函数应声明为运算符类的一部分,详见 CREATE OPERATOR CLASS。) 可随时从家族中删除松散成员,但操作符类的成员必须连同整个类及其依赖索引一并删除。通常,单数据类型操作符和函数属于操作符类,因其用于支持特定数据类型的索引;而跨数据类型操作符和函数则作为家族的松散成员存在。

必须具备超级用户权限才能使用 ALTER OPERATOR FAMILY 命令。(此限制源于错误的操作符家族定义可能导致服务器混乱甚至崩溃。)

当前 ALTER OPERATOR FAMILY 不会检查运算符家族定义是否包含索引方法所需的所有运算符和函数,也不会验证这些运算符和函数是否构成自洽集合。用户有责任定义有效的运算符家族。

参数

  • name
    • 现有操作符家族的名称(可选带模式限定)。
  • index_method
    • 此操作符家族对应的索引方法名称。
  • strategy_number
    • 操作符家族关联操作符在索引方法中的策略编号。
  • operator_name
    • 与该操作符族相关的一个操作符的名称(可以是模式限定的)。
  • op_type
    • 在一个OPERATOR子句中指定该操作符的操作数数据类型, 或者用NONE来表示一个左一元或者右一元操作符。不同于 CREATE OPERATOR CLASS中类似的语法,操作数数据 类型总是必须被指定。
    • 在一个ADD FUNCTION子句中指定该函数意图支持的操作数 数据类型(如果不同于该函数的输入数据类型)。对于 B-树比较函数和哈希 函数,有必要指定op_type,因为该函数的输入数据类型 总是正确的。对于 B-树排序支持函数和 GiST、SP-GiST 和 GIN 操作符类中 的所有函数,有必要指定该函数要使用的操作数数据类型。
    • 在一个DROP FUNCTION子句中,必须指定该函数要支持的操 作数数据类型。
  • sort_family_name
    • 一个现有btree操作符族的名称(可能是模式限定的), 它描述与一个排序操作符相关的排序顺序。
    • 如果既没有指定FOR SEARCH也没有指定FOR ORDER BY, 默认值是FOR SEARCH。
  • support_number
    • 一个与该操作符族相关的函数的索引方法支持过程编号。
  • function_name
    • 作为该操作符族的一种索引方法支持过程的函数的名称(可以是模式限定的)。 如果没有指定参数列表,则该名称必须在其模式中唯一。
  • argument_type
    • 该函数的参数数据类型。
  • new_name
    • 该操作符族的新名称。
  • new_owner
    • 该操作符族的新拥有者。
  • new_schema
    • 该操作符族的新模式。

OPERATOR 和 FUNCTION子句可以以任何顺序出现。

注意

请注意,DROP 语法仅通过策略或支持编号及输入数据类型来指定运算符家族中的“slot”,并未提及占据该槽位的运算符或函数名称。此外,对于 DROP FUNCTION,需指定的类型是函数计划支持的输入数据类型。对于 GiST、SP_GiST 和 GIN 索引,可能无需对该函数的 实际输入参数类型做任何事情。

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

运算符不应通过 SQL 函数定义。SQL 函数很可能被内联到调用查询中,这将导致优化器无法识别查询与索引的匹配关系。

示例

下列示例命令为一个操作符族增加跨数据类型的操作符和支持函数,该操作符族已经包含用于数据类型int4以及int2的 B-树 操作符类。

ALTER OPERATOR FAMILY integer_ops USING btree ADD

  -- int4 vs int2
  OPERATOR 1 < (int4, int2) ,
  OPERATOR 2 <= (int4, int2) ,
  OPERATOR 3 = (int4, int2) ,
  OPERATOR 4 >= (int4, int2) ,
  OPERATOR 5 > (int4, int2) ,
  FUNCTION 1 btint42cmp(int4, int2) ,

  -- int2 vs int4
  OPERATOR 1 < (int2, int4) ,
  OPERATOR 2 <= (int2, int4) ,
  OPERATOR 3 = (int2, int4) ,
  OPERATOR 4 >= (int2, int4) ,
  OPERATOR 5 > (int2, int4) ,
  FUNCTION 1 btint24cmp(int2, int4) ;

再次移除这些项:

ALTER OPERATOR FAMILY integer_ops USING btree DROP

  -- int4 vs int2
  OPERATOR 1 (int4, int2) ,
  OPERATOR 2 (int4, int2) ,
  OPERATOR 3 (int4, int2) ,
  OPERATOR 4 (int4, int2) ,
  OPERATOR 5 (int4, int2) ,
  FUNCTION 1 (int4, int2) ,

  -- int2 vs int4
  OPERATOR 1 (int2, int4) ,
  OPERATOR 2 (int2, int4) ,
  OPERATOR 3 (int2, int4) ,
  OPERATOR 4 (int2, int4) ,
  OPERATOR 5 (int2, int4) ,
  FUNCTION 1 (int2, int4) ;

兼容性

在 SQL 标准中没有 ALTER OPERATOR FAMILY语句。

另见

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