登录
38.14. 用户定义运算符#
每个运算符都是对执行实际工作的底层函数调用的“语法糖”;因此,在创建运算符之前,必须先创建底层函数。但是,运算符不仅仅是语法糖,因为它携带附加信息,帮助查询计划程序优化使用该运算符的查询。下一节将专门解释这些附加信息。
PostgreSQL支持前缀和中缀运算符。运算符可以重载;也就是说,同一个运算符名称可用于不同的运算符,这些运算符具有不同的运算对象数量和类型。在执行查询时,系统会根据提供的运算对象的数目和类型来确定要调用的运算符。
下面是一个创建运算符用于添加两个复数的示例。我们假设我们已经创建了类型complex
的定义(请参阅第 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)
我们在此展示了如何创建二元运算符。要创建前缀运算符,只需省略leftarg
。在CREATE OPERATOR
中,function
子句和参数子句是唯一必需的项目。示例中显示的commutator
子句是对查询优化器的可选提示。有关commutator
和其他优化器提示的更多详细信息,请参见下一节。