跳到主要内容
版本:1.0.14

CREATE OPERATOR

CREATE OPERATOR — 定义一个新的操作符

大纲

CREATE OPERATOR name (

{FUNCTION|PROCEDURE} = function_name

[, LEFTARG = left_type ] [, RIGHTARG = right_type ]

[, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]

[, RESTRICT = res_proc ] [, JOIN = join_proc ]

[, HASHES ] [, MERGES ]

)

描述

CREATE OPERATOR定义一个新的操作符 name。定义操作符的用户会成为该操作符的拥有者。如果给出一个模式名,该操作符将被创建在指定的模式中。否则它会被创建在当前模式中。

操作符名称是最多NAMEDATALEN-1(默认为 63)个字符的序列,这些字符可以是:

      • / < > = ~ ! @ #% ^ & | ` ?

对名称的选择有一些限制:

• -- and /*不能出现在 操作符名称中,因为它们会被当做一段注释的开始。

• 多字符操作符名称不能以+或者- 结束,除非该名称也包含至少一个下列字符:

~ ! @ #% ^ & | ` ?

例如,@-是一个被允许的操作符名称,而 *-不是。这种限制允许系统解析 SQL兼容的命令而无需记号之间的空格。

• 将=>用作一个操作符名称已经不被推荐。在未来的发行中可能会被禁用。

在输入时!=会被映射为<>,因此这两个名字总是等效的。

必须至少定义LEFTARG和RIGHTARG中的一个。对于二元操作符,两者都必须被定义。对于右一元操作符,只应该定义 LEFTARG,而对于左一元操作符只应该定义 RIGHTARG。

function_name函数必须在之前已经用CREATE FUNCTION定义好,并且必须被定义为接受正确数量的指定类型的参数。

在CREATE OPERATOR的语法中,关键词FUNCTION和PROCEDURE是等效的,但不管哪种情况下被引用的函数都必须是一个函数而不是过程。这里对关键词PROCEDURE的是用是有历史原因的,现在已经被废弃。

其他子句指定可选的操作符优化子句。

要创建一个操作符,必须具有参数类型和返回类型上的USAGE 特权,以及底层函数上的EXECUTE特权。如果指定了一个交换子或者求反器操作符,必须拥有这些操作符。

参数

name

要定义的操作符的名称。允许使用的字符请见上文。名称可以被模式限定,例如CREATE OPERATOR myschema.+ (...)。如果 没有被模式限定,该操作符将被创建在当前模式中。

如果两个同一模式中的操作符在不同的数据类型上操作,它们可以具有相同的名称。这被称为重载。

function_name

用来实现这个操作符的函数。

left_type

这个操作符的左操作数(如果有)的数据类型。忽略这个选项可以表示一个左一元操作符。

right_type

这个操作符的右操作数(如果有)的数据类型。忽略这个选项可以表示一个右一元操作符。

com_op

这个操作符的交换子。

neg_op

这个操作符的求反器。

res_proc

用于这个操作符的限制选择度估计函数。

join_proc

用于这个操作符的连接选择度估算函数。

HASHES

表示这个操作符可以支持哈希连接。

MERGES

表示这个操作符可以支持归并连接。

要在com_op 或者其他可选参数中给出一个模式限定的操作符名称,请使用OPERATOR()语法,例如:

COMMUTATOR = OPERATOR(myschema.===) ,

注解

无法在CREATE OPERATOR中指定一个操作符的词法优先级,因为解析器的优先级行为是硬写在代码中的。

废弃的选项SORT1、SORT2、 LTCMP以及GTCMP以前被用来指定与支持归并连接的操作符相关的排序操作符的名称。现在不再需要它们了,因为 相关操作符的信息可以在 B-树的操作符族中找到。如果给出了这些选项 之一,它会被忽略(除非是为了隐式设置MERGES为真)。

使用DROP OPERATOR从数据库中删除用户定义的操作符。使用ALTER OPERATOR修改数据库中的操作符。

示例

下面的命令为数据类型box定义了一种新的操作符--面积相等:

CREATE OPERATOR === (

LEFTARG = box,

RIGHTARG = box,

FUNCTION = area_equal_function,

COMMUTATOR = ===,

NEGATOR = !==,

RESTRICT = area_restriction_function,

JOIN = area_join_function,

HASHES, MERGES

);

另见

ALTER OPERATOR, CREATE OPERATOR CLASS, DROP OPERATOR