每个运算符对于进行实际工作的底层函数的调用都是 “语法糖”;因此,在创建运算符之前必须先创建底层函数。不过,一个运算符 不仅仅 是语法糖,因为它携带附加信息,可帮助查询计划程序优化使用该运算符的查询。下一节会阐释该附加信息。
PostgreSQL 支持前缀和中缀运算符。可以重载运算符; 也就是说,相同的运算符名称可用于具有不同运算对象数量和类型的不同运算符。在执行查询时,系统将根据提供的运算对象的数字和类型确定要调用的运算符。
这里有一个为复数加法创建运算符的示例。我们假设已经创建了类型 complex
的定义(参见 36.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
子句和 argument 子句是仅有的必需项。示例中所示的 commutator
子句是对查询优化程序的可选提示。关于 commutator
和其他优化程序提示的详细信息将在下一节中出现。