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
.
Примечание
Правые унарные, также называемые постфиксными, операторы признаны устаревшими и будут удалены в Postgres Pro версии 14.
Функция имя_функции
должна быть уже определена с помощью CREATE FUNCTION
и иметь соответствующее число аргументов (один или два) указанных типов.
В синтаксисе CREATE OPERATOR
ключевые слова FUNCTION
и PROCEDURE
равнозначны, но указываемая функция должна в любом случае быть функцией, а не процедурой. Ключевое слово PROCEDURE
здесь поддерживается по историческим причинам и считается устаревшим.
Другие предложения определяют дополнительные характеристики оптимизации. Их значение описано в Разделе 36.14.
Чтобы создать оператор, необходимо иметь право USAGE
для типов аргументов и результата, а также право EXECUTE
для нижележащей функции. Если указывается коммутативный или обратный оператор, нужно быть его владельцем.
Параметры
имя
Имя определяемого оператора. Допустимые в нём символы перечислены ниже. Указанное имя может быть дополнено схемой, например так:
CREATE OPERATOR myschema.+ (...)
. Если схема не указана, оператор создаётся в текущей схеме. При этом два оператора в одной схеме могут иметь одно имя, если они работают с разными типами данных. Такое определение операторов называется перегрузкой.имя_функции
Функция, реализующая этот оператор.
тип_слева
Тип данных левого операнда оператора, если он есть. Этот параметр опускается для левых унарных операторов.
тип_справа
Тип данных правого операнда оператора, если он есть. Этот параметр опускается для правых унарных операторов.
коммут_оператор
Оператор, коммутирующий для данного.
обратный_оператор
Оператор, обратный для данного.
процедура_ограничения
Функция оценки избирательности ограничения для данного оператора.
процедура_соединения
Функция оценки избирательности соединения для этого оператора.
HASHES
Показывает, что этот оператор поддерживает соединение по хешу.
MERGES
Показывает, что этот оператор поддерживает соединение слиянием.
Чтобы задать имя оператора с указанием схемы в коммут_оператор
или другом дополнительном аргументе, применяется синтаксис OPERATOR()
, например:
COMMUTATOR = OPERATOR(myschema.===) ,
Замечания
За дополнительными сведениями обратитесь к Разделу 36.13.
Задать лексический приоритет оператора в команде 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 не описаны.