Postgresql 中文操作指南

CREATE OPERATOR

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)个字符的序列:

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

对于你的姓名选择有一些限制:

~ ! @ # % ^ & | ` ?

在输入中,操作符 != 映射到 <> ,所以这两个名称总是等效的。

对于二元操作符, LEFTARGRIGHTARG 必须都已定义。对于前缀操作符,仅 RIGHTARG 应该已定义。 function_name 函数必须已经使用 CREATE FUNCTION 进行了定义,且必须定义为接受指定类型的正确数量(一或两个)的参数。

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

其他子句指定可选操作符优化子句。它们的含义在 Section 38.15 中有详细说明。

若要能够创建操作符,你必须具有对参数类型和返回类型的 USAGE 权限,以及对基础函数的 EXECUTE 权限。如果指定了交换器或否定器操作符,你必须拥有这些操作符。

Parameters

  • name

    • 要定义的操作符的名称。请参阅上面允许的字符。该名称可以是模式限定的,例如 CREATE OPERATOR myschema.+ (&#8230;&#8203;) 。如果不是,则该操作符将在当前模式中创建。同一个模式中的两个操作符如果在不同的数据类型上操作,则可以有相同的名称。这称为 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.14

无法在 CREATE OPERATOR 中指定操作符的词法优先级,因为解析器的优先级行为是硬编码的。有关优先级详情,请参阅 Section 4.1.6

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

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

Examples

以下命令为数据类型 ALTER OPERATOR 定义了一个新运算符,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

box 是一个 PostgreSQL 扩展。在 SQL 标准中没有规定用户自定义运算符。

See Also

CREATE OPERATORALTER OPERATORCREATE OPERATOR CLASS