# 38.14.用户定义运算符

每个操作符都是对执行实际工作的底层函数的调用的“语法糖”;因此,必须先创建基础函数,然后才能创建运算符。然而,一名操作员正在不仅仅是语法糖,因为它携带了额外的信息,可以帮助查询规划者优化使用运算符的查询。下一节将专门解释这些附加信息。

PostgreSQL支持前缀和中缀运算符。操作员可能超载;也就是说,相同的运算符名称可用于具有不同操作数和类型的不同运算符。执行查询时,系统根据提供的操作数的数量和类型确定要调用的运算符。

下面是创建两个复数相加运算符的示例。我们假设已经创建了类型的定义复杂的(见第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