=============== CREATE OPERATOR =============== .. container:: refentry :name: SQL-CREATEOPERATOR .. container:: titlepage .. container:: refnamediv .. rubric:: CREATE OPERATOR :name: create-operator CREATE OPERATOR — 定义一个新的操作符 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: 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 ] ) .. container:: refsect1 :name: id-1.9.3.72.5 .. rubric:: 描述 :name: 描述 ``CREATE OPERATOR``\ 定义一个新的操作符 ``name``\ 。定义操作符 的用户会成为该操作符的拥有者。如果给出一个模式名,该操作符将被创建 在指定的模式中。否则它会被创建在当前模式中。 操作符名称是最多\ ``NAMEDATALEN``-1(默认为 63) 个字符的序列,这些字符可以是: .. container:: literallayout | | + - * / < > = ~ ! @ # % ^ & | ` ? 对名称的选择有一些限制: .. container:: itemizedlist - ``--`` and ``/*``\ 不能出现在 操作符名称中,因为它们会被当做一段注释的开始。 - 多字符操作符名称不能以\ ``+``\ 或者\ ``-`` 结束,除非该名称也包含至少一个下列字符: .. container:: literallayout | | ~ ! @ # % ^ & | ` ? 例如,\ ``@-``\ 是一个被允许的操作符名称,而 ``*-``\ 不是。这种限制允许 OushuDB解析 SQL 兼容的命令 而无需记号之间的空格。 - 将\ ``=>``\ 用作一个操作符名称已经不被推荐。在未来的发行中 可能会被禁用。 在输入时\ ``!=``\ 会被映射为\ ``<>``\ , 因此这两个名字总是等效的。 必须至少定义\ ``LEFTARG``\ 和\ ``RIGHTARG``\ 中的一个。 对于二元操作符,两者都必须被定义。对于右一元操作符,只应该定义 ``LEFTARG``\ ,而对于左一元操作符只应该定义 ``RIGHTARG``\ 。 ``function_name``\ 函数 必须在之前已经用\ ``CREATE FUNCTION``\ 定义好, 并且必须被定义为接受正确数量的指定类型的参数。 在\ ``CREATE OPERATOR``\ 的语法中,关键词\ ``FUNCTION``\ 和\ ``PROCEDURE``\ 是等效的,但不管哪种情况下被引用的函数都必须是一个函数而不是过程。这里对关键词\ ``PROCEDURE``\ 的是用是有历史原因的,现在已经被废弃。 其他子句指定可选的操作符优化子句。 要创建一个操作符,必须具有参数类型和返回类型上的\ ``USAGE`` 权限,以及底层函数上的\ ``EXECUTE``\ 权限。如果指定了一个 交换子或者求反器操作符,必须拥有这些操作符。 .. container:: refsect1 :name: id-1.9.3.72.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``name`` 要定义的操作符的名称。允许使用的字符请见上文。名称可以被模式 限定,例如\ ``CREATE OPERATOR myschema.+ (...)``\ 。如果 没有被模式限定,该操作符将被创建在当前模式中。如果两个同一模式 中的操作符在不同的数据类型上操作,它们可以具有相同的名称。这 被称为\ *重载*\ 。 ``function_name`` 用来实现这个操作符的函数。 ``left_type`` 这个操作符的左操作数(如果有)的数据类型。忽略这个选项 可以表示一个左一元操作符。 ``right_type`` 这个操作符的右操作数(如果有)的数据类型。忽略这个选项 可以表示一个右一元操作符。 ``com_op`` 这个操作符的交换子。 ``neg_op`` 这个操作符的求反器。 ``res_proc`` 用于这个操作符的限制选择度估计函数。 ``join_proc`` 用于这个操作符的连接选择度估算函数。 ``HASHES`` 表示这个操作符可以支持哈希连接。 ``MERGES`` 表示这个操作符可以支持归并连接。 要在\ ``com_op`` 或者其他可选参数中给出一个模式限定的操作符名称, 请使用\ ``OPERATOR()``\ 语法,例如: .. code:: programlisting COMMUTATOR = OPERATOR(myschema.===) , .. container:: refsect1 :name: id-1.9.3.72.7 .. rubric:: 注解 :name: 注解 无法在\ ``CREATE OPERATOR``\ 中指定一个操作符的 词法优先级,因为解析器的优先级行为是硬写在代码中的。详见 `节 `__\ 。 废弃的选项\ ``SORT1``\ 、\ ``SORT2``\ 、 ``LTCMP``\ 以及\ ``GTCMP``\ 以前被用来指定与支持 归并连接的操作符相关的排序操作符的名称。现在不再需要它们了,因为 相关操作符的信息可以在 B-树的操作符族中找到。如果给出了这些选项 之一,它会被忽略(除非是为了隐式设置\ ``MERGES``\ 为真)。 使用\ `DROP OPERATOR `__\ 从数据库中删除用户定义的操作符。 使用\ `ALTER OPERATOR `__\ 修改数据库中的操作符。 .. container:: refsect1 :name: id-1.9.3.72.8 .. rubric:: 示例 :name: 示例 下面的命令为数据类型\ ``box``\ 定义了一种新的操作符--面积相等: .. code:: programlisting CREATE OPERATOR === ( LEFTARG = box, RIGHTARG = box, FUNCTION = area_equal_function, COMMUTATOR = ===, NEGATOR = !==, RESTRICT = area_restriction_function, JOIN = area_join_function, HASHES, MERGES ); .. container:: refsect1 :name: id-1.9.3.72.9 .. rubric:: 兼容性 :name: 兼容性 ``CREATE OPERATOR``\ 是一种 OushuDB 扩展。在 SQL 标准中没有用户定义操作符的规定。 .. container:: refsect1 :name: id-1.9.3.72.10 .. rubric:: 另见 :name: 另见 `ALTER OPERATOR `__, `CREATE OPERATOR CLASS `__, `DROP OPERATOR `__