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
. Без этого параметра новый класс помещается в семейство, имеющее то же имя, что и класс (если такое семейство не существует, оно создаётся).
За дополнительными сведениями обратитесь к Разделу 38.16.
Параметры
имя
Имя создаваемого класса операторов, возможно, дополненное схемой.
DEFAULT
Если присутствует это указание, класс операторов становится классом по умолчанию для своего типа данных. Для определённого типа данных и метода индекса можно определить не больше одного класса операторов по умолчанию.
тип_данных
Тип данных столбца, для которого предназначен этот класс операторов.
индексный_метод
Имя индексного метода, для которого предназначен этот класс операторов.
имя_семейства
Имя существующего семейства операторов, в которое будет добавлен этот класс. Если не указано, подразумевается семейство с тем же именем, что и класс (если такое семейство не существует, оно создаётся).
номер_стратегии
Номер стратегии индексного метода для оператора, связанного с данным классом операторов.
имя_оператора
Имя (возможно, дополненное схемой) оператора, связанного с данным классом операторов.
тип_операнда
В предложении
OPERATOR
это тип данных операнда, либо ключевое словоNONE
, характеризующее префиксный оператор. Типы операндов обычно можно опустить, когда они совпадают с типом данных класса операторов.В предложении
FUNCTION
это тип данных операнда, который должна поддерживать эта функция, если он отличается от входного типа данных функции (для функций сравнения в B-деревьях и хеш-функций) или от типа данных класса (для опорных функций сортировки и функций равенства образов в B-деревьях, а также для всех функций в классах операторов GiST, SP-GiST, GIN и BRIN). Обычно предполагаемые по умолчанию типы оказываются подходящими, так чтотип_операнда
указывать вFUNCTION
не нужно (если это не функции сортировки в B-дереве, которые предназначены для сравнения разных типов данных).семейство_сортировки
Имя (возможно, дополненное схемой) существующего семейства операторов
btree
, описывающего порядок сортировки, связанный с оператором сортировки.Если не указано ни
FOR SEARCH
(для поиска), ниFOR ORDER BY
(для сортировки), подразумеваетсяFOR SEARCH
.номер_опорной_функции
Номер опорной функции индексного метода для функции, связанной с данным классом операторов.
имя_функции
Имя (возможно, дополненное схемой) функции, которая является опорной функцией индексного метода для данного класса операторов.
тип_аргумента
Тип данных параметра функции.
тип_хранения
Тип данных, фактически сохраняемых в индексе. Обычно это тип данных столбца, но некоторые методы индекса (в настоящее время, GiST, GIN, SP-GiST и 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.
CREATE OPERATOR FAMILY
CREATE OPERATOR FAMILY — define a new operator family
Synopsis
CREATE OPERATOR FAMILYname
USINGindex_method
Description
CREATE OPERATOR FAMILY
creates a new operator family. An operator family defines a collection of related operator classes, and perhaps some additional operators and support functions that are compatible with these operator classes but not essential for the functioning of any individual index. (Operators and functions that are essential to indexes should be grouped within the relevant operator class, rather than being “loose” in the operator family. Typically, single-data-type operators are bound to operator classes, while cross-data-type operators can be loose in an operator family containing operator classes for both data types.)
The new operator family is initially empty. It should be populated by issuing subsequent CREATE OPERATOR CLASS
commands to add contained operator classes, and optionally ALTER OPERATOR FAMILY
commands to add “loose” operators and their corresponding support functions.
If a schema name is given then the operator family is created in the specified schema. Otherwise it is created in the current schema. Two operator families in the same schema can have the same name only if they are for different index methods.
The user who defines an operator family becomes its owner. Presently, the creating user must be a superuser. (This restriction is made because an erroneous operator family definition could confuse or even crash the server.)
Refer to Section 36.16 for further information.
Parameters
name
The name of the operator family to be created. The name can be schema-qualified.
index_method
The name of the index method this operator family is for.
Compatibility
CREATE OPERATOR FAMILY
is a Postgres Pro extension. There is no CREATE OPERATOR FAMILY
statement in the SQL standard.