CREATE OPERATOR#

CREATE OPERATOR

CREATE OPERATOR

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

Синтаксис

CREATE OPERATOR name (
    {FUNCTION|PROCEDURE} = function_name
    [, LEFTARG = left_type ] [, RIGHTARG = right_type ]
    [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
    [, RESTRICT = res_proc ] [, JOIN = join_proc ]
    [, HASHES ] [, MERGES ]
)

Описание

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

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

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

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

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

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

    ~ ! @ # % ^ & | ` ?

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

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

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

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

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

Другие операторы оптимизации определяют необязательные операторы оптимизации. Их значение подробно описано в Раздел 36.14.

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

Параметры

name

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

function_name

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

left_type

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

right_type

Тип данных правого операнда оператора.

com_op

Коммутатор этого оператора.

neg_op

Отрицательный оператор.

res_proc

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

join_proc

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

HASHES

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

MERGES

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

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

COMMUTATOR = OPERATOR(myschema.===) ,

Примечания

Ссылайтесь на Раздел 36.13 для получения дополнительной информации.

Невозможно указать лексический приоритет оператора в CREATE OPERATOR, поскольку поведение приоритета парсера зашито в коде. См. Раздел 4.1.6 для получения более подробной информации о приоритете.

Устаревшие параметры SORT1, SORT2, LTCMP и GTCMP ранее использовались для указания имен сортирующих операторов, связанных с оператором слияния. Это больше не требуется, так как информация о связанных операторах находится при анализе семейств операторов B-дерева. Если один из этих параметров указан, он игнорируется, за исключением неявного установления значения MERGES в true.

Используйте DROP OPERATOR, чтобы удалить операторы, определенные пользователем, из базы данных. Используйте ALTER OPERATOR, чтобы изменить операторы в базе данных.

Примеры

Следующая команда определяет новый оператор, area-equality, для типа данных 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 - это расширение Tantor SE. В стандарте SQL нет возможности определения пользовательских операторов.