CREATE OPERATOR
CREATE OPERATOR — создать оператор
Синтаксис
CREATE OPERATORимя( {FUNCTION|PROCEDURE} =имя_функции[, LEFTARG =тип_слева] [, RIGHTARG =тип_справа] [, COMMUTATOR =коммут_оператор] [, NEGATOR =обратный_оператор] [, RESTRICT =процедура_ограничения] [, JOIN =процедура_соединения] [, HASHES ] [, MERGES ] )
Описание
CREATE OPERATOR определяет новый оператор, имя. Владельцем оператора становится пользователь, его создавший. Если указано имя схемы, оператор создаётся в ней, в противном случае — в текущей схеме.
Имя оператора образует последовательность из нескольких символов (не более чем NAMEDATALEN-1, по умолчанию 63) из следующего списка:
+ - * / < > = ~ ! @ # % ^ & | ` ?
Однако выбор имени ограничен ещё следующими условиями:
Сочетания символов
--и/*не могут присутствовать в имени оператора, так как они будут обозначать начало комментария.Многосимвольное имя оператора не может заканчиваться знаком
+или-, если только оно не содержит также один из этих символов:
~ ! @ # % ^ & | ` ?Например,
@-— допустимое имя оператора, а*-— нет. Благодаря этому ограничению, PostgreSQL может разбирать корректные SQL-запросы без пробелов между компонентами.Символ
=>зарезервирован для использования в грамматике языка SQL, поэтому его нельзя использовать в качестве имени оператора.
Оператор != отображается в <> при вводе, так что эти два имени всегда равнозначны.
Необходимо определить либо LEFTARG, либо RIGHTARG, а для бинарных операторов оба аргумента. Для правых унарных операторов должен быть определён только LEFTARG, а для левых унарных — только RIGHTARG.
Примечание
Правые унарные, также называемые постфиксными, операторы признаны устаревшими и будут удалены в PostgreSQL версии 14.
Функция имя_функции должна быть уже определена с помощью CREATE FUNCTION и иметь соответствующее число аргументов (один или два) указанных типов.
В синтаксисе CREATE OPERATOR ключевые слова FUNCTION и PROCEDURE равнозначны, но указываемая функция должна в любом случае быть функцией, а не процедурой. Ключевое слово PROCEDURE здесь поддерживается по историческим причинам и считается устаревшим.
Другие предложения определяют дополнительные характеристики оптимизации. Их значение описано в Разделе 37.15.
Чтобы создать оператор, необходимо иметь право USAGE для типов аргументов и результата, а также право EXECUTE для нижележащей функции. Если указывается коммутирующий или обратный оператор, нужно быть его владельцем.
Параметры
имяИмя определяемого оператора. Допустимые в нём символы перечислены ниже. Указанное имя может быть дополнено схемой, например так:
CREATE OPERATOR myschema.+ (...). Если схема не указана, оператор создаётся в текущей схеме. При этом два оператора в одной схеме могут иметь одно имя, если они работают с разными типами данных. Такое определение операторов называется перегрузкой.имя_функцииФункция, реализующая этот оператор.
тип_слеваТип данных левого операнда оператора, если он есть. Этот параметр опускается для левых унарных операторов.
тип_справаТип данных правого операнда оператора, если он есть. Этот параметр опускается для правых унарных операторов.
коммут_операторОператор, коммутирующий для данного.
обратный_операторОператор, обратный для данного.
процедура_ограниченияФункция оценки избирательности ограничения для данного оператора.
процедура_соединенияФункция оценки избирательности соединения для этого оператора.
HASHESПоказывает, что этот оператор поддерживает соединение по хешу.
MERGESПоказывает, что этот оператор поддерживает соединение слиянием.
Чтобы задать имя оператора с указанием схемы в коммут_оператор или другом дополнительном аргументе, применяется синтаксис OPERATOR(), например:
COMMUTATOR = OPERATOR(myschema.===) ,
Примечания
За дополнительными сведениями обратитесь к Разделу 37.14.
Задать лексический приоритет оператора в команде CREATE OPERATOR невозможно, так как обработка приоритетов жёстко зашита в анализаторе. Подробнее приоритеты описаны в Подразделе 4.1.6.
Устаревшие параметры 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 является языковым расширением PostgreSQL. Средства определения пользовательских операторов в стандарте SQL не описаны.
См. также
ALTER OPERATOR, CREATE OPERATOR CLASS, DROP OPERATORCREATE OPERATOR
CREATE OPERATOR — define a new operator
Synopsis
CREATE OPERATORname( {FUNCTION|PROCEDURE} =function_name[, LEFTARG =left_type] [, RIGHTARG =right_type] [, COMMUTATOR =com_op] [, NEGATOR =neg_op] [, RESTRICT =res_proc] [, JOIN =join_proc] [, HASHES ] [, MERGES ] )
Description
CREATE OPERATOR defines a new operator, name. The user who defines an operator becomes its owner. If a schema name is given then the operator is created in the specified schema. Otherwise it is created in the current schema.
The operator name is a sequence of up to NAMEDATALEN-1 (63 by default) characters from the following list:
+ - * / < > = ~ ! @ # % ^ & | ` ?
There are a few restrictions on your choice of name:
--and/*cannot appear anywhere in an operator name, since they will be taken as the start of a comment.A multicharacter operator name cannot end in
+or-, unless the name also contains at least one of these characters:
~ ! @ # % ^ & | ` ?For example,
@-is an allowed operator name, but*-is not. This restriction allows PostgreSQL to parse SQL-compliant commands without requiring spaces between tokens.The symbol
=>is reserved by the SQL grammar, so it cannot be used as an operator name.
The operator != is mapped to <> on input, so these two names are always equivalent.
At least one of LEFTARG and RIGHTARG must be defined. For binary operators, both must be defined. For right unary operators, only LEFTARG should be defined, while for left unary operators only RIGHTARG should be defined.
Note
Right unary, also called postfix, operators are deprecated and will be removed in PostgreSQL version 14.
The function_name function must have been previously defined using CREATE FUNCTION and must be defined to accept the correct number of arguments (either one or two) of the indicated types.
In the syntax of CREATE OPERATOR, the keywords FUNCTION and PROCEDURE are equivalent, but the referenced function must in any case be a function, not a procedure. The use of the keyword PROCEDURE here is historical and deprecated.
The other clauses specify optional operator optimization clauses. Their meaning is detailed in Section 37.15.
To be able to create an operator, you must have USAGE privilege on the argument types and the return type, as well as EXECUTE privilege on the underlying function. If a commutator or negator operator is specified, you must own these operators.
Parameters
nameThe name of the operator to be defined. See above for allowable characters. The name can be schema-qualified, for example
CREATE OPERATOR myschema.+ (...). If not, then the operator is created in the current schema. Two operators in the same schema can have the same name if they operate on different data types. This is called overloading.function_nameThe function used to implement this operator.
left_typeThe data type of the operator's left operand, if any. This option would be omitted for a left-unary operator.
right_typeThe data type of the operator's right operand, if any. This option would be omitted for a right-unary operator.
com_opThe commutator of this operator.
neg_opThe negator of this operator.
res_procThe restriction selectivity estimator function for this operator.
join_procThe join selectivity estimator function for this operator.
HASHESIndicates this operator can support a hash join.
MERGESIndicates this operator can support a merge join.
To give a schema-qualified operator name in com_op or the other optional arguments, use the OPERATOR() syntax, for example:
COMMUTATOR = OPERATOR(myschema.===) ,
Notes
Refer to Section 37.14 for further information.
It is not possible to specify an operator's lexical precedence in CREATE OPERATOR, because the parser's precedence behavior is hard-wired. See Section 4.1.6 for precedence details.
The obsolete options SORT1, SORT2, LTCMP, and GTCMP were formerly used to specify the names of sort operators associated with a merge-joinable operator. This is no longer necessary, since information about associated operators is found by looking at B-tree operator families instead. If one of these options is given, it is ignored except for implicitly setting MERGES true.
Use DROP OPERATOR to delete user-defined operators from a database. Use ALTER OPERATOR to modify operators in a database.
Examples
The following command defines a new operator, area-equality, for the data type box:
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
FUNCTION = area_equal_function,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_function,
JOIN = area_join_function,
HASHES, MERGES
);
Compatibility
CREATE OPERATOR is a PostgreSQL extension. There are no provisions for user-defined operators in the SQL standard.