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