Самоучитель по SQL-сервер в Linux



CREATE OPERATOR

Определение нового оператора в базе данных.

Синтаксис

CREATE OPERATOR оператор ( PROCEDURE = функция

[, LEFTARG = тип1 ]

[, RIGHTARG = тип2 ]

[, COMMUTATOR = коммутатор ]

[, NEGATOR = инвертор ]

[, RESTRICT = функция_ограничения ]

[, JOIN = функция_объединения ]

[, HASHES ]

[, SORT1 = левая_сортировка ]

[. SORT2 = правая_сортировка ] )

Параметры

  • оператор. Последовательность символов — идентификатор нового оператора. Список допустимых символов приведен ниже.
  • функция. Функция, реализующая новый оператор.
  • тип1. Тип левого аргумента. Не используется с унарными операторами, которые всегда располагаются слева от своего операнда.
  • тип2. Тип правого аргумента. Не используется с унарными операторами, которые всегда располагаются справа от своего операнда.
  • коммутатор. Оператор коммутации, связываемый с новым оператором. Коммутатором называется другой существующий оператор, который выполняет коммутацию в процедуре, определяемой для нового оператора (например, интерпретацию левого аргумента как правого или наоборот).
  • инвертор. Оператор отрицания, связываемый с новым оператором. Инвертором называется другой существующий оператор, который выполняет логическую инверсию нового оператора. Инвертор определяется только в том случае, если результат применения ключевого слова NOT к новому оператору остается постоянным при одинаковых исходных данных.
  • фупкция_ограничения. Имя оценочной функции размера. Функция должна существовать и возвращать вещественное значение, а тип данных ее аргументов должен соответствовать определению оператора.
  • функция_одьединепия. Имя оценочной функции объединения. Функция должна существовать и возвращать вещественное значение, а тип данных ее аргументов должен соответствовать определению оператора.
  • HASHES. Ключевое слово HASHES означает, что новый оператор поддерживает хэ-ширующие объединения.
  • левая_сортировка. Оператор левосторонней сортировки (если новый оператор поддерживает слияние).
  • правая_сортировка. Оператор правосторонней сортировки (если новый оператор поддерживает слияние).

Результаты

CREATE. Это сообщение выдается при успешном создании нового оператора.

Описание

Команда CREATE OPERATOR предназначена для определения новых операторов. Пользователь PostgreSQL, создавший оператор, становится владельцем этого оператора в случае успешного создания.

Оператор может содержать до 31 символа из следующего списка:

+ - * / < > = ~ ! (а # % - & | - ? $

Кроме того, для символов оператора устанавливается ряд дополнительных ограничений:

  • знак доллара ($) может использоваться только в том случае, если оператор состоит из нескольких символов (оператор $ не разрешен);
  • комбинации - - и /* не могут присутствовать в операторе, поскольку они интерпретируются как начало комментария;
  • операторы, состоящие из нескольких символов, могут оканчиваться знаком + (плюс) или - (дефис) только в том случае, если содержат по крайней мере один из следующих символов:

- ! @ # % Л & | ? ? $

Благодаря наличию этих ограничений PostgreSQL может обрабатывать синтаксически правильные запросы, в которых лексемы не нужно разделять дополнительными пробелами.

При создании оператора обязательно должен быть задан по крайней мере один из параметров LEFTARG и RIGHTARG (поскольку при вызове оператора передается хотя бы один аргумент). Если определяется бинарный оператор (с левым и правым операндами), должны быть заданы оба параметра, LEFTARG и RIGHTARG. При определении правого унарного оператора задается только параметр LEFTARG, а при определении левого унарного оператора — только параметр RIGHTARG.

ПРИМЕЧАНИЕ

Количество аргументов функции, указываемой в параметре PROCEDURE, должно соответствовать количеству операндов у создаваемого оператора.

Чтобы оптимизатор запросов правильно изменял порядок следования операндов, он должен знать, какой оператор следует использовать для коммутации. Для некоторых операторов коммутатор должен существовать (или по крайней мере, это было бы вполне логично). Например, коммутатором оператора > является оператор <, и взаимосвязь этих операторов логически оправдана. При наличии таких данных порядок следования операндов легко изменить и превратить конструкцию х<у в у>х, если оптимизатор запросов сочтет новый вариант более эффективным.

В процессе оптимизации запросов может использоваться не только коммутатор, но и инвертор. Так, для оператора = инвертором является оператор !=. Наличие инвертора позволяет оптимизатору запросов упрощать команды вида

booktown=# SELECT * FROM employees WHERE NOT name = 'John';

В упрощенном виде эта команда выглядит так:

booktown=# SELECT * FROM employees WHERE name != 'John';

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

Параметр HASHES сообщает оптимизатору запросов, что оператор поддерживает алгоритм хэширующего объединения (используемый только в том случае, если оператор представляет проверку равенства, при которой равенство подразумевает совпадение двоичных представлений). Еще два параметра, SORT1 и SORT2, сообщают оптимизатору о том, что соответственно левые и правые операторы поддерживают сортировку слиянием. Операторы сортировки задаются только для оператора равенства и представляются знаками < и > для левого и правого типа данных соответственно.

Параметры RESTRICT и JOIN определяют функции, при помощи которых оптимизатор запросов предварительно оценивает размер итоговых наборов. При определенных условиях PostgreSQL требуется определить количество результатов, получаемых в результате выполнения запроса; в таких случаях оптимизатор запросов вызывает функцию функция_ограничения с аргументами, переданными оператору; возвращаемое значение и является предварительной оценкой. Функция ограничения должна быть заранее определена командой CREATE FUNCTION с правильной сигнатурой.

Функция, заданная параметром JOIN, предназначена для оценки размеров объединения в том случае, если операнды не являются постоянными величинами. Вещественное число, возвращаемое функцией, определяет примерный объем результата.

Пример

В следующем фрагменте определяется логический оператор, который выясняет, равен ли нулю хотя бы один из двух операндов типа Integer. Проверка осуществляется функцией 1 s_zero (определение этой функции и дополнительная информация приведены в главе 7).

booktown=# CREATE OPERATOR !# (PROCEDURE = is_zero,

booktown(# LEFTARG = integer,

booktown(# RIGHTARG = integer);

CREATE




Книжный магазин