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)字符的序列:
/ <> =〜! @#%^&| `?
您选择的名称有一些限制:
- – 和 /*不能出现在运营商名称中的任何位置,因为它们将被视为评论的开头。
多字符运算符名称不能以 + 或 - 结尾,除非该名称还包含以下至少一个字符: 〜! @#%^&| `? 例如, @- 是允许的运算符名称,但 *- 不是。此限制允许Vastbase E100解析符合SQL的命令,而不需要令牌之间的空格。
不推荐使用 => 作为运营商名称。在将来的版本中可能完全不允许这样做。
运算符 != 在输入时映射到 <> ,因此这两个名称始终是等效的。
必须至少定义 LEFTARG 和 RIGHTARG中的一个。对于二元运算符,必须定义它们。对于右一元运算符,只应定义LEFTARG ,而对于左一元运算符,只应定义 RIGHTARG 。
function_name 函数必须先前已使用 CREATE FUNCTION定义,并且必须定义为接受所指示类型的正确数量的参数说明(一个或两个)。
在 CREATE OPERATOR 的语法中,关键字 FUNCTION 和 PROCEDURE是等价的,但引用的函数在任何情况下都必须是函数,而不是过程。此处使用关键字PROCEDURE 是历史数据并已弃用。
其他子句指定可选的运算符优化子句。
为了能够创建运算符,您必须对参数说明类型和返回类型具有 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.===) ,
注意事项
在 CREATE OPERATOR中无法指定运算符的词法优先级,因为解析器的优先级行为是硬连线的。
过时的选项 SORT1 , SORT2 , LTCMP 和 GTCMP以前用于指定与可合并连接运算符关联的排序运算符的名称。这不再是必要的,因为通过查看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
);