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> <funcname> (<argument_type> [, ...] )
| STORAGE <storage_type>
} [, ... ]
Описание
Команда CREATE OPERATOR CLASS создает новый класс операторов.
Класс операторов определяет, как конкретный тип данных может использоваться с индексом.
Класс операторов указывает, какие операторы будут выполнять определенные роли или стратегии для этого типа данных и этого метода индексирования.
Класс операторов также задает вспомогательные процедуры, которые будут использоваться методом индексирования, когда класс операторов выбран для столбца индекса.
Все операторы и функции, используемые классом операторов, должны быть определены до создания класса операторов.
Все функции, используемые для реализации класса операторов, должны быть определены как IMMUTABLE.
В настоящее время CREATE OPERATOR CLASS не проверяет, включает ли определение класса операторов все операторы и функции, требуемые методом индексирования, и образуют ли операторы и функции самосогласованный набор.
Определение корректного класса операторов является ответственностью пользователя.
Для создания класса операторов необходимо быть суперпользователем.
Параметры
| Параметр | Описание |
|---|---|
name |
Имя создаваемого класса операторов (опционально указанное со схемой). Два класса операторов в одной и той же схеме могут иметь одинаковое имя только в том случае, если они относятся к разным методам индексирования |
DEFAULT |
Делает класс операторов классом операторов по умолчанию для его типа данных. Для конкретного типа данных и метода индекса по умолчанию может быть не более одного класса операторов |
data_type |
Тип данных столбца, для которого предназначен этот класс операторов |
index_method |
Имя метода индексирования, для которого предназначен этот класс операторов.
Возможные значения: |
family_name |
Имя существующего семейства операторов, в которое следует добавить этот класс операторов. Если не указано, используется семейство с именем, совпадающим с именем класса операторов (при необходимости оно будет создано, если еще не существует) |
strategy_number |
Операторы, связанные с классом операторов, идентифицируются номерами стратегий, которые служат для определения семантики каждого оператора в контексте его класса операторов. Например, B-деревья накладывают строгий порядок на ключи (от меньшего к большему), поэтому операторы вроде "меньше" и "больше или равно" имеют значение при работе с B-деревом. Эти стратегии можно рассматривать как обобщенные операторы. Каждый класс операторов задает, какой фактический оператор соответствует каждой стратегии для конкретного типа данных и интерпретации семантики индекса. Соответствующие номера стратегий для каждого метода индексирования приведены ниже:
|
sort_family_name |
Имя существующего семейства операторов |
operator_name |
Имя оператора, связанного с классом операторов (опционально указанное со схемой) |
op_type |
В выражении |
support_number |
Методам индексирования для работы требуются дополнительные вспомогательные подпрограммы. Это административные операции, используемые внутри методов индексирования. Как и в случае стратегий, класс операторов определяет, какие конкретные функции должны играть каждую из этих ролей для заданного типа данных и семантической интерпретации. Метод индексирования определяет набор нужных ему функций, а класс операторов указывает правильные функции, назначая им номера вспомогательных функций следующим образом:
|
funcname |
Имя функции (опционально указанное со схемой), которая является вспомогательной процедурой метода индексирования для класса операторов |
argument_types |
Типы данных параметров функции |
storage_type |
Тип данных, фактически хранимый в индексе.
Обычно он совпадает с типом данных столбца, но некоторые методы индексирования (в настоящее время — GiST и GIN) допускают иной тип.
Секцию |
Примечания
Поскольку механизм индексов не проверяет права доступа к функциям перед их использованием, включение функции или оператора в класс операторов равносильно предоставлению всем прав на выполнение (EXECUTE) для них.
Обычно это не представляет проблемы для тех видов функций, которые обычно используются в классах операторов.
Операторы не должны быть определены посредством SQL-функций. SQL-функция, скорее всего, будет встроена в вызывающий запрос, что помешает оптимизатору распознать, что запрос соответствует индексу.
Все функции, используемые для реализации класса операторов, должны быть определены как IMMUTABLE.
Greengage DB определяет, является ли оператор индекса "lossy" (с потерями), на лету во время выполнения. Это позволяет более эффективно обрабатывать случаи, когда оператор может быть или не быть "lossy".
Примеры
Следующая команда определяет класс операторов индекса GiST для типа данных _int4 (массив int4).
Полный пример см. в contrib-модуле 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, int, 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 является расширением Greengage DB.
В стандарте SQL нет оператора CREATE OPERATOR CLASS.