CREATE OPERATOR

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


Синтаксис

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

Описание

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

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

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

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

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

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

~ ! @ \# % ^ &  ‘ ?

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

  • Символ => зарезервирован для грамматики SQL, поэтому не может использоваться в качестве имени оператора.

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

Для двоичных операторов обязательно необходимо определить и LEFTARG, и RIGHTARG. Для префиксных операторов должен быть определен только параметр RIGHTARG. Функция имя_функции должна быть заранее определена с помощью 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