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> ] ) ] <funcname> ( <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>
ALTER OPERATOR FAMILY <name> USING <index_method> SET SCHEMA <new_schema>
Описание
ALTER OPERATOR FAMILY изменяет определение семейства операторов.
Вы можете добавить операторы и вспомогательные функции в семейство, удалить их из семейства или изменить имя или владельца семейства.
Когда операторы и вспомогательные функции добавляются в семейство с помощью ALTER OPERATOR FAMILY, они не являются частью какого-либо конкретного класса операторов внутри семейства, а просто "свободно" находятся внутри семейства.
Это означает, что эти операторы и функции совместимы с семантикой семейства, но не требуются для правильного функционирования какого-либо конкретного индекса.
Если такие операторы и функции необходимы, они должны быть объявлены как часть класса операторов; см. CREATE OPERATOR CLASS.
Вы можете удалить "свободных" членов семейства из семейства в любое время, но члены класса операторов не могут быть удалены без удаления всего класса и любых индексов, зависящих от него.
Обычно операторы и функции с одним типом данных являются частью классов операторов, потому что они необходимы для поддержки индекса по этому конкретному типу данных, в то время как операторы и функции перекрестных типов данных делаются "свободными" членами семейства.
Вы должны быть суперпользователем, чтобы использовать ALTER OPERATOR FAMILY.
Это ограничение сделано потому, что ошибочное определение семейства операторов может привести к проблемам на сервере.
ALTER OPERATOR FAMILY в настоящее время не проверяет, включает ли определение семейства операторов все операторы и функции, требуемые методом индексирования, и образуют ли операторы и функции самосогласованный набор.
Ответственность за определение корректного семейства операторов лежит на пользователе.
Выражения OPERATOR и FUNCTION могут появляться в любом порядке.
Параметры
| Параметр | Описание |
|---|---|
name |
Имя (опционально указанное со схемой) существующего семейства операторов |
index_method |
Имя метода индексирования, для которого предназначено это семейство операторов |
strategy_number |
Номер стратегии метода индексирования для оператора, связанного с семейством операторов |
operator_name |
Имя (опционально указанное со схемой) оператора, связанного с семейством операторов |
op_type |
В выражении |
sort_family_name |
Имя (опционально указанное со схемой) существующего семейства операторов |
support_number |
Номер вспомогательной процедуры метода индексирования для функции, связанной с семейством операторов |
funcname |
Имя (опционально указанное со схемой) функции, которая является вспомогательной процедурой метода индексирования для семейства операторов |
argument_types |
Типы данных параметров функции |
new_name |
Новое имя семейства операторов |
new_owner |
Новый владелец семейства операторов |
new_schema |
Новая схема для семейства операторов |
Примечания
Обратите внимание, что синтаксис DROP указывает только "слот" в семействе операторов по номеру стратегии или поддержки и типам входных данных.
Имя оператора или функции, занимающей слот, не упоминается.
Также для DROP FUNCTION указываемые типы — это типы входных данных, которые функция должна поддерживать; для индексов GiST, SP_GiST и GIN эти типы могут не иметь никакого отношения к фактическим типам входных аргументов самой функции.
Поскольку механизм индексов не проверяет права доступа к функциям перед их использованием, включение функции или оператора в семейство операторов равносильно предоставлению публичного права на выполнение для них. Обычно это не является проблемой для тех типов функций, которые полезны в семействе операторов.
Операторы не должны быть определены посредством SQL-функций. SQL-функция, скорее всего, будет встроена в вызывающий запрос, что помешает оптимизатору распознать, что запрос соответствует индексу.
До Greenplum Database DB 6.0 выражение OPERATOR могло включать опцию RECHECK.
Эта опция больше не поддерживается.
Greengage DB теперь определяет, является ли оператор индекса "lossy" (с потерями), на лету во время выполнения.
Это позволяет более эффективно обрабатывать случаи, когда оператор может быть или не быть "lossy".
Примеры
Следующая команда добавляет операторы и вспомогательные функции перекрестных типов данных в семейство операторов, которое уже содержит классы операторов 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.