CREATE OPERATOR#
CREATE OPERATOR
CREATE OPERATOR — определить новый оператор
Синтаксис
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 ] )
Описание
CREATE OPERATOR
определяет новый оператор,
name
. Пользователь, который
определяет оператор, становится его владельцем. Если указано имя схемы,
то оператор создается в указанной схеме. В противном случае
он создается в текущей схеме.
Имя оператора - это последовательность из максимум NAMEDATALEN
-1
(по умолчанию 63) символов из следующего списка:
+ - * / < > = ~ ! @ # % ^ & | ` ?
Есть несколько ограничений на выбор имени:
--
и/*
не могут появляться в имени оператора, так как они будут восприняты как начало комментария.Имя оператора, состоящее из нескольких символов, не может заканчиваться на
+
или-
, если в имени также не содержится хотя бы один из этих символов:~ ! @ # % ^ & | ` ?
Например,
@-
является допустимым именем оператора, но*-
нет. Это ограничение позволяет Tantor BE разбирать команды, совместимые с SQL, без необходимости пробелов между компонентами.Символ
=>
зарезервирован грамматикой SQL, поэтому его нельзя использовать в качестве имени оператора.
Оператор !=
отображается на <>
при вводе, поэтому эти два имени всегда эквивалентны.
Для бинарных операторов должны быть определены оба и LEFTARG
, и RIGHTARG
. Для префиксных операторов должен быть определен только RIGHTARG
.
Функция function_name
должна быть предварительно определена с использованием команды CREATE FUNCTION
и должна быть определена для принятия правильного количества аргументов (одного или двух) указанных типов.
В синтаксисе CREATE OPERATOR
ключевые слова FUNCTION
и PROCEDURE
эквивалентны, но ссылочная функция должна быть в любом случае функцией, а не процедурой. Использование ключевого слова PROCEDURE
здесь является историческим и устаревшим.
Другие предложения указывают необязательные атрибуты оптимизации оператора. Их значение подробно описано в Раздел 34.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.===) ,
Примечания
См. Раздел 34.13 и Раздел 34.14 для получения дополнительной информации.
Когда вы определяете самокоммутативный оператор, вы просто это делаете. Когда вы определяете пару коммутативных операторов, все немного сложнее: как первый из них может ссылаться на другой, который вы еще не определили? Существует три решения этой проблемы:
Один из способов - опустить
COMMUTATOR
в первом операторе, который вы определяете, а затем указать его в определении второго оператора. Поскольку Tantor BE знает, что коммутативные операторы идут парами, когда он видит второе определение, он автоматически вернется и заполнит отсутствующийCOMMUTATOR
в первом определении.Другой, более простой способ - просто включить
COMMUTATOR
в оба определения. Когда Tantor BE обрабатывает первое определение и обнаруживает, чтоCOMMUTATOR
ссылается на несуществующий оператор, система создаст фиктивную запись для этого оператора в системном каталоге. Эта фиктивная запись будет содержать действительные данные только для имени оператора, типов левого и правого операндов и владельца, так как это все, что Tantor BE может определить на данном этапе. Запись каталога первого оператора будет ссылаться на эту фиктивную запись. Позже, когда вы определите второй оператор, система обновит фиктивную запись с дополнительной информацией из второго определения. Если вы попытаетесь использовать фиктивный оператор до того, как он будет заполнен, вы просто получите сообщение об ошибке.Как вариант, оба оператора могут быть определены без предложений
COMMUTATOR
и затем можно использоватьALTER OPERATOR
для установки их коммутирующих связей. Достаточно применитьALTER
к одному из этих операторов.
Во всех трех случаях вы должны владеть обоими операторами, чтобы пометить их как коммутаторы.
Пары операторов-отрицателей могут быть определены с использованием тех же методов, что и для пар коммутаторов.
Невозможно указать лексический приоритет оператора в 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 BE. В стандарте SQL нет возможности определения пользовательских операторов.