33.8. 函数重载

如果函数的参数不同,可以定义为同名的 SQL 函数。换句话说,函数名可以重载。 函数也可以与一个字段/属性同名。这时,一个复合类型的函数和一个复合类型的字段/属性会有冲突, 这种情况下总是使用字段/属性。

一个函数也可以和一个属性同名。(还记得attribute(table) 等效于 table.attribute。)这种情况下,定义在复合类型上的函数和复合类型的属性之间有歧义,这个时候,将总是使用属性。

在创建一个重载函数族的时候,我们应该仔细不要产生歧义。 比如,给出函数

CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...

如果我们输入一些简单的输入,比如 test(1, 1.5), 是不会立即得出应该调用哪个函数的。目前实现的分析规则在 Chapter 10 里描述,但是设计一套有意无意地依赖这个行为地系统显然是不明智的。

在重载一个 C 语言函数的时候,还有另外一个约束:重载函数族的每个函数的 C 名字必须和所有其他函数的 C 名字不同, 不管是内部的还是动态装载进来的。你可能会收到一个运行时链接错,或者调用了其中的某个函数(通常是内部的)。 SQL 命令 CREATE FUNCTIONAS 子句的另外一种形式把 SQL 函数名和 C 代码中的函数名分开。比如,

CREATE FUNCTION test(int) RETURNS int
    AS 'filename', 'test_1arg'
    LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
    AS 'filename', 'test_2arg'
    LANGUAGE C;

这里的 C 函数名字反映许多种转换中的一种。