CREATE OPERATOR
При создании оператора обязательно должен быть задан по крайней мере один из параметров 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. Проверка осуществляется функцией is_zero (определение этой функции и дополнительная информация приведены в главе 7).
booktown=# CREATE OPERATOR!# (PROCEDURE = is_zero, booktown(# LEFTARG = integer, booktown(# RIGHTARG = integer); CREATE