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 нет положений для операторов, определяемых пользователем.