CREATE OPERATOR имя (
PROCEDURE = имя_функции
[, LEFTARG = тип_слева ] [, RIGHTARG = тип_справа ]
[, COMMUTATOR = коммут_оператор ] [, NEGATOR = обратный_оператор ]
[, RESTRICT = процедура_ограничения ] [, JOIN = процедура_соединения ]
[, HASHES ] [, MERGES ]
)CREATE OPERATOR определяет новый оператор, имя. Владельцем оператора становится пользователь, его создавший. Если указано имя схемы, оператор создаётся в ней, в противном случае — в текущей схеме.
Имя оператора образует последовательность из нескольких символов (не более чем NAMEDATALEN-1, по умолчанию 63) из следующего списка:
+ - * / < > = ~ ! @ # % ^ & | ` ?
Однако выбор имени ограничен ещё следующими условиями:Сочетания символов -- и /* не могут присутствовать в имени оператора, так как они будут обозначать начало комментария.
Многосимвольное имя оператора не может заканчиваться знаками + или -, если только оно не содержит также один из этих символов:
~ ! @ # % ^ & | ` ?
Например, @- — допустимое имя оператора, а *- — нет. Благодаря этому ограничению, Postgres Pro может разбирать корректные SQL-запросы без пробелов между компонентами.Использование => в качестве имени оператора считается устаревшим и может быть вовсе запрещено в будущих выпусках.
Оператор != отображается в <> при вводе, так что эти два имени всегда равнозначны.
Необходимо определить либо LEFTARG, либо RIGHTARG, а для бинарных операторов оба аргумента. Для правых унарных операторов должен быть определён только LEFTARG, а для левых унарных — только RIGHTARG.
Процедура имя_функции должна быть уже определена с помощью CREATE FUNCTION и иметь соответствующее число аргументов (один или два) указанных типов.
Другие предложения определяют дополнительные характеристики оптимизации. Их значение описано в Разд. 35.13.
Чтобы создать оператор, необходимо иметь право USAGE для типов аргументов и результата, а также право EXECUTE для нижележащей функции. Если указывается коммутативный или обратный оператор, нужно быть его владельцем.
Имя определяемого оператора. Допустимые в нём символы перечислены ниже. Указанное имя может быть дополнено схемой, например так: CREATE OPERATOR myschema.+ (...). Если схема не указана, оператор создаётся в текущей схеме. При этом два оператора в одной схеме могут иметь одно имя, если они работают с разными типами данных. Такое определение операторов называется перегрузкой.
Функция, реализующая этот оператор.
Тип данных левого операнда оператора, если он есть. Этот параметр опускается для левых унарных операторов.
Тип данных правого операнда оператора, если он есть. Этот параметр опускается для правых унарных операторов.
Оператор, коммутирующий для данного.
Оператор, обратный для данного.
Функция оценки избирательности ограничения для данного оператора.
Функция оценки избирательности соединения для этого оператора.
Показывает, что этот оператор поддерживает соединение по хешу.
Показывает, что этот оператор поддерживает соединение слиянием.
Чтобы задать имя оператора с указанием схемы в коммут_оператор или другом дополнительном аргументе, применяется синтаксис OPERATOR(), например:
COMMUTATOR = OPERATOR(myschema.===) ,
За дополнительными сведениями обратитесь к Разд. 35.12.
Задать лексический приоритет оператора в команде CREATE OPERATOR невозможно, так как обработка приоритетов жёстко зашита в анализаторе. Подробнее приоритеты описаны в Разд. 4.1.6.
Устаревшие параметры SORT1, SORT2, LTCMP и GTCMP ранее использовались для определения имён операторов сортировки, связанных с оператором, применяемым при соединении слиянием. Теперь это не требуется, так как информацию о связанных операторах теперь дают семейства операторов B-дерева. Если в команде отсутствует явное указание MERGES, все эти параметры игнорируются.
Для удаления пользовательских операторов из базы данных применяется DROP OPERATOR, а для изменения их свойств — ALTER OPERATOR.
Следующая команда определяет новый оператор, проверяющий равенство площадей, для типа box:
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
PROCEDURE = area_equal_procedure,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_procedure,
JOIN = area_join_procedure,
HASHES, MERGES
);CREATE OPERATOR является языковым расширением Postgres Pro. Средства определения пользовательских операторов в стандарте SQL не описаны.
| Пред. | Начало | След. |
| CREATE MATERIALIZED VIEW | Уровень выше | CREATE OPERATOR CLASS |