On this page
CREATE OPERATOR
创建运算符—定义一个新运算符
Synopsis
CREATE OPERATOR name (
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 到<>
,因此这两个名称始终相等。
必须定义LEFTARG
和RIGHTARG
中的至少一个。对于二进制运算符,必须同时定义两者。对于右一元运算符,仅应定义LEFTARG
,而对于左一元运算符,仅应定义RIGHTARG
。
function_name
*过程必须事先使用CREATE FUNCTION
定义,并且必须定义为接受所指示类型的正确数量的参数(一个或两个)。
其他子句指定可选的运算符优化子句。 Section 37.13中详细说明了它们的含义。
为了能够创建运算符,您必须在参数类型和返回类型上具有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 37.12。
无法在CREATE OPERATOR
中指定运算符的词法优先级,因为解析器的优先级行为是固定的。有关优先级的详细信息,请参见Section 4.1.6。
过时的选项SORT1
,SORT2
,LTCMP
和GTCMP
以前用于指定与可合并合并运算符关联的排序运算符的名称。这不再是必需的,因为有关关联的运算符的信息是通过查看 B 树运算符族来找到的。如果给出了这些选项之一,则将其忽略,除非隐式设置MERGES
true。
使用DROP OPERATOR从数据库中删除用户定义的运算符。使用ALTER OPERATOR修改数据库中的运算符。
Examples
以下命令为数据类型box
定义了一个新的运算符 area-equality:
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
PROCEDURE = area_equal_procedure,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_procedure,
JOIN = area_join_procedure,
HASHES, MERGES
);
Compatibility
CREATE OPERATOR
是 PostgreSQL 扩展。 SQL 标准中没有针对用户定义的运算符的规定。