CREATE OPERATOR

CREATE OPERATOR — определить новый оператор

Синтаксис

CREATE OPERATOR имя (
    {FUNCTION|PROCEDURE} = имя_функции
    [, LEFTARG = тип_слева ] [, RIGHTARG = тип_справа ]
    [, COMMUTATOR = коммут_оператор ] [, NEGATOR = обратный_оператор ]
    [, RESTRICT = процедура_ограничения ] [, JOIN = процедура_соединения ]
    [, HASHES ] [, MERGES ]
)

Описание

Команда CREATE OPERATOR определяет новый оператор, имя. Пользователь, создавший оператор, становится его владельцем. Если задано имя схемы, то оператор создается в указанной схеме, если нет — в текущей.

Имя оператора представляет собой последовательность из нескольких символов (не более чем NAMEDATALEN-1, по умолчанию 63) из следующего списка:

+ - * / < > = ~ ! @ # % ^ & | ` ?

Есть несколько ограничений на выбор имени:

  • -- и /* в имени оператора присутствовать не могут, так как они приняты в качестве начала комментария.

  • Многосимвольное имя оператора не может заканчиваться на + или -, если только имя также не содержит хотя бы один из этих символов:

   ~ ! @ \# % ^ &  ‘ ?

Например, @- является допустимым именем оператора, а *- не является. Это ограничение позволяет QHB анализировать SQL-совместимые команды, не требуя пробелов между токенами.

  • Использование => в качестве имени оператора считается устаревшим и может быть окончательно запрещено в будущих выпусках.

Оператор != при вводе отображается в <>, так что эти два имени всегда равнозначны.

Необходимо обязательно определить LEFTARG либо RIGHTARG, а для бинарных операторов — оба аргумента. Для правых унарных операторов должно быть определено только LEFTARG, тогда как для левых унарных операторов — только RIGHTARG.

Примечание
Правые унарные операторы, также называемые постфиксными, являются устаревшими и будут удалены в следующей версии QHB.

Функция имя_функции должна быть заранее определена с помощью CREATE FUNCTION и таким образом, чтобы принимать правильное числа аргументов (одного или двух) из указанных типов.

В синтаксисе CREATE OPERATOR ключевые слова FUNCTION и PROCEDURE равнозначны, но указанная функция должна в любом случае быть функцией, а не процедурой. Использование ключевого слова PROCEDURE здесь поддерживается по историческим причинам и считается устаревшим.

В других предложениях указываются необязательные параметры оптимизации оператора. Их значение подробно описано в разделе Информация по оптимизации оператора.

Чтобы создать оператор, необходимо иметь право USAGE для типов аргументов и результата, а также право EXECUTE для нижележащей функции. Если указывается коммутативный или обратный оператор, нужно быть его владельцем.

Параметры

имя

Имя определяемого оператора. Допустимые символы см. выше. Имя может быть дополнено схемой, например, так: CREATE OPERATOR myschema.+ (...). Если схема не указана, то оператор создается в текущей схеме. Если два оператора в одной схеме работают с разными типами данных, они могут иметь одинаковое имя. Это называется перегрузкой.

имя_функции

Функция, используемая для реализации этого оператора.

тип_слева

Тип данных левого операнда оператора, если таковой имеется. Этот параметр будет опущен для левых унарных операторов.

тип_справа

Тип данных правого операнда оператора, если таковой имеется. Этот параметр будет опущен для правых унарных операторов.

коммут_оператор

Оператор, коммутирующий для данного.

обратный_оператор

Оператор, обратный для данного.

процедура_ограничения

Функция оценки селективности ограничения для этого оператора.

процедура_соединения

Функция оценки селективности соединения для этого оператора.

HASHES

Указывает, что этот оператор может поддерживать хэш-соединение.

MERGES

Указывает, что этот оператор может поддерживать соединение слиянием.

Чтобы задать имя оператора с указанием схемы в коммут_оператор или другом дополнительном аргументе, применяется синтаксис OPERATOR(), например:

COMMUTATOR = OPERATOR(myschema.===) ,

Примечания

Указать лексический приоритет оператора в команде CREATE OPERATOR невозможно, поскольку поведение приоритета синтаксического анализатора реализовано аппаратно. См. раздел Приоритет оператора.

Устаревшие опции 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 является расширением QHB. В стандарте SQL нет определения для пользовательских операторов.

См. также

ALTER OPERATOR, CREATE OPERATOR CLASS, DROP OPERATOR