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 создаёт новый класс операторов. Класс операторов определяет, как конкретный тип данных может использоваться с индексом. Класс операторов указывает, что определённые операторы будут выполнять определённые роли или стратегии для данного типа данных и метода индекса. Класс операторов также определяет вспомогательные функции, которые будут использоваться методом индекса при выборе этого класса операторов для столбца индекса. Все операторы и функции, используемые классом операторов, должны быть определены до создания самого класса. Все функции, используемые для реализации класса операторов, должны быть определены как IMMUTABLE.

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

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

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

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

Дополнительную информацию см. в разделе «Интерфейс расширений с индексами» документации PostgreSQL.

Параметры

  • name

    • Имя (возможно, с указанием схемы) создаваемого класса операторов. Два класса операторов в одной схеме могут иметь одинаковые имена только при условии, что они предназначены для разных методов индексов.
  • DEFAULT

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

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

    • Имя метода индекса, для которого предназначен данный класс операторов.
  • family_name

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

    • Номер стратегии метода индекса для оператора, связанного с классом операторов. Операторы, связанные с классом операторов, идентифицируются номерами стратегий, которые определяют семантику каждого оператора в контексте данного класса.
  • operator_name

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

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

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

  • sort_family_name

    • Имя (возможно, с указанием схемы) существующего семейства операторов btree, описывающего порядок сортировки, связанного с оператором упорядочивания.

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

  • support_number

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

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

    • Тип(ы) параметров функции.
  • storage_type

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

Замечания

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

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

Любые функции, используемые для реализации класса операторов, должны быть определены как IMMUTABLE.

До Database 6.0 в предложении OPERATOR мог быть указан параметр RECHECK. Эта возможность больше не поддерживается. Теперь Database определяет, является ли оператор индекса «потеряющим», динамически во время выполнения. Это позволяет более эффективно обрабатывать случаи, когда оператор может быть или не быть потерянным.

Примеры

Следующая примерная команда определяет класс операторов 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 является расширением Database. В стандарте SQL нет оператора CREATE OPERATOR CLASS.

Смотрите также

ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY, CREATE FUNCTION