Перегрузка функций
Эта страница переведена при помощи нейросети GigaChat.
Можно определить более одной функции с одним и тем же именем SQL, если аргументы, которые они принимают, различаются. Другими словами, имена функций могут быть перегружены. Независимо от того, используется ли эта возможность или нет, она требует соблюдения мер безопасности при вызове функций в базах данных, где некоторые пользователи не доверяют другим пользователям. Когда выполняется запрос, сервер определит, какую функцию вызвать из типов данных и количества предоставленных аргументов. Перегрузка также может использоваться для имитации функций с переменным количеством аргументов, до конечного максимального числа.
При создании семейства перегруженных функций следует быть осторожным, чтобы не создавать двусмысленности. Например, если даны функции:
CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...
Не сразу понятно, какая функция будет вызвана с каким-то тривиальным вводом, например, test(1, 1.5)
. В настоящее время реализованные правила разрешения описаны в разделе «Преобразование типов», но неразумно проектировать систему, которая тонко полагается на это поведение.
Функция, принимающая единственный аргумент составного типа, обычно не должна иметь то же имя, что и любой атрибут (поле) этого типа. Помните, что запись атрибут(таблица) считается эквивалентной таблица.атрибут. В случае возникновения неоднозначности между функцией на составном типе и атрибутом составного типа всегда будет использоваться атрибут. Возможно переопределить этот выбор, квалифицировав схему именем функции (т.е., схема.функция(таблица)), но лучше избежать проблемы, не выбирая конфликтующие имена.
Еще один возможный конфликт может возникнуть между функциями с переменным числом аргументов и без него. Например, можно создать как foo(numeric)
, так и foo(VARIADIC numeric[])
. В этом случае неясно, какая из них должна соответствовать вызову, предоставляющему единственный числовой аргумент, например foo(10.1)
. Правило заключается в том, что используется функция, которая появляется раньше в пути поиска, или если обе функции находятся в одной схеме, предпочтение отдается не вариативной функции.
При перегрузке функций языка Си существует дополнительное ограничение: Си-имя каждой функции в семействе перегруженных функций должно отличаться от Си-имен всех остальных функций, как внутренних, так и динамически загружаемых. Если это правило нарушено, поведение не переносится. Можно получить ошибку компоновщика во время выполнения, или одна из функций будет вызвана (обычно внутренняя). Альтернативная форма предложения AS
для команды SQL 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и-функций здесь отражают одну из многих возможных конвенций.