Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Зеркалирование
Управление ресурсами
Безопасность
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Определяет новый оператор.
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 определяет новый оператор. Пользователь, определивший оператор, становится его владельцем. Если указано имя схемы, то оператор создаётся в указанной схеме. В противном случае он создаётся в текущей схеме.
Имя оператора — это последовательность до NAMEDATALEN-1 (по умолчанию 63) символов из следующего списка: + - * / < > = ~ ! @ # % ^ & | ` ? .
Существуют некоторые ограничения на выбор имени:
-- и /* не могут встречаться в имени оператора, поскольку будут восприниматься как начало комментария.
Многосимвольное имя оператора не может заканчиваться на + или -, если только оно также не содержит хотя бы один из следующих символов: ~ ! @ # % ^ & | ` ?
Например, @- — допустимое имя оператора, а *- — нет. Это ограничение позволяет базе данных разбирать SQL-совместимые команды без необходимости указывать пробелы между токенами.
Использование => в качестве имени оператора устарело. В будущих версиях оно может быть полностью запрещено.
Оператор != при вводе преобразуется в <>, поэтому эти два имени всегда эквивалентны.
Должен быть определён хотя бы один из параметров LEFTARG и RIGHTARG. Для бинарных операторов должны быть определены оба. Для правых унарных операторов следует определить только LEFTARG, а для левых унарных — только RIGHTARG.
Примечание: правые унарные, также называемые постфиксными, операторы устарели и могут быть удалены в будущих версиях базы данных.
Функция function_name должна быть предварительно определена с помощью CREATE FUNCTION, должна быть IMMUTABLE и принимать нужное количество аргументов (один или два) указанных типов.
В синтаксисе CREATE OPERATOR ключевые слова FUNCTION и PROCEDURE являются эквивалентными, однако ссылаться необходимо на функцию, а не на процедуру. Использование ключевого слова PROCEDURE является историческим и устаревшим.
Другие предложения задают необязательные оптимизационные параметры оператора. Их значение подробно описано в документации PostgreSQL по оптимизации операторов.
Чтобы иметь возможность создать оператор, вы должны обладать привилегией USAGE на типы аргументов и возвращаемый тип, а также привилегией EXECUTE на базовую функцию. Если указаны коммутатор или негатор, вы должны владеть этими операторами.
Чтобы указать квалифицированное именем схемы имя оператора в com_op или других необязательных аргументах, используйте синтаксис OPERATOR(), например:
COMMUTATOR = OPERATOR(myschema.===) ,
Дополнительную информацию см. в разделе «Пользовательские операторы» документации PostgreSQL.
Все функции, используемые для реализации оператора, должны быть определены как IMMUTABLE.
Невозможно указать приоритет лексического анализа оператора в CREATE OPERATOR, поскольку поведение парсера по приоритетам жёстко задано. Подробности о приоритетах см. в разделе «Приоритет операторов» документации PostgreSQL.
Используйте DROP OPERATOR для удаления пользовательских операторов из базы данных. Используйте ALTER OPERATOR для изменения операторов в базе данных.
Следующая команда определяет новый оператор area-equality для типа данных box:
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
FUNCTION = area_equal_function,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_function,
JOIN = area_join_function,
HASHES, MERGES
);
Следующий пример создаёт оператор для сложения двух комплексных чисел. В примере предполагается, что мы уже создали определение типа complex. Сначала определяется функция, выполняющая работу, затем определяется оператор:
CREATE FUNCTION complex_add(complex, complex)
RETURNS complex
AS 'filename', 'complex_add'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR + (
leftarg = complex,
rightarg = complex,
procedure = complex_add,
commutator = +
);
Использование этого оператора в запросе:
SELECT (a + b) AS c FROM test_complex;
CREATE OPERATOR является расширением Database относительно стандарта SQL. Стандарт SQL не предусматривает определение пользовательских операторов.
CREATE FUNCTION, CREATE TYPE, ALTER OPERATOR, CREATE OPERATOR CLASS, DROP OPERATOR