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
не проверяет, включает ли
определение класса оператора все операторы и функции, требуемые
индексным методом, и образуют ли операторы и функции целостный
набор. Ответственность за определение корректного класса операторов
лежит на пользователе.
Связанные классы операторов можно сгруппировать в семейства операторов.
Чтобы добавить новый класс оператора в существующее семейство, укажите
параметр FAMILY в команде CREATE OPERATOR CLASS
. Без этого параметра новый
класс помещается в семейство с тем же именем, что и класс
(если такое семейство не существует, оно создается).
Дополнительную информацию см. в разделе Интерфейсные расширения для индексов.
Параметры
имя
Имя создаваемого класса операторов (может быть дополнено схемой).
DEFAULT
При наличии этого указания класс операторов становится классом по умолчанию для своего типа данных. У конкретного типа данных и индексного метода не может быть более одного класса операторов по умолчанию.
тип_данных
Тип данных столбца, для которого предназначен этот класс операторов.
индексный метод
Имя индексного метода, для которого предназначен этот класс операторов.
имя_семейства
Имя существующего семейства операторов, в которое будет добавлен этот класс. Если не указано, используется семейство с тем же именем, что и у класса оператора (если такое семейство не существует, оно создается).
номер_стратегии
Номер стратегии индексного метода для оператора, связанного с классом оператора.
имя_оператора
Имя оператора, связанного с данным классом оператора (может быть дополнено схемой).
тип_операнда
В предложении OPERATOR это тип(ы) данных операнда (либо ключевое слово NONE), характеризующий левый унарный или правый унарный оператор. В нормальных условиях, когда типы данных операнда совпадают с типом данных класса оператора, их можно опустить.
В предложении FUNCTION это тип(ы) данных операнда, для поддержки которого предназначена эта функция, если тот отличается от типа(ов) входных данных функции (для функций сравнения B-дерева и хэш-функций) или типа данных класса (для вспомогательных функций сортировки B-дерева и всех функций в классах операторов GiST, SP-GiST, GIN и BRIN). Обычно предполагаемые по умолчанию типы оказываются верными, так что тип_операнда указывать в FUNCTION не нужно (исключение составляют функции сортировки B-дерева, предназначенные для сравнений разных типов данных).
имя_семейства_сортировки
Имя существующего семейства операторов В-деревьев, описывающего порядок сортировки, связанный с оператором сортировки (может быть дополнено схемой).
Если не указано ни FOR SEARCH (для поиска), ни FOR ORDER BY (для сортировки), по умолчанию подразумевается FOR SEARCH.
номер_вспомогательной_функции
Номер вспомогательной функции индексного метода для функции, связанной с классом операторов.
имя_функции
Имя функции, которая является вспомогательной функцией индексного метода для класса операторов (может быть дополнено схемой).
тип_аргумента
Тип(ы) данных параметра функции.
тип_хранения
Тип данных, фактически сохраненных в индексе. Обычно это то же самое, что и тип данных столбца, но некоторые индексные методы (в настоящее время GiST, GIN и BRIN) могут работать с отличающимся типом. Если тип_данных столбца задан как anyarray, тип_хранения может быть объявлен как 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);
Совместимость
Команда CREATE OPERATOR CLASS
является расширением
QHB. В стандарте SQL такой команды нет.
См. также
ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY