CREATE OPERATOR CLASS#

CREATE OPERATOR CLASS

CREATE OPERATOR CLASS

CREATE OPERATOR CLASS — определить новый класс операторов

Синтаксис

CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type
  USING index_method [ FAMILY family_name ] AS
  {  OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ FOR SEARCH | FOR ORDER BY sort_family_name ]
   | FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name ( argument_type [, ...] )
   | STORAGE storage_type
  } [, ... ]

Описание

CREATE OPERATOR CLASS создает новый класс операторов. Класс операторов определяет, как определенный тип данных может быть использован с индексом. Класс операторов указывает, что определенные операторы будут выполнять определенные роли или стратегии для этого типа данных и этого метода индексирования. Класс операторов также указывает функции поддержки, которые будут использоваться методом индексирования, когда класс операторов выбран для столбца индекса. Все операторы и функции, используемые классом операторов, должны быть определены перед созданием класса операторов.

Если указано имя схемы, то класс операторов создается в указанной схеме. В противном случае он создается в текущей схеме. Два класса операторов в одной схеме могут иметь одно и то же имя только если они предназначены для разных методов индексирования.

Пользователь, который определяет класс операторов, становится его владельцем. В настоящее время создающий пользователь должен быть суперпользователем. (Это ограничение сделано, потому что неправильное определение класса операторов может вызвать путаницу или даже сбой сервера).

CREATE OPERATOR CLASS в настоящее время не проверяет, включает ли определение класса операторов все операторы и функции, необходимые для метода индекса, а также не проверяет, образуют ли операторы и функции самосогласованное множество. Пользователь несет ответственность за определение допустимого класса операторов.

Все связанные классы операторов могут быть сгруппированы в семейства операторов. Чтобы добавить новый класс операторов в существующее семейство, укажите опцию FAMILY в команде CREATE OPERATOR CLASS. Без этой опции новый класс будет помещен в семейство с тем же именем, что и новый класс (создавая это семейство, если оно еще не существует).

Ссылка на дополнительную информацию можно найти в Раздел 36.15.

Параметры

name

Имя создаваемого класса оператора. Имя может быть указано с указанием схемы.

DEFAULT

Если присутствует, класс операторов станет классом операторов по умолчанию для своего типа данных. Для конкретного типа данных и метода индексации может быть только один класс операторов по умолчанию.

data_type

Тип данных столбца, для которого предназначен этот класс операторов.

index_method

The name of the index method this operator class is for.

family_name

Имя существующей семьи операторов, к которой добавляется данная классификация операторов. Если не указано, используется семейство с тем же именем, что и классификация операторов (создается, если оно еще не существует).

strategy_number

Номер стратегии метода индекса для оператора, связанного с классом операторов.

operator_name

Имя (опционально с указанием схемы) оператора, связанного с классом операторов.

op_type

В предложении OPERATOR, тип(ы) данных операнда оператора, или NONE, чтобы указать префиксный оператор. Типы данных операнда могут быть не указаны в обычном случае, когда они совпадают с типом данных класса оператора.

В предложении FUNCTION указывается тип(ы) данных операнда, которые функция предполагает поддерживать, если они отличаются от типа(ов) входных данных функции (для функций сравнения B-дерева и хеш-функций) или типа данных класса (для функций поддержки сортировки B-дерева, функций равенства изображений B-дерева и всех функций в классах операторов GiST, SP-GiST, GIN и BRIN). По умолчанию эти значения верны, поэтому в предложениях FUNCTION не требуется указывать op_type, за исключением случая функции поддержки сортировки B-дерева, предназначенной для поддержки сравнений между разными типами данных.

sort_family_name

Имя (опционально с указанием схемы) существующей семьи операторов btree, которая описывает порядок сортировки, связанный с оператором сортировки.

Если не указаны ни теги FOR SEARCH, ни FOR ORDER BY, по умолчанию используется FOR SEARCH.

support_number

Номер опорной функции метода индекса для функции, связанной с классом операторов.

function_name

Имя (опционально с указанием схемы) функции, которая является функцией поддержки метода индекса для класса операторов.

argument_type

Тип(ы) данных параметра функции.

storage_type

Тип данных, фактически хранящийся в индексе. Обычно это совпадает с типом данных столбца, но некоторые методы индексации (в настоящее время GiST, GIN, SP-GiST и BRIN) позволяют использовать другой тип. Предложение STORAGE должна быть не указана, если метод индексации позволяет использовать другой тип. Если столбец data_type указан как anyarray, то storage_type может быть объявлен как anyelement, чтобы указать, что записи индекса являются элементами типа элемента, принадлежащего фактическому массиву, для которого создается конкретный индекс.

Предложения OPERATOR, FUNCTION и STORAGE могут появляться в любом порядке.

Примечания

Поскольку механизм индексов не проверяет права доступа к функциям перед их использованием, включение функции или оператора в класс операторов равносильно предоставлению публичного разрешения на ее выполнение. Это обычно не является проблемой для типов функций, которые полезны в классе операторов.

Операторы не должны быть определены с помощью SQL-функций. SQL-функция, скорее всего, будет встроена в вызывающий запрос, что предотвратит оптимизатор от распознавания соответствия запроса индексу.

Перед Tantor SE8.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 - это расширение Tantor SE. В стандарте SQL нет оператора CREATE OPERATOR CLASS.