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