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