Skip to content

CREATE OPERATOR

CREATE OPERATOR — 定义一个新操作符

语法

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 ]
)

说明

CREATE OPERATOR定义一个新操作符*name*。定义操作符的用户将成为其所有者。如果给出了架构名称,则该操作符将在指定的架构中创建。否则,它将在当前架构中创建。

操作符名称是由以下列表中的最多NAMEDATALEN-1(默认情况下为 63)个字符组成的序列

      • / < > = ~ ! @ # % ^ & | ` ?

对您的名称选择有一些限制

  • --/* 无法出现在操作符名称中的任何位置,因为它们将被视为注释的开始。

  • 多字符运算符名称不能以 +- 结尾,除非名称还包含至少一个这些字符


    ~ ! @ # % ^ & | ` ?

    例如,@- 是一个允许的运算符名称,但 *- 不是。此限制允许 PostgreSQL 解析符合 SQL 的命令,而无需在标记之间添加空格。

  • 符号 => 由 SQL 语法保留,因此不能用作运算符名称。

运算符!=在输入时映射到<>,因此这两个名称始终相等。

对于二元运算符,必须定义LEFTARGRIGHTARG。对于前缀运算符,只应定义RIGHTARG。*function_name*函数必须先前已使用CREATE FUNCTION定义,并且必须定义为接受指定类型的正确数量(一个或两个)的参数。

CREATE OPERATOR的语法中,关键字FUNCTIONPROCEDURE是等效的,但引用的函数在任何情况下都必须是函数,而不是过程。此处使用关键字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 节

过时的选项SORT1SORT2LTCMPGTCMP以前用于指定与可合并联接运算符关联的排序运算符的名称。现在不再需要这样做,因为有关关联运算符的信息是通过查看 B 树运算符族来查找的。如果给出了其中一个选项,除了隐式设置MERGES为 true 之外,它将被忽略。

使用DROP OPERATOR从数据库中删除用户定义的运算符。使用ALTER OPERATOR修改数据库中的运算符。

示例

以下命令为数据类型box定义了一个新运算符 area-equality

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 标准中没有关于用户定义运算符的规定。

另请参阅

ALTER OPERATORCREATE OPERATOR CLASSDROP OPERATOR