ALTER OPERATOR FAMILY#

ALTER OPERATOR FAMILY

ALTER OPERATOR FAMILY

ALTER OPERATOR FAMILY — изменить определение семейства операторов

Синтаксис

ALTER OPERATOR FAMILY name USING index_method ADD
  {  OPERATOR strategy_number operator_name ( op_type, op_type )
              [ FOR SEARCH | FOR ORDER BY sort_family_name ]
   | FUNCTION support_number [ ( op_type [ , op_type ] ) ]
              function_name [ ( argument_type [, ...] ) ]
  } [, ... ]

ALTER OPERATOR FAMILY name USING index_method DROP
  {  OPERATOR strategy_number ( op_type [ , op_type ] )
   | FUNCTION support_number ( op_type [ , op_type ] )
  } [, ... ]

ALTER OPERATOR FAMILY name USING index_method
    RENAME TO new_name

ALTER OPERATOR FAMILY name USING index_method
    OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }

ALTER OPERATOR FAMILY name USING index_method
    SET SCHEMA new_schema

Описание

ALTER OPERATOR FAMILY изменяет определение семейства операторов. Вы можете добавлять операторы и функции поддержки в семейство, удалять их из семейства или изменять имя или владельца семейства.

Когда операторы и функции поддержки добавляются в семейство с помощью команды ALTER OPERATOR FAMILY, они не являются частью какого-либо конкретного класса операторов внутри семейства, а просто свободны внутри семейства. Это означает, что эти операторы и функции совместимы с семантикой семейства, но не являются необходимыми для правильной работы какого-либо конкретного индекса. (Операторы и функции, которые необходимы, должны быть объявлены как часть класса операторов, см. CREATE OPERATOR CLASS). Tantor BE позволяет удалять свободные элементы семейства из семейства в любое время, но элементы класса операторов не могут быть удалены без удаления всего класса и любых индексов, которые от него зависят. Обычно операторы и функции с одним типом данных являются частью классов операторов, потому что они необходимы для поддержки индекса на этом конкретном типе данных, в то время как операторы и функции с разными типами данных становятся свободными элементами семейства.

необходимо быть суперпользователем, чтобы использовать команду ALTER OPERATOR FAMILY. (Это ограничение сделано потому, что неправильное определение семейства операторов может запутать или даже вызвать сбой сервера).

ALTER OPERATOR FAMILY в настоящее время не проверяет, включает ли определение семейства операторов все операторы и функции, необходимые для метода индекса, а также не проверяет, образуют ли операторы и функции самосогласованное множество. Пользователь несет ответственность за определение допустимого семейства операторов.

Ссылка на дополнительную информацию можно найти в Раздел 35.15.

Параметры

name

Имя (опционально с указанием схемы) существующей семьи операторов.

index_method

The name of the index method this operator family is for.

strategy_number

Номер стратегии метода индекса для оператора, связанного с семейством операторов.

operator_name

Имя (опционально с указанием схемы) оператора, связанного с семейством операторов.

op_type

В предложении OPERATOR, тип(ы) данных операнда оператора или NONE для обозначения префиксного оператора. В отличие от сопоставимого синтаксиса в CREATE OPERATOR CLASS, типы данных операндов всегда должны быть указаны.

В операторе ADD FUNCTION указываются типы данных операндов, которые функция должна поддерживать, если они отличаются от типов данных входных параметров функции. Для функций сравнения B-дерева и хеш-функций не требуется указывать op_type, поскольку типы данных входных параметров функции всегда являются правильными для использования. Для функций поддержки сортировки B-дерева, функций равенства изображения B-дерева и всех функций в классах операторов GiST, SP-GiST и GIN необходимо указать типы данных операндов, с которыми функция будет использоваться.

В операторе DROP FUNCTION необходимо указать тип(ы) данных операнда, которые функция должна поддерживать.

sort_family_name

Имя (опционально с указанием схемы) существующей семьи операторов btree, которая описывает порядок сортировки, связанный с оператором сортировки.

Если не указаны ни FOR SEARCH, ни FOR ORDER BY, по умолчанию используется FOR SEARCH.

support_number

Номер опорной функции метода индекса для функции, связанной с семейством операторов.

function_name

Имя (опционально с указанием схемы) функции, которая является функцией поддержки метода индекса для семейства операторов. Если не указан список аргументов, имя должно быть уникальным в своей схеме.

argument_type

Тип(ы) данных параметра функции.

new_name

Новое имя семейства операторов.

new_owner

Новый владелец семейства операторов.

new_schema

Новая схема для семейства операторов.

Предложения OPERATOR и FUNCTION могут появляться в любом порядке.

Примечания

Обратите внимание, что синтаксис DROP указывает только слот в операторной семье, по стратегии или номеру поддержки и типу(ам) входных данных. Имя оператора или функции, занимающей слот, не упоминается. Кроме того, для DROP FUNCTION тип(ы), которые нужно указать, являются типами входных данных, которые функция должна поддерживать; для индексов GiST, SP-GiST и GIN это может не иметь ничего общего с фактическими типами входных аргументов функции.

Поскольку механизм индексов не проверяет права доступа к функциям перед их использованием, включение функции или оператора в семейство операторов равносильно предоставлению публичного разрешения на ее выполнение. Это обычно не является проблемой для типов функций, которые полезны в семействе операторов.

Операторы не должны быть определены с помощью SQL-функций. SQL-функция, скорее всего, будет встроена в вызывающий запрос, что предотвратит оптимизатор от распознавания соответствия запроса индексу.

Перед Tantor BE8.4, в операторе OPERATOR можно было использовать опцию RECHECK. Это больше не поддерживается, потому что теперь определяется на лету, является ли оператор индекса потерянным во время выполнения. Это позволяет эффективно обрабатывать случаи, когда оператор может быть потерянным или нет.

Примеры

Следующая команда добавляет операторы и функции поддержки для перекрестного типа данных в семейство операторов, которое уже содержит классы операторов B-дерево для типов данных int4 и int2.

ALTER OPERATOR FAMILY integer_ops USING btree ADD

  -- 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 btint42cmp(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 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) ;

Совместимость

В стандарте SQL нет оператора ALTER OPERATOR FAMILY.