Перейти к основному содержимому

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