# 创建运算符
创建运算符-定义新运算符
# 提要
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 ]
)
# 描述
创建运算符
定义一个新操作符,名称
.定义运算符的用户成为其所有者。如果给定了架构名称,则在指定的架构中创建运算符。否则,它将在当前架构中创建。
运算符名称是一个序列,最多包含NAMEDATALEN
-以下列表中的1(默认为63)个字符:
+-*/ \<>=~! @ # % ^ & | ` ?
对你的名字选择有一些限制:
--
和/*
不能出现在操作员名称中的任何位置,因为它们将作为注释的开头。多字符运算符名称不能以结尾
+
或-
,除非名称还包含以下至少一个字符:~ ! @ # % ^ & | ` ?
例如
@-
是允许的操作员名称,但*-
事实并非如此。此限制允许PostgreSQL解析符合SQL的命令,而不需要标记之间的空格。使用
=>
因为不推荐使用操作员名称。在未来的版本中,它可能会被完全禁止。接线员
!=
映射到<>
在输入时,这两个名称总是相等的。对于二进制运算符,两者都是
左撇子
和对
必须定义。仅适用于前缀运算符对
应该被定义。这个*函数名
*函数之前必须使用创建函数
并且必须定义为接受指定类型中正确数量的参数(一个或两个)。用
创建运算符
,关键字作用
和程序
是等效的,但引用的函数在任何情况下都必须是函数,而不是过程。关键词的使用程序
这是一本历史性的、不推荐的书。其他子句指定可选的运算符优化子句。它们的含义详见第38.15节.
要创建运算符,必须具有
用法
参数类型和返回类型的权限,以及处决
基础函数的特权。如果指定了换向器或求反运算符,则必须拥有这些运算符。
# 参数
名称
要定义的运算符的名称。有关允许的字符,请参见上文。例如,名称可以是模式限定的创建运算符myschema+(...)
。如果不是,则在当前架构中创建运算符。如果同一架构中的两个运算符对不同的数据类型进行操作,则它们可以具有相同的名称。这叫做超载.
函数名
用于实现此运算符的函数。
左_型
运算符左操作数的数据类型(如果有)。对于前缀运算符,此选项将被忽略。
右型
运算符右操作数的数据类型。
康普
这个算符的换向器。
内格罗普
这个运算符的否定子。
res_proc
该算子的约束选择性估计函数。
加入程序
这个算子的连接选择性估计函数。
散列
指示此运算符可以支持哈希联接。
合并
指示此运算符可以支持合并联接。
在中提供架构限定运算符名称*康普
*或者其他可选参数,使用操作员()
语法,例如:
COMMUTATOR = OPERATOR(myschema.===) ,
# 笔记
提到第38.14节了解更多信息。
无法在中指定运算符的词法优先级创建运算符
,因为解析器的优先级行为是硬连接的。看见第4.1.6节有关优先顺序的详细信息。
过时的选项SORT1
, SORT2
, LTCMP
和GTCMP
以前用于指定与合并可接合运算符关联的排序运算符的名称。这不再是必要的,因为有关关联运算符的信息是通过查看B-树运算符族找到的。如果给定了其中一个选项,则会忽略该选项,但隐式设置除外合并
符合事实的
使用接线员
从数据库中删除用户定义的运算符。使用变换运算符
修改数据库中的运算符。
# 例子
以下命令为数据类型定义了一个新的运算符area equality盒
:
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
FUNCTION = area_equal_function,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_function,
JOIN = area_join_function,
HASHES, MERGES
);
# 兼容性
创建运算符
是一个PostgreSQL扩展。SQL标准中没有关于用户定义运算符的规定。