Перейти к основному содержимому

CREATE OPERATOR CLASS

примечание

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

CREATE OPERATOR CLASS — создание нового класса операторов.

Синтаксис​

CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type
USING index_method [ FAMILY family_name ] AS
{ 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 [, ...] )
| STORAGE storage_type
} [, ... ]

Описание​

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

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

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

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

Связанные между собой классы операторов могут быть объединены в семейства операторов. Чтобы включить новый класс в существующее семейство, указывается параметр FAMILY. Если его нет, создается новое семейство с таким же именем, как и у класса.

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

Параметры​

name

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

DEFAULT

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

data_type

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

index_method

Указывает название метода доступа к индексу (например, btree), с которым будет использоваться данный класс операторов.

family_name

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

strategy_number

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

operator_name

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

op_type

Указывает типы данных операндов оператора:

  • Для выражения OPERATOR— типы данных операндов оператора (можно указать NONE для префиксного оператора). В типовом случае, когда операнды совпадают с типом данных класса, можно не указывать.
  • Для выражения FUNCTION — типы данных операндов, для которых предназначена функция (если отличаются от типов ее аргументов). Это применяется, например, для функций сравнения в B-tree или функций хеширования.

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

sort_family_name

Указывает имя существующего семейства операторов B-tree, при необходимости дополненное схемой, которое описывает порядок сортировки, связанный с оператором сортировки (ORDER BY).

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

support_number

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

function_name

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

argument_type

Задает типы аргументов для указанной функции.

storage_type

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

Если data_type указан как anyarray, можно указать storage_type как anyelement, чтобы отразить, что записи в индексе являются членами типа элемента, принадлежащего к фактическому типу массива, для которого создается конкретный индекс.

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

Примечания​

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

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

Примеры​

Создание класса операторов индекса GiST для типа данных _int4 (массив из int4):

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

Смотрите модуль intarray для полного примера.

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

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

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

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