ALTER OPERATOR FAMILY
ALTER OPERATOR FAMILY — изменить определение семейства операторов
Синтаксис
ALTER OPERATOR FAMILY имя USING индексный_метод ADD
{ OPERATOR номер_стратегии имя_оператора ( тип_операнда, тип_операнда )
[ FOR SEARCH | FOR ORDER BY имя_семейства_сортировки ]
| FUNCTION номер_вспомогательной_функции [ ( тип_операнда [ , тип_операнда ] ) ]
имя_функции [ ( тип_аргумента [, ...] ) ]
} [, ... ]
ALTER OPERATOR FAMILY имя USING индексный_метод DROP
{ OPERATOR номер_стратегии ( тип_операнда [ , тип_операнда ] )
| FUNCTION номер_вспомогательной_функции ( тип_операнда [ , тип_операнда ] )
} [, ... ]
ALTER OPERATOR FAMILY имя USING индексный_метод
RENAME TO новое_имя
ALTER OPERATOR FAMILY имя USING индексный_метод
OWNER TO { новый_владелец | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER OPERATOR FAMILY имя USING индексный_метод
SET SCHEMA новая_схема
Описание
Команда ALTER OPERATOR FAMILY изменяет определение семейства операторов. Можно
добавлять в семейство операторы и вспомогательные функции, удалять их оттуда,
изменять имя или владельца семейства операторов.
Когда операторы и вспомогательные функции добавляются в семейство операторов
командой ALTER OPERATOR FAMILY, они не становятся частью какого-либо конкретного
класса операторов в семействе, а просто считаются «слабосвязанными» с семейством.
Это свидетельствует о том, что данные операторы и функции семантически совместимы
с семейством, но не требуются для корректного функционирования какого-либо
конкретного индекса. (Операторы и функции, которые действительно требуются для
этого, должны быть объявлены как часть класса операторов; см. справочную страницу
команды CREATE OPERATOR CLASS.) QHB позволяет в любое время
удалять из семейства слабосвязанные члены, но нельзя удалить члены класса
операторов без удаления всего класса и всех зависящих от него индексов. Как
правило, в классы операторов включаются операторы и функции одного типа данных,
поскольку они необходимы для поддержки индекса для этого конкретного типа данных,
тогда как операторы и функции перекрестных типов данных становятся слабосвязанными
членами семейства.
Чтобы использовать команду ALTER OPERATOR FAMILY, нужно быть суперпользователем.
(Эти ограничения направлены на то, чтобы ошибочное определение семейства операторов
не вызвало нарушение или даже сбой в работе сервера.)
В настоящее время ALTER OPERATOR FAMILY не проверяет, включает ли определение
семейства операторов все операторы и функции, требуемые для индексного метода, и
образуют ли они целостный набор. Ответственность за определение допустимого
семейства операторов несет пользователь.
Дополнительную информацию см. в разделе Интерфейсные расширения для индексов.
Параметры
имя
Имя существующего семейства операторов (может быть дополнено схемой).
индексный_метод
Имя индексного метода, для которого предназначено это семейство операторов.
номер_стратегии
Номер стратегии индексного метода для оператора, связанного с этим семейством операторов.
имя_оператора
Имя оператора, связанного с этим семейством операторов (может быть дополнено схемой).
тип_операнда
В предложении OPERATOR указываются типы данных операнда оператора или NONE,
если это префиксный оператор. В отличие от схожего синтаксиса в команде
CREATE OPERATOR CLASS, типы данных операнда всегда должны быть указаны.
В предложении ADD FUNCTION указываются типы данных операнда оператора,
который должна поддерживать функция, если они отличаются от входных типов данных
этой функции. Для функций сравнения B-деревьев и хеш-функций указывать
тип_операнда необязательно, так как их входные типы данных всегда будут
верными. Однако для вспомогательных функций сортировки B-деревьев и всех функций
в классах операторов GiST, SP-GiST и GIN необходимо указать типы данных операндов,
с которыми будут использоваться эти функции.
В предложении DROP FUNCTION должны быть указаны типы данных операндов, для
поддержки которых предназначена функция.
имя_семейства_сортировки
Имя существующего семейства операторов btree (может быть дополнено схемой),
описывающего порядок сортировки, связанный с оператором сортировки.
Если не указано ни FOR SEARCH (для поиска), ни FOR ORDER BY (для
сортировки), то значением по умолчанию является FOR SEARCH.
номер_вспомогательной_функции
Номер вспомогательной функции индексного метода для функции, связанной с данным семейством операторов.
имя_функции
Имя функции (может быть дополнено схемой), являющейся вспомогательной функцией индексного метода для данного семейства операторов. Если список аргументов отсутствует, имя функции должно быть уникальным в своей схеме.
тип_аргумента
Тип(ы) данных параметра функции.
новое_имя
Новое имя семейства операторов.
новый_владелец
Новый владелец семейства операторов.
новая_схема
Новая схема для семейства операторов.
Предложения OPERATOR и FUNCTION можно указывать в любом порядке.
Примечания
Обратите внимание, что в синтаксисе DROP указывается только «слот» в семействе операторов (по номеру стратегии или вспомогательной функции) и входные типы данных. Имя оператора или функции, занимающей слот, не упоминается. Кроме того, для DROP FUNCTION необходимо указать тип(ы) входных данных, который должна поддерживать функция; для индексов GiST, SP-GiST и Gin это может не иметь ничего общего с фактическими типами данных входных аргументов функции.
Поскольку механизм индексирования не проверяет права доступа к функциям перед их использованием, включение функции или оператора в семейство операторов равносильно предоставлению всем права на их выполнение. Обычно не проблема для тех видов функций, которые бывают полезны в семействе операторов.
Операторы не должны определяться функциями SQL. Функция SQL, скорее всего, будет встроена в вызывающий запрос, что помешает оптимизатору распознать, что запрос соответствует индексу.
Будет ли оператор индекса «слабосвязанным», определяется на лету во время выполнения. Это позволяет эффективно разрешать ситуации, когда оператор может быть «слабосвязанным», а может и не быть.
Примеры
В следующем примере вспомогательные функции и операторы смешанных типов данных добавляются в семейство операторов, уже содержащее классы операторов B-дерева для типов данных int4 и int2.
ALTER OPERATOR FAMILY integer_ops USING btree ADD
-- int4 и 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 и 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 и 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 и 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