38.14. Пользовательские операторы #
Любой оператор представляет собой «синтаксический сахар» для вызова нижележащей функции, выполняющей реальную работу; поэтому прежде чем вы сможете создать оператор, необходимо создать нижележащую функцию. Однако оператор — не исключительно синтаксический сахар, так как он несёт и дополнительную информацию, помогающую планировщику запросов оптимизировать запросы с этим оператором. Рассмотрению этой дополнительной информации будет посвящён следующий раздел.
Postgres Pro поддерживает префиксные и инфиксные операторы. Операторы могут быть перегружены; то есть одно имя оператора могут иметь различные операторы с разным количеством и типами операндов. Когда выполняется запрос, система определяет, какой оператор вызвать, по количеству и типам предоставленных операндов.
В следующем примере создаётся оператор сложения двух комплексных чисел. Предполагается, что мы уже создали определение типа complex
(см. Раздел 38.13). Сначала нам нужна функция, собственно выполняющая операцию, а затем мы сможем определить оператор:
CREATE FUNCTION complex_add(complex, complex)
RETURNS complex
AS 'имя_файла
', 'complex_add'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR + (
leftarg = complex,
rightarg = complex,
function = complex_add,
commutator = +
);
Теперь мы можем выполнить такой запрос:
SELECT (a + b) AS c FROM test_complex; c ----------------- (5.2,6.05) (133.42,144.95)
Мы продемонстрировали создание бинарного оператора. Чтобы создать префиксный оператор, просто опустите leftarg
. Обязательными в CREATE OPERATOR
являются только предложение function
и объявления аргументов. Предложение commutator
, добавленное в данном примере, представляет необязательную подсказку для оптимизатора запросов. Подробнее о commutator
и других подсказках для оптимизатора рассказывается в следующем разделе.