Расширение PostgreSQL
Перегрузка операторов
Операторы, как и функции, поддерживают возможность перегрузки. Иначе говоря, в программе можно создать оператор с таким же именем, как у существующего оператора, но работающего с другими типами операндов. При этом в программе должна существовать функция, количество и тины аргументов которой соответствуют количеству и типам операндов.
Пример перегрузки оператора !# приведен в листинге 7.55. Первая команда CREATE OPERATOR создает оператор, аналогичный оператору из листинга 7.53. Тем не менее в новой версии оператора вместо LEFTARG указано ключевое слово RIGHTARG, поэтому новый оператор работает с операндом типа integer, находящимся не слева, а справа. Вторая команда создает третью версию оператора !#, работающую с обоими операндами.
Листинг 7.55. Перегрузка пользовательского оператора.
booktown=# CREATE OPERATOR!# (PROCEDURE = is_zero. booktown(# RIGHTARG = integer); CREATE booktown=# CREATE OPERATOR!# (PROCEDURE = is_zero, booktown(# LEFTARG = integer, booktown(# RIGHTARG = integer); CREATE
В листинге 7.55 оператор !# перегружается с тем же именем функции is_zero(), поскольку сама функция была перегружена в листинге 7.50 (см. пункт "Создание функций на языке С" в подразделе "Создание новых функций" данного раздела). Наличие двух версий функции is_zero() (с одним и с двумя аргументами) позволяет перегрузить оператор !# в двух вариантах, с одним операндом (левым или правым) и с двумя операндами.
Лексический анализатор PostgreSQL правильно интерпретирует все перегруженные операторы в командах SQL. В листинге 7.56 продемонстрированы три варианта использования оператора !# с разными операндами. Все три варианта допустимы, так как оператор был перегружен в листинге 7.55.
Листинг 7.56. Использование перегруженного оператора.
booktownHf SELECT isbn, stock FROM stock booktown-# WHERE stock!# booktown-# AND!# stock booktown-# AND stock!# stock; isbn | stock 0394900014 0 0451198492 | 0 0451457994 | 0 (3 rows)
Удаление оператора
Операторы удаляются командой DROP OPERATOR. Выполнение этой команды разрешено либо пользователю, создавшему оператор, либо суперпользователю PostgreSQL.
Внимание
Команда DROP OPERATOR применима не только к пользовательским, но и к встроенным операторам, поэтому при выполнении этой команды с правами суперпользователя необходимо действовать очень осторожно.
Так как операторы определяются не только именем, но и типом операндов, в команде DROP OPERATOR необходимо задать типы левого и правого операндов. Если какой-либо из операндов не используется, вместо типа указывается ключевое слово NONE.
Синтаксис команды DROP OPERATOR:
DROP OPERATOR оператор ({ левый_тип \ NONE }. { правый_тип \ NONE })
В листинге 7.57 удаляется версия оператора! #, работающая с двумя операндами.
Листинг 7.57. Удаление оператора.
booktown=# DROP OPERATOR!# (integer, integer); DROP
Команда в листинге 7.58 выглядит почти так же, но она удаляет перегруженную версию с правым операндом.
Листинг 7.58. Удаление перегруженного оператора.
booktown=# DROP OPERATOR!# (NONE, integer); DROP