31.12. 用户定义操作符

每个操作符都是对真正干活的对应函数的"语义修饰"; 所以你在创建操作符之前必须先创建对应的函数。 不过,一个操作符也并不仅仅是语义修饰, 因为它还带着可以帮助查询规划器优化使用该操作符的查询的附加信息。 下一节将用于解释这些附加的信息.

PostgreSQL 支持左目,右目,和双目操作符。 操作符可以重载; 也就是说,同一个操作符名字可以用于不同的, 拥有不同的数目和类型的操作数的操作符。在执行一个查询的时候,系统从名字和提供的操作符类型上判断需要调用哪个操作符。

下面是一个创建用于两个复数相加的操作符的例子。 我们假设已经创建了complex(见Section 31.11) 类型的定义。首先我们需要做(相加)工作的函数;然后我们就可以定义操作符:

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

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

现在我们可以执行像下面这样的查询:

SELECT (a + b) AS c FROM test_complex;

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

我们在这里已经演示了如何创建双目操作符。要创建单目操作符, 只需要省略leftarg(对左目操作符)或者rightarg (对右操作符)即可。只有procedure子句和参数(argument)子句是 CREATE OPERATOR 里需要的条目。 例子里演示的 commutator 子句是一个给查询优化器的可选的暗示。 关于 commutator 和其它优化器提示的详细信息在下节给出。