CREATE OPERATOR — 定义一个新运算符
CREATE OPERATORname
( {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 语法保留,因此不能用作运算符名称。
!=
运算符在输入时映射到 <>
,因此这两个名称始终等效。
对于二元运算符,必须同时定义 LEFTARG
和 RIGHTARG
。对于前缀运算符,应仅定义 RIGHTARG
。function_name
函数必须已使用 CREATE FUNCTION
预先定义,并且必须定义为接受正确数量(一个或两个)的指定类型参数。
在 CREATE OPERATOR
的语法中,关键字 FUNCTION
和 PROCEDURE
是等效的,但引用的函数无论如何都必须是函数,而不是过程。此处使用 PROCEDURE
关键字是历史原因,已弃用。
其他子句指定可选的运算符优化属性。它们的含义在 第 36.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.===) ,
有关更多信息,请参阅 第 36.14 节 和 第 36.15 节。
当您定义一个自对偶运算符时,只需执行即可。当您定义一对对偶运算符时,事情会有点棘手:第一个定义的运算符如何引用您尚未定义的另一个运算符?这个问题有三种解决方案
一种方法是在您定义的第一个运算符中省略 COMMUTATOR
子句,然后在第二个运算符的定义中提供一个。由于 PostgreSQL 知道对偶运算符成对出现,当它看到第二个定义时,它会自动返回并填补第一个定义中缺失的 COMMUTATOR
子句。
另一种更直接的方法是在两个定义中都包含 COMMUTATOR
子句。当 PostgreSQL 处理第一个定义并意识到 COMMUTATOR
引用的运算符不存在时,系统将在系统目录中为该运算符创建一个虚拟条目。此虚拟条目只有运算符名称、左操作数和右操作数类型以及所有者有效数据,因为这是 PostgreSQL 在此时可以推断出的所有信息。第一个运算符的目录条目将链接到此虚拟条目。稍后,当您定义第二个运算符时,系统会使用第二个定义中的附加信息更新虚拟条目。如果您在虚拟运算符填充完毕之前尝试使用它,您将只收到一个错误消息。
或者,这两个运算符都可以不带 COMMUTATOR
子句进行定义,然后可以使用 ALTER OPERATOR
来设置它们的对偶链接。只需要 ALTER
其中一对即可。
在这三种情况下,您必须拥有这两个运算符才能将它们标记为对偶运算符。
否定运算符对可以使用与对偶运算符对相同的方法进行定义。
在 CREATE OPERATOR
中无法指定运算符的词法优先级,因为解析器的优先级行为是硬编码的。有关优先级详细信息,请参见 第 4.1.6 节。
已废弃的选项 SORT1
、SORT2
、LTCMP
和 GTCMP
曾用于指定与合并连接运算符关联的排序运算符的名称。这不再是必需的,因为有关关联运算符的信息现在通过查看 B-tree 运算符族来查找。如果给出这些选项之一,它将被忽略,但会隐式设置 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 标准中没有为用户定义的运算符提供任何规定。
如果您在文档中发现任何不正确、与您对特定功能的经验不符或需要进一步澄清的内容,请使用 此表格 来报告文档问题。