Расширение PostgreSQL
Функции С, как и функции SQL, могут вызываться любым пользователем. Функции С могут вносить прямые изменения в файловую систему (если позволяют права) и производить операции системного уровня, поэтому к их проектированию следует подойти особенно тщательно, чтобы избежать потенциальных злоупотреблений. В листинге 7.51 приведены примеры нескольких вызовов функции is_zero, определенной в листинге 7.49, и ее перегруженной версии из листинга 7.51.
Листинг 7.51. Использование функций С.
booktown=# SELECT is_zero(0) AS zero .is_zero(l) AS one, booktown-# 1s_zero(6. 0) AS one_zero, is_zero(11.12) AS neither: zero | one | one_zero | neither t [ f | t | f (1 row)
Уничтожение функций
Функции уничтожаются владельцем или суперпользователем при помощи команды SQL DROP FUNCTION. Синтаксис команды DROP FUNCTION:
DELETE FUNCTION имя ([ тип_аргумента [….] ]):
В листинге 7.52 приведен пример удаления функции isbn_to_title(text). Обратите внимание: типы аргументов должны указываться обязательно, даже если функция и не перегружалась.
Листинг 7.52. Удаление функции.
booktown=# DROP FUNCTION isbn_to_title(text); DROP
Сообщение сервера DROP означает, что функция была успешно удалена. Команда DROP FUNCTION, как и большинство команд DROP, необратима, поэтому перед ее выполнением убедитесь в том, что функцию действительно требуется удалить.
Создание новых операторов
Кроме пользовательских функций PoslgreSQL позволяет создавать пользовательские операторы. С технической точки зрения операторы всего лишь обеспечивают альтернативный синтаксис для вызова функций. Например, оператор сложения (+) в действительности вызывает одну из встроенных функций (numeri c_add() и т. д.). Пример:
booktown=# SELECT I + 2 AS by_operator .numeric_add(l,2) AS by_function; by_operator [ by_function 3 | 3 (1 row)
Определение оператора сообщает, к какому типу данных относятся левый и правый операнды. Кроме того, в определении указывается функция, которой при вызове в качестве аргументов передаются операнды.