×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

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

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

6.1.71. CREATE OPERATOR CLASS

6.1.71. 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. Без этого параметра новый класс помещается в семейство с тем же именем, что и новый класс (создавая это семейство, если оно ещё не существует).

Дополнительную информацию см. в разделе Раздел 5.1.16.

Параметры

name

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

DEFAULT

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

data_type

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

index_method

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

family_name

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

strategy_number

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

operator_name

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

op_type

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

В предложении FUNCTION — тип(ы) данных операнда, для поддержки которых предназначена функция, если они отличаются от входного типа(ов) данных функции (для функций сравнения B-дерева и хэш-функций) или от типа данных класса (для функций поддержки сортировки B-дерева, функций equal image B-дерева и всех функций в классах операторов GiST, SP-GiST, GIN и BRIN). Эти значения по умолчанию верны, поэтому op_type не нужно указывать в предложениях FUNCTION, за исключением случая функции поддержки сортировки 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-функция, скорее всего, будет встроена в вызывающий запрос, что помешает оптимизатору распознать, что запрос соответствует индексу.

До Digital Q.DataBase 8.4 предложение OPERATOR могло включать параметр RECHECK. Это больше не поддерживается, потому что сейчас «потерянность» («lossy») оператора индекса определяется на лету во время выполнения. Это позволяет эффективно обрабатывать случаи, когда оператор может быть или не быть потерянным.

Примеры

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

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению