ALTER OPERATOR FAMILY#
ALTER OPERATOR FAMILY
ALTER OPERATOR FAMILY — изменить определение семейства операторов
Синтаксис
ALTER OPERATOR FAMILYname
USINGindex_method
ADD { OPERATORstrategy_number
operator_name
(op_type
,op_type
) [ FOR SEARCH | FOR ORDER BYsort_family_name
] | FUNCTIONsupport_number
[ (op_type
[ ,op_type
] ) ]function_name
[ (argument_type
[, ...] ) ] } [, ... ] ALTER OPERATOR FAMILYname
USINGindex_method
DROP { OPERATORstrategy_number
(op_type
[ ,op_type
] ) | FUNCTIONsupport_number
(op_type
[ ,op_type
] ) } [, ... ] ALTER OPERATOR FAMILYname
USINGindex_method
RENAME TOnew_name
ALTER OPERATOR FAMILYname
USINGindex_method
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER OPERATOR FAMILYname
USINGindex_method
SET SCHEMAnew_schema
Описание
ALTER OPERATOR FAMILY
изменяет определение семейства операторов. Вы можете добавлять операторы и функции поддержки в семейство, удалять их из семейства или изменять имя или владельца семейства.
Когда операторы и функции поддержки добавляются в семейство с помощью команды ALTER OPERATOR FAMILY
, они не являются частью какого-либо конкретного класса операторов внутри семейства, а просто “свободны” внутри семейства. Это означает, что эти операторы и функции совместимы с семантикой семейства, но не являются необходимыми для правильной работы какого-либо конкретного индекса. (Операторы и функции, которые необходимы, должны быть объявлены как часть класса операторов, см. CREATE OPERATOR CLASS).
Tantor BE позволяет удалять свободные элементы семейства из семейства в любое время, но элементы класса операторов не могут быть удалены без удаления всего класса и любых индексов, которые от него зависят.
Обычно операторы и функции с одним типом данных являются частью классов операторов, потому что они необходимы для поддержки индекса на этом конкретном типе данных, в то время как операторы и функции с разными типами данных становятся свободными элементами семейства.
необходимо быть суперпользователем, чтобы использовать команду ALTER OPERATOR FAMILY
.
(Это ограничение сделано потому, что неправильное определение семейства операторов может запутать или даже вызвать сбой сервера).
ALTER OPERATOR FAMILY
в настоящее время не проверяет, включает ли определение семейства операторов все операторы и функции, необходимые для метода индекса, а также не проверяет, образуют ли операторы и функции самосогласованное множество. Пользователь несет ответственность за определение допустимого семейства операторов.
Ссылка на дополнительную информацию можно найти в Раздел 35.15.
Параметры
name
Имя (опционально с указанием схемы) существующей семьи операторов.
index_method
The name of the index method this operator family is for.
strategy_number
Номер стратегии метода индекса для оператора, связанного с семейством операторов.
operator_name
Имя (опционально с указанием схемы) оператора, связанного с семейством операторов.
op_type
В предложении
OPERATOR
, тип(ы) данных операнда оператора илиNONE
для обозначения префиксного оператора. В отличие от сопоставимого синтаксиса вCREATE OPERATOR CLASS
, типы данных операндов всегда должны быть указаны.В операторе
ADD FUNCTION
указываются типы данных операндов, которые функция должна поддерживать, если они отличаются от типов данных входных параметров функции. Для функций сравнения B-дерева и хеш-функций не требуется указыватьop_type
, поскольку типы данных входных параметров функции всегда являются правильными для использования. Для функций поддержки сортировки B-дерева, функций равенства изображения B-дерева и всех функций в классах операторов GiST, SP-GiST и GIN необходимо указать типы данных операндов, с которыми функция будет использоваться.В операторе
DROP FUNCTION
необходимо указать тип(ы) данных операнда, которые функция должна поддерживать.sort_family_name
Имя (опционально с указанием схемы) существующей семьи операторов
btree
, которая описывает порядок сортировки, связанный с оператором сортировки.Если не указаны ни
FOR SEARCH
, ниFOR ORDER BY
, по умолчанию используетсяFOR SEARCH
.support_number
Номер опорной функции метода индекса для функции, связанной с семейством операторов.
function_name
Имя (опционально с указанием схемы) функции, которая является функцией поддержки метода индекса для семейства операторов. Если не указан список аргументов, имя должно быть уникальным в своей схеме.
argument_type
Тип(ы) данных параметра функции.
new_name
Новое имя семейства операторов.
new_owner
Новый владелец семейства операторов.
new_schema
Новая схема для семейства операторов.
Предложения OPERATOR
и FUNCTION
могут появляться в любом порядке.
Примечания
Обратите внимание, что синтаксис DROP
указывает только “слот” в операторной семье, по стратегии или номеру поддержки и типу(ам) входных данных. Имя оператора или функции, занимающей слот, не упоминается. Кроме того, для DROP FUNCTION
тип(ы), которые нужно указать, являются типами входных данных, которые функция должна поддерживать; для индексов GiST, SP-GiST и GIN это может не иметь ничего общего с фактическими типами входных аргументов функции.
Поскольку механизм индексов не проверяет права доступа к функциям перед их использованием, включение функции или оператора в семейство операторов равносильно предоставлению публичного разрешения на ее выполнение. Это обычно не является проблемой для типов функций, которые полезны в семействе операторов.
Операторы не должны быть определены с помощью SQL-функций. SQL-функция, скорее всего, будет встроена в вызывающий запрос, что предотвратит оптимизатор от распознавания соответствия запроса индексу.
Перед Tantor BE8.4, в операторе OPERATOR
можно было использовать опцию RECHECK
. Это больше не поддерживается, потому что теперь определяется на лету, является ли оператор индекса “потерянным” во время выполнения. Это позволяет эффективно обрабатывать случаи, когда оператор может быть потерянным или нет.
Примеры
Следующая команда добавляет операторы и функции поддержки для перекрестного типа данных в семейство операторов, которое уже содержит классы операторов B-дерево для типов данных int4
и int2
.
ALTER OPERATOR FAMILY integer_ops USING btree ADD -- int4 vs int2 OPERATOR 1 < (int4, int2) , OPERATOR 2 <= (int4, int2) , OPERATOR 3 = (int4, int2) , OPERATOR 4 >= (int4, int2) , OPERATOR 5 > (int4, int2) , FUNCTION 1 btint42cmp(int4, int2) , -- int2 vs int4 OPERATOR 1 < (int2, int4) , OPERATOR 2 <= (int2, int4) , OPERATOR 3 = (int2, int4) , OPERATOR 4 >= (int2, int4) , OPERATOR 5 > (int2, int4) , FUNCTION 1 btint24cmp(int2, int4) ;
Чтобы удалить эти записи снова:
ALTER OPERATOR FAMILY integer_ops USING btree DROP -- int4 vs int2 OPERATOR 1 (int4, int2) , OPERATOR 2 (int4, int2) , OPERATOR 3 (int4, int2) , OPERATOR 4 (int4, int2) , OPERATOR 5 (int4, int2) , FUNCTION 1 (int4, int2) , -- int2 vs int4 OPERATOR 1 (int2, int4) , OPERATOR 2 (int2, int4) , OPERATOR 3 (int2, int4) , OPERATOR 4 (int2, int4) , OPERATOR 5 (int2, int4) , FUNCTION 1 (int2, int4) ;
Совместимость
В стандарте SQL нет оператора ALTER OPERATOR FAMILY
.