Документация по PostgreSQL 9.4.1 | |||
---|---|---|---|
Пред. | Уровень выше | Глава 35. Расширение SQL | След. |
35.12. Пользовательские операторы
Любой оператор представляет собой "синтаксический сахар" для вызова нижележащей функции, выполняющей реальную работу; поэтому прежде чем вы сможете создать оператор, необходимо создать нижележащую функцию. Однако оператор — не исключительно синтаксический сахар, так как он несёт и дополнительную информацию, помогающую планировщику запросов оптимизировать запросы с этим оператором. Рассмотрению этой дополнительной информации будет посвящён следующий раздел.
PostgreSQL поддерживает левые унарные, правые унарные и бинарные операторы. Операторы могут быть перегружены; то есть одно имя оператора могут иметь различные операторы с разным количеством и типами операндов. Когда выполняется запрос, система определяет, какой оператор вызвать, по количеству и типам предоставленных операндов.
В следующем примере создаётся оператор сложения двух комплексных чисел. Предполагается, что мы уже создали определение типа complex (см. Раздел 35.11). Сначала нам нужна функция, собственно выполняющая операцию, а затем мы сможем определить оператор:
CREATE FUNCTION complex_add(complex, complex) RETURNS complex AS 'имя_файла', 'complex_add' LANGUAGE C IMMUTABLE STRICT; CREATE OPERATOR + ( leftarg = complex, rightarg = complex, procedure = complex_add, commutator = + );
Теперь мы можем выполнить такой запрос:
SELECT (a + b) AS c FROM test_complex; c ----------------- (5.2,6.05) (133.42,144.95)
Мы продемонстрировали создание бинарного оператора. Чтобы создать унарный оператор, просто опустите leftarg (для левого унарного) или rightarg (для правого унарного). Обязательными в CREATE OPERATOR являются только предложение procedure и объявления аргументов. Предложение commutator, добавленное в данном примере, представляет необязательную подсказку для оптимизатора запросов. Подробнее о commutator и других подсказках для оптимизатора рассказывается в следующем разделе.
Пред. | Начало | След. |
Пользовательские типы | Уровень выше | Информация для оптимизации операторов |