Иллюстрированный самоучитель по PostgreSQL

Расширение 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.