ALTER OPERATOR FAMILY#
ALTER OPERATOR FAMILY
ALTER OPERATOR FAMILY — изменить определение семейства операторов
Синтаксис
ALTER OPERATOR FAMILYnameUSINGindex_methodADD { OPERATORstrategy_numberoperator_name(op_type,op_type) [ FOR SEARCH | FOR ORDER BYsort_family_name] | FUNCTIONsupport_number[ (op_type[ ,op_type] ) ]function_name[ (argument_type[, ...] ) ] } [, ... ] ALTER OPERATOR FAMILYnameUSINGindex_methodDROP { OPERATORstrategy_number(op_type[ ,op_type] ) | FUNCTIONsupport_number(op_type[ ,op_type] ) } [, ... ] ALTER OPERATOR FAMILYnameUSINGindex_methodRENAME TOnew_nameALTER OPERATOR FAMILYnameUSINGindex_methodOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER OPERATOR FAMILYnameUSINGindex_methodSET SCHEMAnew_schema
Описание
ALTER OPERATOR FAMILY изменяет определение семейства операторов. Вы можете добавлять операторы и функции поддержки в семейство, удалять их из семейства или изменять имя или владельца семейства.
Когда операторы и функции поддержки добавляются в семейство с помощью команды ALTER OPERATOR FAMILY, они не являются частью какого-либо конкретного класса операторов внутри семейства, а просто “свободны” внутри семейства. Это означает, что эти операторы и функции совместимы с семантикой семейства, но не являются необходимыми для правильной работы какого-либо конкретного индекса. (Операторы и функции, которые необходимы, должны быть объявлены как часть класса операторов, см. CREATE OPERATOR CLASS).
Tantor SE позволяет удалять свободные элементы семейства из семейства в любое время, но элементы класса операторов не могут быть удалены без удаления всего класса и любых индексов, которые от него зависят.
Обычно операторы и функции с одним типом данных являются частью классов операторов, потому что они необходимы для поддержки индекса на этом конкретном типе данных, в то время как операторы и функции с разными типами данных становятся свободными элементами семейства.
необходимо быть суперпользователем, чтобы использовать команду ALTER OPERATOR FAMILY.
(Это ограничение сделано потому, что неправильное определение семейства операторов может запутать или даже вызвать сбой сервера).
ALTER OPERATOR FAMILY в настоящее время не проверяет, включает ли определение семейства операторов все операторы и функции, необходимые для метода индекса, а также не проверяет, образуют ли операторы и функции самосогласованное множество. Пользователь несет ответственность за определение допустимого семейства операторов.
Ссылка на дополнительную информацию можно найти в Раздел 35.15.
Параметры
nameИмя (опционально с указанием схемы) существующей семьи операторов.
index_methodThe 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 SE8.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.