С одним и тем же именем типа данных name может быть определено несколько функций, если наборы принимаемых ими аргументов различаются. Иными словами, имена функций могут быть перегружены. Независимо от того, используется ли эта возможность, она требует соблюдения мер предосторожности при вызове функций в базах данных, где одни пользователи не доверяют другим; см. Раздел 2.7.3. При выполнении запроса сервер определяет, какую функцию следует вызвать, на основании типов данных и количества переданных аргументов. Перегрузка также может применяться для имитации функций с переменным числом аргументов, вплоть до определенного максимального количества.
При создании семейства перегруженных функций следует соблюдать осторожность, чтобы не допустить возникновения неоднозначности. Например, если определены следующие функции:
CREATE FUNCTION test(int, real) RETURNS ... CREATE FUNCTION test(smallint, double precision) RETURNS ...
не всегда очевидно, какая именно функция будет вызвана при вводе таких простых значений, как test(1, 1.5). Текущие правила разрешения имен описаны в
Глава 2.7, однако не рекомендуется проектировать систему, которая неявно полагается на такое поведение.
Для функции, принимающей единственный аргумент составного типа, как правило, не следует выбирать имя, совпадающее с именем любого атрибута (поля) этого типа. Напомним, что
считается эквивалентным атрибут(table). В случае возникновения неоднозначности между функцией, работающей с составным типом, и атрибутом этого составного типа, приоритет всегда отдается атрибуту. Этот выбор можно
переопределить, явно указав схему для имени функции
(то есть, table.атрибут), однако во избежание подобных проблем лучше не выбирать конфликтующие имена.
schema.func(table)
Еще один возможный конфликт может возникнуть между функциями с ключевым словом VARIADIC и без него.
Например, можно создать одновременно foo(numeric) и
foo(VARIADIC numeric[]). В этом случае неясно, какая из функций должна быть выбрана при вызове с одним аргументом типа numeric, например
foo(10.1). Согласно правилу, используется та функция, которая расположена раньше в пути поиска; если же обе функции находятся в одной схеме, то предпочтение отдается функции без ключевого слова VARIADIC.
При перегрузке функций на языке C действует дополнительное ограничение: имя каждой функции на языке C в семействе перегруженных функций должно отличаться от имен в коде C всех остальных функций, как внутренних, так и динамически загружаемых. При нарушении этого
правила переносимость поведения не гарантируется. Это может привести к ошибке компоновщика на этапе выполнения или к вызову одной из функций (как правило, внутренней). Альтернативная форма
ключевое слово AS предложения для команды CREATE
FUNCTION позволяет отделить имя 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, приведенные в данном разделе, отражают одно из множества возможных соглашений об именовании.