ALTER OPERATOR FAMILY#

Примечание

Эта страница переведена при помощи нейросети GigaChat.

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.

Незакрепленные элементы семейства можно удалить в любой момент. В отличие от них, элементы класса операторов нельзя удалить отдельно — нужно удалять весь класс операторов, а также все индексы, которые на нем основаны. Обычно функции и операторы, работающие с одним типом данных, включаются в классы операторов, а межтиповые элементы добавляются напрямую в семейство как незакрепленные.

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

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

Дополнительные сведения описаны в разделе «Интерфейсы расширений для индексов».

Параметры#

name

Имя существующего семейства операторов, при необходимости дополненное схемой, которое должно быть изменено.

index_method

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

strategy_number

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

operator_name

Имя существующего оператора, при необходимости дополненное схемой, связанного с указанным семейством операторов.

op_type

Тип(ы) данных операндов оператора.

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

В выражении ADD FUNCTION указываются тип(ы) данных операндов, с которыми функция должна работать, если они отличаются от фактических входных параметров функции. Для функций сравнения B-tree и хеш-функций указание типов не требуется, так как они всегда совпадают с типами входных аргументов. Однако для функций поддержки сортировки в 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 это может отличаться от реальных аргументов функции.

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

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

До версии PostgreSQL 8.4 параметр RECHECK указывался в OPERATOR, но теперь необходимость перепроверки определяется автоматически во время выполнения. Это позволяет эффективно обрабатывать случаи, когда оператор может быть или не быть потерянным.

Примеры#

Добавление операторов и функций поддержки для различных типов данных к семейству операторов, которое уже содержит классы операторов 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) ;

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

В стандарте SQL нет команды ALTER OPERATOR FAMILY.

Смотрите также#

CREATE OPERATOR FAMILY, DROP OPERATOR FAMILY, CREATE OPERATOR CLASS, ALTER OPERATOR CLASS, DROP OPERATOR CLASS