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. Без этого параметра новый класс помещается в семейство, имеющее то же имя, что и класс (если такое семейство не существует, оно создаётся).
За дополнительными сведениями обратитесь к Разделу 36.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-функция вероятнее всего будет встроена в вызывающий запрос, что помешает оптимизатору понять, что этот запрос соответствует индексу.
Примеры
Команда в следующем примере определяет класс операторов индекса 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.