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. Для префиксных операторов должен быть определен только параметр 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