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
. Без этого параметра новый класс помещается в семейство, имеющее то же имя, что и класс (если такое семейство не существует, оно создаётся).
За дополнительными сведениями обратитесь к Разделу 37.14.
Параметры
имя
Имя создаваемого класса операторов, возможно, дополненное схемой.
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-функция вероятнее всего будет встроена в вызывающий запрос, что помешает оптимизатору понять, что этот запрос соответствует индексу.
До PostgreSQL 8.4 предложение OPERATOR
могло включать указание RECHECK
. Теперь это не поддерживается, так как оператор индекса может быть «неточным» и это определяется на ходу в момент выполнения. Это позволяет эффективно справляться с ситуациями, когда оператор может быть или не быть неточным.
Примеры
Команда в следующем примере определяет класс операторов индекса 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
является расширением PostgreSQL. Команда CREATE OPERATOR CLASS
отсутствует в стандарте SQL.