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_USER | SESSION_USER }

ALTER OPERATOR FAMILY <name> USING <index_method> SET SCHEMA <new_schema>

Описание

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

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

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

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

Параметры

  • name
    • Имя (при необходимости с указанием схемы) существующего семейства операторов.
  • index_method
    • Имя метода индексации, для которого предназначено данное семейство операторов.
  • strategy_number
    • Номер стратегии метода индексации для оператора, связанного с данным семейством.
  • operator_name
    • Имя (при необходимости с указанием схемы) оператора, связанного с семейством операторов.
  • op_type
    • В предложении OPERATOR — тип(ы) операндов оператора или NONE, чтобы обозначить унарный оператор слева или справа. В отличие от аналогичного синтаксиса в CREATE OPERATOR CLASS, типы операндов всегда должны быть указаны.
    • В предложении ADD FUNCTION — тип(ы) операндов, которые функция должна поддерживать, если они отличаются от входных типов данных функции. Для функций сравнения B-tree и хеш-функций указывать op_type не требуется, так как входные типы данных функции всегда являются правильными. Для функций сортировки B-tree и всех функций в классах операторов 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 это может не иметь отношения к фактическим типам аргументов функции.

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

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

Примеры

Следующая команда добавляет кросс-типовые операторы и вспомогательные функции в семейство операторов, которое уже содержит классы операторов B-tree для типов данных 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) ;

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

Оператор ALTER OPERATOR FAMILY отсутствует в стандарте SQL.