CREATE OPERATOR — 定义一个新的操作符
CREATE OPERATORname
( {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)个字符的序列:
+ - * / < > = ~ ! @ # % ^ & | ` ?
对名称的选择有一些限制:
--
和/*
不能出现在操作符名称的任何位置,
因为它们将被视为注释的开始。
多字符操作符名称不能以+
或-
结尾,
除非名称还包含至少一个这些字符:
~ ! @ # % ^ & | ` ?
例如,@-
是一个允许的操作符名称,
但*-
不是。
这个限制允许PostgreSQL解析符合SQL标准的命令,而不需要在标记之间添加空格。
符号=>
被SQL语法保留,因此不能用作操作符名称。
在输入时!=
会被映射为<>
,
因此这两个名字总是等效的。
对于二元运算符,必须同时定义LEFTARG
和RIGHTARG
。
对于前缀运算符,仅应定义RIGHTARG
。
function_name
函数
必须在之前已经用CREATE FUNCTION
定义好,
并且必须被定义为接受正确数量的指定类型的参数。
在CREATE OPERATOR
的语法中,关键词FUNCTION
和PROCEDURE
是等效的,但不管哪种情况下被引用的函数都必须是一个函数而不是过程。这里对关键词PROCEDURE
的是用是有历史原因的,现在已经被废弃。
其他子句指定可选的操作符优化子句。它们的含义在 第 38.15 节中有详细描述。
要创建一个操作符,必须具有参数类型和返回类型上的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.===) ,
进一步的信息可参考第 38.14 节。
无法在CREATE OPERATOR
中指定一个操作符的
词法优先级,因为解析器的优先级行为是硬写在代码中的。详见
第 4.1.6 节。
废弃的选项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 );
CREATE OPERATOR
是一种
PostgreSQL扩展。在 SQL
标准中没有用户定义操作符的规定。