Каждый оператор является «синтаксическим сахаром» для вызова базовой функции, которая выполняет реальную работу; поэтому вы должны сначала создать базовую функцию, прежде чем сможете создать оператор. Однако оператор не является просто синтаксическим сахаром, потому что он несёт дополнительную информацию, которая помогает планировщику запросов оптимизировать запросы, использующие этот оператор. Следующий раздел будет посвящён объяснению этой дополнительной информации.
Digital Q.DataBase поддерживает префиксные и инфиксные операторы. Операторы могут быть перегружены; то есть одно и то же имя оператора может использоваться для разных операторов, которые имеют разное количество и типы операндов. При выполнении запроса система определяет, какой оператор вызвать, по количеству и типам предоставленных операндов.
Вот пример создания оператора для сложения двух комплексных
чисел. Мы предполагаем, что определение типа
complex уже создано (см. Раздел 5.1.13). Сначала нам нужна
функция, которая выполняет работу, затем мы можем определить оператор:
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 и других
подсказках для оптимизатора показаны в следующем разделе.