38.13. 用户定义的运算符

每个运算符都是对完成实际工作的基础函数的调用的“语法糖”。因此,必须先创建基础函数,然后才能创建运算符。但是,运算符不仅仅是语法糖,因为它包含有助于查询计划者优化使用该运算符的查询的附加信息。下一节将专门解释该附加信息。

PostgreSQL 支持左一元,右一元和二进制运算符。操作员可能会超负荷; ,即相同的运算符名称可用于具有不同数量和类型的操作数的不同运算符。执行查询时,系统从提供的操作数的数量和类型中确定要调用的运算符。

这是创建用于将两个复数相加的运算符的示例。我们假设我们已经创建了complex类型的定义(请参见Section 38.12)。首先,我们需要一个完成工作的函数,然后可以定义运算符:

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(对于左一元)或rightarg(对于右一元)之一。 function子句和 arguments 子句是CREATE OPERATOR中唯一必需的项目。示例中显示的commutator子句是查询优化器的可选提示。下一节将提供有关commutator和其他优化程序提示的更多详细信息。