CREATE OPERATOR

创建运算符—定义一个新运算符

Synopsis

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

Description

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

操作员名称是以下列表中最多NAMEDATALEN -1(默认为 63)个字符的序列:

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

您选择名称时有一些限制:

  • --/*不能出现在操作员名称的任何位置,因为它们将被视为 Comments 的开头。

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

~ ! @ # % ^ & | ` ?

例如,@-是允许的运算符名称,而*-不是。此限制使 PostgreSQL 可以解析与 SQL 兼容的命令,而无需在标记之间使用空格。

  • 不建议使用=>作为操作员名称。在将来的版本中可能完全不允许使用它。

Importing 时会将运算符!=Map 到<>,因此这两个名称始终相等。

必须定义LEFTARGRIGHTARG中的至少一个。对于二进制运算符,必须同时定义两者。对于右一元运算符,仅应定义LEFTARG,而对于左一元运算符,仅应定义RIGHTARG

  • function_name *函数必须事先使用CREATE FUNCTION定义,并且必须定义为接受所指示类型的正确数量的参数(一个或两个)。

CREATE OPERATOR的语法中,关键字FUNCTIONPROCEDURE是等效的,但是在任何情况下,引用的函数都必须是函数,而不是过程。关键字PROCEDURE的使用在历史上已被弃用。

其他子句指定可选的运算符优化子句。 Section 38.14中详细说明了它们的含义。

为了能够创建运算符,您必须在参数类型和返回类型上具有USAGE特权,并且在基础函数上必须具有EXECUTE特权。如果指定了换向或负运算符,则您必须拥有这些运算符。

Parameters

  • name

    • 要定义的运算符的名称。有关允许的字符,请参见上文。该名称可以是模式限定的,例如CREATE OPERATOR myschema.+ (...)。如果不是,则在当前架构中创建运算符。如果同一模式中的两个运算符对不同的数据类型进行运算,则它们可以具有相同的名称。这称为* overloading *。
  • function_name

    • 用于实现此运算符的函数。
  • left_type

    • 运算符的左操作数的数据类型(如果有)。左一元运算符将忽略此选项。
  • right_type

    • 运算符的右操作数的数据类型(如果有)。一元一元运算符将忽略此选项。
  • com_op

    • 该运算符的换向器。
  • neg_op

    • 该运算符的取反器。
  • res_proc

    • 此运算符的限制选择性估计函数。
  • join_proc

    • 此运算符的联接选择性估计器函数。
  • HASHES

    • 表示此运算符可以支持哈希联接。
  • MERGES

    • 表示该操作员可以支持合并联接。

要在* com_op *或其他可选参数中提供模式限定的运算符名称,请使用OPERATOR()语法,例如:

COMMUTATOR = OPERATOR(myschema.===) ,

Notes

有关更多信息,请参考Section 38.13

无法在CREATE OPERATOR中指定运算符的词法优先级,因为解析器的优先级行为是固定的。有关优先级的详细信息,请参见Section 4.1.6

过时的选项SORT1SORT2LTCMPGTCMP以前用于指定与可合并合并运算符关联的排序运算符的名称。这不再是必需的,因为有关关联的运算符的信息是通过查看 B 树运算符族来找到的。如果给出了这些选项之一,则将其忽略,除非隐式设置MERGES true。

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

Examples

以下命令为数据类型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
);

Compatibility

CREATE OPERATOR是 PostgreSQL 扩展。 SQL 标准中没有针对用户定义的运算符的规定。

See Also

ALTER OPERATOR, 创建操作员班, DROP OPERATOR