36.13. Пользовательские операторы#

36.13. Пользовательские операторы

36.13. Пользовательские операторы

Каждый оператор - это синтаксический сахар для вызова базовой функции, которая выполняет реальную работу; поэтому вы должны сначала создать базовую функцию, прежде чем создавать оператор. Однако оператор - это не просто синтаксический сахар, потому что он содержит дополнительную информацию, которая помогает планировщику запросов оптимизировать запросы, использующие оператор. Следующий раздел будет посвящен объяснению этой дополнительной информации.

Tantor SE поддерживает префиксные и инфиксные операторы. Операторы могут быть перегружены; то есть, одно и то же имя оператора может использоваться для разных операторов, которые имеют разное количество и типы операндов. При выполнении запроса система определяет оператор для вызова на основе количества и типов предоставленных операндов.

Вот пример создания оператора для сложения двух комплексных чисел. Мы предполагаем, что мы уже создали определение типа complex (см. Раздел 36.12). Сначала нам понадобится функция, которая выполняет работу, затем мы можем определить оператор:

CREATE FUNCTION complex_add(complex, complex)
    RETURNS complex
    AS 'filename', '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. Предложение function и предложения аргументов - единственные обязательные элементы в CREATE OPERATOR. Предложение commutator показанная в примере, является необязательной подсказкой для оптимизатора запросов. Дополнительные сведения о commutator и других подсказках оптимизатора приведены в следующем разделе.