38.14. Пользовательские операторы
Любой оператор представляет собой «синтаксический сахар» для вызова нижележащей функции, выполняющей реальную работу; поэтому прежде чем вы сможете создать оператор, необходимо создать нижележащую функцию. Однако оператор — не исключительно синтаксический сахар, так как он несёт и дополнительную информацию, помогающую планировщику запросов оптимизировать запросы с этим оператором. Рассмотрению этой дополнительной информации будет посвящён следующий раздел.
PostgreSQL поддерживает префиксные и инфиксные операторы. Операторы могут быть перегружены; то есть одно имя оператора могут иметь различные операторы с разным количеством и типами операндов. Когда выполняется запрос, система определяет, какой оператор вызвать, по количеству и типам предоставленных операндов.
В следующем примере создаётся оператор сложения двух комплексных чисел. Предполагается, что мы уже создали определение типа 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
и других подсказках для оптимизатора рассказывается в следующем разделе.