35.12. 用户定义操作符

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

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

下面是一个创建用于两个复数相加的操作符的例子。假设已经创建了complex (见节第 35.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 和其它优化器提示的详细信息在下节给出。