Перейти к основному содержимому

CREATE OPERATOR

примечание

Эта страница переведена при помощи нейросети GigaChat.

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 создает новый оператор с заданным именем. Пользователь, создавший оператор, становится его владельцем. Если указанна схема, оператор создается в этой схеме, иначе — в текущей.

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

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

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

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

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

    ~ ! @ # % ^ & | ` ?

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

  • Символ => зарезервирован синтаксисом SQL и не может использоваться как имя оператора.

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

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

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

Дополнительные параметры позволяют оптимизировать выполнение запросов с использованием этого оператора. Подробности описаны в разделе «Информация об оптимизации операторов» документации PostgreSQL.

Для создания оператора необходимо обладать привилегией 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.===) ,

Примечания

Подробнее о пользовательских операторах можно ознакомиться в разделе «Пользовательские операторы».

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

Параметры SORT1, SORT2, LTCMP и GTCMP ранее предназначались для задания имен операторов сортировки, ассоциированных с оператором, поддерживающим соединение слиянием. Это больше не требуется — сведения о таких операторах извлекаются из семейств операторов B-tree. Если 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 является расширением для PostgreSQL. В стандарте SQL нет положений для операторов, определяемых пользователем.

Смотрите также

ALTER OPERATOR, CREATE OPERATOR CLASS, DROP OPERATOR