CREATE OPERATOR
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 中的一个。对于二元操作符,必须同时定义两者。对于右一元操作符,只应定义 LEFTARG;对于左一元操作符,只应定义 RIGHTARG。
注意
右一元操作符(也称后缀操作符)已被弃用,将在 PostgreSQL 14 中移除。
function_name 函数必须事先已用 CREATE
FUNCTION 定义,并且其定义必须接受正确数量(一个或两个)的指定类型参数。
在 CREATE OPERATOR 的语法中,关键字
FUNCTION 和 PROCEDURE 是等效的,但这里引用的对象无论如何都必须是函数而不是过程。此处使用关键字
PROCEDURE 是历史遗留做法,现已弃用。
其他子句用于指定可选的操作符优化子句。其含义详见第 37.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.===) ,
注解
更多信息请参见第 37.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
标准中没有用户定义操作符的规定。