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 и 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.