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