CREATE OPERATOR
CREATE OPERATOR — 定义一个新的操作符
大纲
CREATE OPERATORname( PROCEDURE =funcname[, LEFTARG =lefttype] [, RIGHTARG =righttype] [, COMMUTATOR =com_op] [, NEGATOR =neg_op] [, RESTRICT =res_proc] [, JOIN =join_proc] [, HASHES ] [, MERGES ] [, SORT1 =left_sort_op] [, SORT2 =right_sort_op] [, LTCMP =less_than_op] [, GTCMP =greater_than_op] )
描述
CREATE OPERATOR定义一个新的操作符
name。定义该操作符的用户将成为其拥有者。如果给出了模式名,该操作符将在指定的模式中创建;否则将在当前模式中创建。
操作符名称是一个字符序列,最多包含 NAMEDATALEN-1 个字符(默认为 63 个),字符取自以下列表:
+ - * / < > = ~ ! @ # % ^ & | ` ?
名称的选择有以下几项限制:
--和/*不能出现在操作符名称的任何位置,因为它们会被视为注释的开始。多字符操作符名称不能以
+或-结尾,除非该名称中还至少包含下列字符之一:~ ! @ # % ^ & | ` ?
例如,
@-是允许的操作符名称,而*-则不允许。这一限制使 PostgreSQL能够在不要求记号之间必须有空格的情况下解析符合 SQL 规范的命令。
输入!=时会被映射为<>,因此这两个名称始终等效。
必须至少定义LEFTARG和RIGHTARG中的一个。对于二元操作符,必须同时定义两者。对于右一元操作符,只应定义LEFTARG;对于左一元操作符,只应定义RIGHTARG。
funcname过程必须事先已用CREATE
FUNCTION定义,并且其定义必须接受正确数量(一个或两个)的指定类型参数。
其他子句用于指定可选的操作符优化属性。其含义详见第 31.13 节。
参数
name要定义的操作符名称。允许使用的字符请见上文。该名称可以带模式限定,例如
CREATE OPERATOR myschema.+ (...)。如果不带模式限定,该操作符将在当前模式中创建。同一模式中的两个操作符如果针对不同的数据类型进行操作,可以具有相同的名称。这被称为重载。funcname用于实现该操作符的函数。
lefttype该操作符左操作数的数据类型(如果有)。对于左一元操作符,应省略此选项。
righttype该操作符右操作数的数据类型(如果有)。对于右一元操作符,应省略此选项。
com_op该操作符的交换子。
neg_op该操作符的求反器。
res_proc该操作符的限制选择度估计函数。
join_proc该操作符的连接选择度估算函数。
HASHES表示该操作符可以支持哈希连接。
MERGES表示该操作符可以支持归并连接。
left_sort_op如果该操作符能支持归并连接,则为对该操作符左手数据类型排序的小于操作符。
right_sort_op如果该操作符能支持归并连接,则为对该操作符右手数据类型排序的小于操作符。
less_than_op如果该操作符能支持归并连接,则为比较该操作符输入数据类型的小于操作符。
greater_than_op如果该操作符能支持归并连接,则为比较该操作符输入数据类型的大于操作符。
要在com_op或其他可选参数中给出带模式限定的操作符名称,请使用OPERATOR()语法,例如:
COMMUTATOR = OPERATOR(myschema.===) ,
示例
以下命令定义一个新的面积相等操作符,适用的数据类型为 box:
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
PROCEDURE = area_equal_procedure,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_procedure,
JOIN = area_join_procedure,
HASHES, MERGES
);兼容性
CREATE OPERATOR是
PostgreSQL扩展。在 SQL
标准中没有用户定义操作符的规定。