ALTER OPERATOR FAMILY

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 ] ) ] funcname ( 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

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 目前不检测操作符族 定义是否包括该索引方法所要求的所有操作符和函数,也不检查操作符和函数是 否形成了一个有理的集合。定义合法的操作符族是用户的责任。

OPERATORFUNCTION子句可以以任何顺序出现。

参数

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

兼容性

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

注意

注意DROP语法只通过策略或者支持号以及输入数据类型指定该 操作符族中的"slot"。占用这个槽的操作符或函数的名称不会被提及。还有,对于DROP FUNCTION要指定的类型是该函数意图支持 的输入数据类型; 对于SP_GiSTGIN索引可能无需对该函数的实际输入参数类型做任何事情。

因为索引机制在使用函数之前不会检查其上的访问权限,包括一个操作符族中的 函数或操作符都等同于授予了其上的公共执行权限。这对于操作符族中很有用的 这类函数来说,这通常不成问题。

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

在Greenplum Database 6.0之前, OPERATOR 子句可以包括一个RECHECK 选项。 这个选项不再被支持了。Greenplum数据库现在运行中决定一个索引操作符是否是动态有损,这将允许更多有效处理那些操作符的是否有损的情况。

示例

下列示例命令为一个操作符族增加跨数据类型的操作符和支持函数,该操 作符族已经包含用于数据类型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) ;