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.) PostgreSQL позволяет удалять слабосвязанные члены из семейства в любое время, но члены класса операторов не могут быть удалены, пока не будет удалён весь класс и все зависимые от него индексы. Обычно в классы операторов включаются операторы и функции, работающие с одним типом данным (так как они нужны для поддержки индексов данных такого типа), а межтиповые функции и операторы становятся слабосвязанными членами семейства.
Выполнить ALTER OPERATOR FAMILY может только суперпользователь. (Это ограничение введено потому, что ошибочное определение семейства операторов может вызвать нарушения или даже сбой в работе сервера.)
ALTER OPERATOR FAMILY в настоящее время не проверяет, включает ли определение семейства операторов все операторы и функции, требуемые для индексного метода, и образуют ли они целостный набор. Ответственность за правильность определения семейства лежит на пользователе.
За дополнительными сведениями обратитесь к Разделу 36.16.
Параметры
имяИмя существующего семейства операторов (возможно, дополненное схемой).
индексный_методИмя индексного метода, для которого предназначено это семейство операторов.
номер_стратегииНомер стратегии индексного метода для оператора, связанного с данным семейством операторов.
имя_оператораИмя (возможно, дополненное схемой) оператора, связанного с данным семейством операторов.
тип_операндаВ предложении
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 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) ;
Совместимость
Команда ALTER OPERATOR FAMILY отсутствует в стандарте SQL.