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.