Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Определяет новый класс операторов.
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
Поскольку механизм индексов не проверяет права доступа к функциям перед их использованием, включение функции или оператора в класс операторов эквивалентно предоставлению общедоступного права 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