ALTER OPERATOR FAMILY
Эта страница переведена при помощи нейросети GigaChat.
ALTER OPERATOR FAMILY
— изменение определения семейства операторов.
Синтаксис
ALTER OPERATOR FAMILY name USING index_method ADD
{ OPERATOR strategy_number operator_name ( op_type, op_type )
[ FOR SEARCH | FOR ORDER BY sort_family_name ]
| FUNCTION support_number [ ( op_type [ , op_type ] ) ]
function_name [ ( argument_type [, ...] ) ]
} [, ... ]
ALTER OPERATOR FAMILY name USING index_method DROP
{ OPERATOR strategy_number ( op_type [ , op_type ] )
| FUNCTION support_number ( op_type [ , op_type ] )
} [, ... ]
ALTER OPERATOR FAMILY name USING index_method
RENAME TO new_name
ALTER OPERATOR FAMILY name USING index_method
OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER OPERATOR FAMILY name USING index_method
SET SCHEMA new_schema
Описание
ALTER OPERATOR FAMILY
используется для изменения определения семейства операторов. С ее помощью можно добавлять или удалять операторы и функции поддержки, а также изменять имя или владельца семейства.
Когда операторы и функции добавляются в семейство с помощью ALTER OPERATOR FAMILY
, они не привязываются к конкретному классу операторов, а становятся «незакрепленными» элементами семейства. Это означает, что они совместимы с семантикой семейства, но не обязательны для работы какого-либо конкретного индекса. Операторы и функции, необходимые для работы индексов, следует добавлять через CREATE OPERATOR CLASS.
Незакрепленные элементы семейства можно удалить в любой момент. В отличие от них, элементы класса операторов нельзя удалить отдельно — нужно удалять весь класс операторов, а также все индексы, которые на нем основаны. Обычно функции и операторы, работающие с одним типом данных, включаются в классы операторов, а межтиповые элементы добавляются напрямую в семейство как незакрепленные.
Чтобы выполнить эту команду, необходимо быть суперпользователем. Это ограничение сделано потому, что ошибочное определение семейства операторов может запутать или даже привести к сбою сервера.
Команда не проверяет, достаточно ли в семействе операторов и функций, требуемых для метода доступа к индексу, и не проверяет логическую согласованность между ними. Ответственность за корректность лежит на пользователе.
Дополнительные сведения описаны в разделе «Интерфейсы расширений для индексов».
Параметры
name
- Имя существующего семейства операторов, при необходимости дополненное схемой, которое должно быть изменено.
index_method
- Имя метода доступа к индексу, для которого предназначено семейство операторов.
strategy_number
- Номер стратегии метода доступа к индексу для оператора, связанного с указанным семейством операторов.
operator_name
- Имя существующего оператора, при необходимости дополненное схемой, связанного с указанным семейством операторов.
op_type
- Тип(ы) данных операндов оператора.
В выражении
OPERATOR
обязательно следует указать тип(ы) данных операндов оператора, либо использоватьNONE
для обозначения префиксного оператора. В отличие от синтаксисаCREATE OPERATOR CLASS
, здесь типы операндов не могут быть опущены.В выражении
ADD FUNCTION
указываются тип(ы) данных операндов, с которыми функция должна работать, если они отличаются от фактических входных параметров функции. Для функций сравнения B-tree и хеш-функций указание типов не требуется, так как они всегда совпадают с типами входных аргументов. Однако для функций поддержки сортировки в B-tree, функций равенства образов и всех функций в классах операторов 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 — они могут быть встроены в запрос, и оптимизатор не распознает соответствие индексу.
До версии PostgreSQL 8.4 параметр RECHECK
указывался в OPERATOR
, но теперь необходимость перепроверки определяется автоматически во время выполнения. Это позволяет эффективно обрабатывать случаи, когда оператор может быть или не быть потерянным.
Примеры
Добавление операторов и функций поддержки для различных типов данных к семейству операторов, которое уже содержит классы операторов B-tree для типов данных 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
.
Смотрите также
CREATE OPERATOR FAMILY, DROP OPERATOR FAMILY, CREATE OPERATOR CLASS, ALTER OPERATOR CLASS, DROP OPERATOR CLASS