PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

36.14. 用户自定义操作符 #

每个操作符都是对真正执行工作的底层函数的调用的 “语法糖”;因此必须先创建底层函数,然后才能创建操作符。 不过,操作符不仅仅是语法糖,因为它还携带额外的 信息,这些信息有助于查询规划器优化使用该操作符的查询。下一节将专门 解释这些附加信息。

PostgreSQL 支持前缀和中缀操作符。操作符可以 被重载; 也就是说,同一个操作符名可以用于具有不同操作数数量和类型的不同 操作符。当查询执行时,系统会根据提供的操作数的数量和类型确定要调用的 操作符。

下面是一个创建把两个复数相加的操作符的示例。假设我们已经创建了类型 complex 的定义(见 Section 36.13)。首先需要 一个完成实际工作的函数,然后才能定义操作符:

CREATE FUNCTION complex_add(complex, complex)
    RETURNS complex
    AS 'filename', 'complex_add'
    LANGUAGE C IMMUTABLE STRICT;

CREATE OPERATOR + (
    leftarg = complex,
    rightarg = complex,
    function = complex_add,
    commutator = +
);

现在我们就可以执行这样的查询了:

SELECT (a + b) AS c FROM test_complex;

        c
-----------------
 (5.2,6.05)
 (133.42,144.95)

我们在这里演示了如何创建一个二元操作符。要创建前缀操作符,只需省略 leftarg。 function 子句和参数子句是 CREATE OPERATOR 中仅有的必填项。 示例中给出的 commutator 子句是给查询优化器的一个 可选提示。关于 commutator 和其他优化器提示的更多 细节见下一节。