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