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