33.11. ユーザ定義の演算子

演算子は、背後で実際の作業を行なう関数を呼び出す"構文上の飾り"です。 ですので、演算子を作成する前にまずこの背後の関数を作成する必要があります。 しかし、演算子は単なる構文上の飾りではありません。 問い合わせプランナによる演算子を使用する問い合わせの最適化を補助する追加情報をやりとりするからです。 次節では、この追加情報について重点的に説明します。

PostgreSQLでは左単項演算子、右単項演算子、二項演算子をサポートしています。 演算子はオーバーロード可能です。 つまり、同じ演算子名をオペランドの数と型が異なる演算子に対して使用することができるということです。 問い合わせが実行されると、システムは与えられたオペランドの数と型より呼び出すべき演算子を決定します。

以下に2つの複素数の加算を行なう演算子を作成する例を示します。 既にcomplex型の定義(項33.10参照)を作成していることを前提としています。 まず、実作業を行なう関数が必要です。 その後、演算子を定義できます。

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やその他のオプティマイザへのヒントについての詳細は次節で説明します。