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_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.14.
Параметры
имя
Имя существующего семейства операторов (возможно, дополненное схемой).
индексный_метод
Имя индексного метода, для которого предназначено это семейство операторов.
номер_стратегии
Номер стратегии индексного метода для оператора, связанного с данным семейством операторов.
имя_оператора
Имя (возможно, дополненное схемой) оператора, связанного с данным семейством операторов.
тип_операнда
В предложении
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-функция вероятнее всего будет встроена в вызывающий запрос, что помешает оптимизатору понять, что этот запрос соответствует индексу.
До PostgreSQL 8.4 предложение OPERATOR
могло включать указание RECHECK
. Теперь это не поддерживается, так как оператор индекса может быть «неточным» и это определяется на ходу в момент выполнения. Это позволяет эффективно справляться с ситуациями, когда оператор может быть или не быть неточным.
Примеры
Следующий пример добавляет опорные функции и операторы смешанных типов в семейство операторов, уже содержащее классы операторов 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.