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