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 и 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