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.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 является расширением Postgres Pro. Команда CREATE OPERATOR CLASS отсутствует в стандарте SQL.
CREATE OPERATOR CLASS
CREATE OPERATOR CLASS — define a new operator class
Synopsis
CREATE OPERATOR CLASSname[ DEFAULT ] FOR TYPEdata_typeUSINGindex_method[ FAMILYfamily_name] AS { OPERATORstrategy_numberoperator_name[ (op_type,op_type) ] [ FOR SEARCH | FOR ORDER BYsort_family_name] | FUNCTIONsupport_number[ (op_type[ ,op_type] ) ]function_name(argument_type[, ...] ) | STORAGEstorage_type} [, ... ]
Description
CREATE OPERATOR CLASS creates a new operator class. An operator class defines how a particular data type can be used with an index. The operator class specifies that certain operators will fill particular roles or “strategies” for this data type and this index method. The operator class also specifies the support functions to be used by the index method when the operator class is selected for an index column. All the operators and functions used by an operator class must be defined before the operator class can be created.
If a schema name is given then the operator class is created in the specified schema. Otherwise it is created in the current schema. Two operator classes in the same schema can have the same name only if they are for different index methods.
The user who defines an operator class becomes its owner. Presently, the creating user must be a superuser. (This restriction is made because an erroneous operator class definition could confuse or even crash the server.)
CREATE OPERATOR CLASS does not presently check whether the operator class definition includes all the operators and functions required by the index method, nor whether the operators and functions form a self-consistent set. It is the user's responsibility to define a valid operator class.
Related operator classes can be grouped into operator families. To add a new operator class to an existing family, specify the FAMILY option in CREATE OPERATOR CLASS. Without this option, the new class is placed into a family named the same as the new class (creating that family if it doesn't already exist).
Refer to Section 37.16 for further information.
Parameters
nameThe name of the operator class to be created. The name can be schema-qualified.
DEFAULTIf present, the operator class will become the default operator class for its data type. At most one operator class can be the default for a specific data type and index method.
data_typeThe column data type that this operator class is for.
index_methodThe name of the index method this operator class is for.
family_nameThe name of the existing operator family to add this operator class to. If not specified, a family named the same as the operator class is used (creating it, if it doesn't already exist).
strategy_numberThe index method's strategy number for an operator associated with the operator class.
operator_nameThe name (optionally schema-qualified) of an operator associated with the operator class.
op_typeIn an
OPERATORclause, the operand data type(s) of the operator, orNONEto signify a prefix operator. The operand data types can be omitted in the normal case where they are the same as the operator class's data type.In a
FUNCTIONclause, the operand data type(s) the function is intended to support, if different from the input data type(s) of the function (for B-tree comparison functions and hash functions) or the class's data type (for B-tree sort support functions, B-tree equal image functions, and all functions in GiST, SP-GiST, GIN and BRIN operator classes). These defaults are correct, and soop_typeneed not be specified inFUNCTIONclauses, except for the case of a B-tree sort support function that is meant to support cross-data-type comparisons.sort_family_nameThe name (optionally schema-qualified) of an existing
btreeoperator family that describes the sort ordering associated with an ordering operator.If neither
FOR SEARCHnorFOR ORDER BYis specified,FOR SEARCHis the default.support_numberThe index method's support function number for a function associated with the operator class.
function_nameThe name (optionally schema-qualified) of a function that is an index method support function for the operator class.
argument_typeThe parameter data type(s) of the function.
storage_typeThe data type actually stored in the index. Normally this is the same as the column data type, but some index methods (currently GiST, GIN, SP-GiST and BRIN) allow it to be different. The
STORAGEclause must be omitted unless the index method allows a different type to be used. If the columndata_typeis specified asanyarray, thestorage_typecan be declared asanyelementto indicate that the index entries are members of the element type belonging to the actual array type that each particular index is created for.
The OPERATOR, FUNCTION, and STORAGE clauses can appear in any order.
Notes
Because the index machinery does not check access permissions on functions before using them, including a function or operator in an operator class is tantamount to granting public execute permission on it. This is usually not an issue for the sorts of functions that are useful in an operator class.
The operators should not be defined by SQL functions. An SQL function is likely to be inlined into the calling query, which will prevent the optimizer from recognizing that the query matches an index.
Before PostgreSQL 8.4, the OPERATOR clause could include a RECHECK option. This is no longer supported because whether an index operator is “lossy” is now determined on-the-fly at run time. This allows efficient handling of cases where an operator might or might not be lossy.
Examples
The following example command defines a GiST index operator class for the data type _int4 (array of int4). See the intarray module for the complete example.
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);
Compatibility
CREATE OPERATOR CLASS is a Postgres Pro extension. There is no CREATE OPERATOR CLASS statement in the SQL standard.