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

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

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

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

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

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

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

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

6.1.70. CREATE OPERATOR

6.1.70. CREATE OPERATOR

CREATE OPERATOR — создание нового оператора

Синтаксис

CREATE OPERATOR name (
    {FUNCTION|PROCEDURE} = function_name
    [, LEFTARG = left_type ] [, RIGHTARG = right_type ]
    [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
    [, RESTRICT = res_proc ] [, JOIN = join_proc ]
    [, HASHES ] [, MERGES ]
)

Описание

Команда CREATE OPERATOR определяет новый оператор name. Пользователь, определяющий оператор, становится его владельцем. Если указано имя схемы, то оператор создаётся в указанной схеме. В противном случае он создаётся в текущей схеме.

Имя оператора — это последовательность длиной до NAMEDATALEN-1 (по умолчанию 63) символов из следующего списка:


+ - * / < > = ~ ! @ # % ^ & | ` ?

Существует несколько ограничений на выбор имени:

  • Комбинации -- и /* не могут появляться нигде в имени оператора, поскольку они будут восприняты как начало комментария.

  • Имя оператора, состоящее из нескольких символов, не может заканчиваться на + или -, если только это имя также не содержит хотя бы один из этих символов:


    ~ ! @ # % ^ & | ` ?

    Например, @- — допустимое имя оператора, а *- — нет. Это ограничение позволяет Digital Q.DataBase разбирать команды, соответствующие SQL, без необходимости пробелов между токенами.

  • Символ => зарезервирован грамматикой SQL, поэтому его нельзя использовать в качестве имени оператора.

Оператор != преобразуется в <> при вводе, поэтому эти два имени всегда эквивалентны.

Для бинарных операторов должны быть определены и LEFTARG, и RIGHTARG. Для префиксных операторов должен быть определён только RIGHTARG. Функция function_name должна быть предварительно определена с помощью команды CREATE FUNCTION и должна быть определена для принятия правильного количества аргументов (одного или двух) указанных типов.

В синтаксисе CREATE OPERATOR ключевые слова FUNCTION и PROCEDURE эквивалентны, но ссылаться в любом случае должна на функцию, а не на процедуру. Использование ключевого слова PROCEDURE здесь является историческим и устаревшим.

Другие предложения задают необязательные атрибуты оптимизации оператора. Их значение подробно описано в разделе Раздел 5.1.15.

Чтобы иметь возможность создать оператор, вы должны иметь привилегию USAGE на типы аргументов и возвращаемый тип, а также привилегию EXECUTE на лежащую в основе функцию. Если указан коммутирующий или отрицающий оператор, вы должны владеть этими операторами.

Параметры

name

Имя определяемого оператора. Допустимые символы см. выше. Имя может быть квалифицировано схемой, например, CREATE OPERATOR myschema.+ (...). Если нет, то оператор создаётся в текущей схеме. Два оператора в одной схеме могут иметь одинаковое имя, если они работают с разными типами данных. Это называется перегрузкой.

function_name

Функция, используемая для реализации этого оператора.

left_type

Тип данных левого операнда оператора, если таковой имеется. Этот параметр следует опускать для префиксного оператора.

right_type

Тип данных правого операнда оператора.

com_op

Коммутирующий оператор для этого оператора.

neg_op

Отрицающий оператор для этого оператора.

res_proc

Функция оценки селективности ограничений для этого оператора.

join_proc

Функция оценки селективности соединений для этого оператора.

HASHES

Указывает, что этот оператор может поддерживать хэш-соединение.

MERGES

Указывает, что этот оператор может поддерживать соединение слиянием.

Чтобы указать имя оператора с указанием схемы в аргументах com_op или других необязательных аргументах, используйте синтаксис OPERATOR(), например:

COMMUTATOR = OPERATOR(myschema.===) ,

Примечания

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

При определении самокоммутирующего оператора вы просто его определяете. При определении пары коммутирующих операторов всё немного сложнее: как первому оператору, который определяется, ссылаться на другой, который вы ещё не определили? Существует три решения этой проблемы:

  • Один из способов — опустить предложение COMMUTATOR в первом операторе, который вы определяете, а затем указать его в определении второго оператора. Поскольку Digital Q.DataBase знает, что коммутирующие операторы существуют парами, когда он видит второе определение, он автоматически вернётся и заполнит отсутствующее предложение COMMUTATOR в первом определении.

  • Другой, более прямой способ — просто включить предложения COMMUTATOR в оба определения. Когда Digital Q.DataBase обрабатывает первое определение и понимает, что COMMUTATOR ссылается на несуществующий оператор, система создаст в системном каталоге фиктивную запись для этого оператора. Эта фиктивная запись будет содержать действительные данные только для имени оператора, типов левого и правого операндов и владельца, поскольку это всё, что Digital Q.DataBase может вывести на данный момент. Запись каталога первого оператора будет ссылаться на эту фиктивную запись. Позже, когда вы определите второй оператор, система обновит фиктивную запись дополнительной информацией из второго определения. Если вы попытаетесь использовать фиктивный оператор до того, как он будет заполнен, вы просто получите сообщение об ошибке.

  • Альтернативно, оба оператора могут быть определены без предложений COMMUTATOR, а затем командой ALTER OPERATOR можно установить их связи коммутации. Достаточно выполнить ALTER для любого из пары операторов.

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

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

Невозможно указать лексический приоритет оператора в команде CREATE OPERATOR, поскольку поведение парсера в отношении приоритета жёстко зашито. Подробности о приоритетах см. в разделе Раздел 2.1.1.6.

Устаревшие параметры SORT1, SORT2, LTCMP и GTCMP ранее использовались для указания имён операторов сортировки, связанных с оператором, поддерживающим соединение слиянием. В этом больше нет необходимости, поскольку информация о связанных операторах теперь находится путём просмотра семейств операторов B-дерева. Если один из этих параметров задан, он игнорируется, за исключением неявной установки MERGES в true.

Используйте DROP OPERATOR для удаления пользовательских операторов из базы данных. Используйте ALTER OPERATOR для изменения операторов в базе данных.

Примеры

Следующая команда определяет новый оператор равенства площадей для типа данных box:

CREATE OPERATOR === (
    LEFTARG = box,
    RIGHTARG = box,
    FUNCTION = area_equal_function,
    COMMUTATOR = ===,
    NEGATOR = !==,
    RESTRICT = area_restriction_function,
    JOIN = area_join_function,
    HASHES, MERGES
);

Совместимость

CREATE OPERATOR является расширением Digital Q.DataBase. В стандарте SQL нет положений для пользовательских операторов.

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

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