# 创建运算符

创建运算符-定义新运算符

# 提要

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, LTCMPGTCMP以前用于指定与合并可接合运算符关联的排序运算符的名称。这不再是必要的,因为有关关联运算符的信息是通过查看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标准中没有关于用户定义运算符的规定。

# 另见

变换运算符, 创建操作符类, 接线员