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