CREATE OPERATOR CLASS

CREATE OPERATOR CLASS — определить новый класс операторов


Синтаксис

CREATE OPERATOR CLASS имя [ DEFAULT ] FOR TYPE тип_данных
  USING индексный_метод [ FAMILY имя_семейства ] AS
  {  OPERATOR номер_стратегии имя_оператора [ ( тип_операнда, тип_операнда ) ] [ FOR SEARCH | FOR ORDER BY имя_семейства_сортировки ]
   | FUNCTION номер_вспомогательной_функции [ ( тип_операнда [ , тип_операнда ] ) ] имя_функции ( тип_аргумента [, ...] )
   | STORAGE тип_хранения
  } [, ... ]

Описание

Команда CREATE OPERATOR CLASS создает новый класс операторов. Класс операторов определяет, как конкретный тип данных может использоваться с индексом. Класс операторов указывает, что некоторые операторы будут исполнять для этого типа данных и этого индексного метода определенные роли или «стратегии». Также класс операторов определяет вспомогательные функции, которые будут использоваться индексным методом при выборе класса операторов для столбца индекса. Все операторы и функции, используемые классом операторов, должны быть определены еще до его создания.

Если задано имя схемы, то класс операторов создается в указанной схеме. В остальных случаях он создается в текущей схеме. Два класса операторов в одной схеме могут иметь одинаковое имя только в том случае, если они предназначены для разных индексных методов.

Пользователь, определяющий класс операторов, становится его владельцем. В настоящее время создавать классы операторов могут только суперпользователи. (Причина этого ограничения в том, что ошибочное определение класса операторов может вызвать нарушения или даже сбой в работе сервера.)

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

Связанные классы операторов можно сгруппировать в семейства операторов. Чтобы добавить новый класс операторов в существующее семейство, укажите в команде CREATE OPERATOR CLASS параметр FAMILY. Без этого параметра новый класс помещается в семейство с тем же именем, что и класс (если такое семейство не существует, оно создается).

Дополнительную информацию см. в разделе Интерфейсные расширения для индексов.


Параметры

имя

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

DEFAULT

При наличии этого указания класс операторов становится классом по умолчанию для своего типа данных. У конкретного типа данных и индексного метода не может быть более одного класса операторов по умолчанию.

тип_данных

Тип данных столбца, для которого предназначен этот класс операторов.

индексный_метод

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

имя_семейства

Имя существующего семейства операторов, в которое будет добавлен этот класс. Если не указано, используется семейство с тем же именем, что и у класса операторов (если такое семейство не существует, оно создается).

номер_стратегии

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

имя_оператора

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

тип_операнда

В предложении OPERATOR это тип данных операнда оператора либо ключевое слово NONE, характеризующее префиксный оператор. В нормальных условиях типы данных операнда можно опустить, когда они совпадают с типом данных класса операторов.
В предложении FUNCTION это тип данных операнда, для поддержки которого предназначена эта функция, если тот отличается от типа входных данных функции (для функций сравнения в B-деревьях и хеш-функций) или типа данных класса (для вспомогательных функций сортировки и функций равенства образов B-деревьев и всех функций в классах операторов GiST, SP-GiST, GIN и BRIN). Обычно типы по умолчанию верны, так что тип_операнда указывать в FUNCTION не нужно (исключение составляют функции сортировки B-деревьев, предназначенные для сравнений разных типов данных).

имя_семейства_сортировки

Имя существующего семейства операторов btree (может быть дополнено схемой), описывающего порядок сортировки, связанный с оператором сортировки.
Если не указано ни FOR SEARCH (для поиска), ни FOR ORDER BY (для сортировки), по умолчанию подразумевается FOR SEARCH.

номер_вспомогательной_функции

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

имя_функции

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

тип_аргумента

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

тип_хранения

Тип данных, фактически сохраненных в индексе. Обычно это то же самое, что и тип данных столбца, но некоторые индексные методы (в настоящее время GiST, GIN, SP-GiST и BRIN) могут работать с отличающимся типом. Предложение STORAGE можно указывать, только если индексный метод позволяет использовать другой тип данных. Если тип_данных столбца задан как anyarray, тип_хранения может быть объявлен как anyelement, чтобы показать, что записи в индексе являются членами типа элемента, принадлежащего к фактическому типу массива, для которого создается конкретный индекс.

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


Примечания

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

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

Будет ли оператор индекса «слабосвязанным», определяется на лету во время выполнения. Это позволяет эффективно разрешать ситуации, когда оператор может быть «слабосвязанным», а может и не быть.


Примеры

Команда в следующем примере определяет класс операторов индекса GiST для типа данных _int4 (массива из int4). Полный пример приведен в модуле intarray.

CREATE OPERATOR CLASS gist__int_ops
    DEFAULT FOR TYPE _int4 USING gist AS
        OPERATOR        3       &&,
        OPERATOR        6       = (anyarray, anyarray),
        OPERATOR        7       @>,
        OPERATOR        8       <@,
        OPERATOR        20      @@ (_int4, query_int),
        FUNCTION        1       g_int_consistent (internal, _int4, smallint, oid, internal),
        FUNCTION        2       g_int_union (internal, internal),
        FUNCTION        3       g_int_compress (internal),
        FUNCTION        4       g_int_decompress (internal),
        FUNCTION        5       g_int_penalty (internal, internal, internal),
        FUNCTION        6       g_int_picksplit (internal, internal),
        FUNCTION        7       g_int_same (_int4, _int4, internal);

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

Команда CREATE OPERATOR CLASS является расширением QHB. В стандарте SQL такой команды нет.


См. также

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