演算子は裏側で実際の作業を行う関数を呼び出す「構文上の飾り」です。 ですから、演算子を作成する前にまずこの基礎となる関数を作成する必要があります。 しかし、演算子は単なる構文上の飾りではありません。 問い合わせプランナによる演算子を使用する問い合わせの最適化を補助する追加情報をやり取りするからです。 次節では、この追加情報について重点的に説明します。
PostgreSQLでは左単項演算子、右単項演算子、二項演算子をサポートしています。 演算子はオーバーロード可能です。 つまり、同じ演算子名をオペランドの数と型が異なる演算子に対して使用することができるということです。 問い合わせが実行されると、システムは与えられたオペランドの数と型より呼び出すべき演算子を決定します。
以下に2つの複素数の加算を行う演算子を作成する例を示します。
既にcomplex
型の定義(36.11. ユーザ定義の型を参照)を作成していることを前提としています。
まず、実作業を行う関数が必要です。
その後、演算子を定義できます。
CREATE FUNCTION complex_add(complex, complex)
RETURNS complex
AS 'filename
', '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
(右方単項の場合)を省略するだけです。
procedure
句と引数用の句のみがCREATE OPERATOR
での必須項目です。
例で示したcommutator
句は省略可能で、問い合わせオプティマイザへのヒントとなります。
commutator
やその他のオプティマイザへのヒントについての詳細は次節で説明します。