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

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 вероятнее всего будет встроена в вызывающий запрос, что помешает оптимизатору понять, что этот запрос соответствует индексу.

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

Примеры

Создание класса операторов индекса 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