Postgresql 中文操作指南

38.14. User-Defined Operators #

每个运算符都是对调用执行实际工作的底层函数的“语法糖”;因此,在创建运算符之前,必须先创建底层函数。然而,一个运算符是 not merely 语法糖,因为它携带附加信息,有助于查询计划优化使用该运算符的查询。下一节将专门解释这些附加信息。

PostgreSQL 支持前缀和中缀运算符。运算符可以重载;即,可以将同一运算符名称用于具有不同的运算对象数量和类型的运算符。在执行查询时,系统会根据所提供运算对象的数目和类型来确定要调用的运算符。

这是一个为添加两个复数创建运算符的示例。我们假设我们已经创建了类型 _complex_的定义(请参阅 Section 38.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)

我们在此演示了如何创建二元运算符。要创建前缀运算符,只需省略 leftargfunction 子句和参数子句是 CREATE OPERATOR 中唯一必需的项。示例中所示的 commutator 子句是对查询优化器的一个可选提示。关于 commutator 和其他优化器提示的更多详细信息将在下一节中出现。