14.5. 演算子とサポートルーチンの作成

上記のように 7 つの概念がありますが、ここでは、新しい演算子クラスを作成する有用な例を紹介します。 最初に、演算子のセットが必要になります。演算子を定義する処理はChapter 11で説明しました。Btrees 上の complex_abs_ops 演算子クラスでは、以下の演算子が必要です。

これらの関数を実装するコードは、PGROOT/src/tutorial/complex.cに格納され、PGROOT/src/tutorial/complex.so にコンパイルしたものとします。C コードの一部を以下に示します。

#define Mag(c) ((c)->x*(c)->x + (c)->y*(c)->y)

         bool
         complex_abs_eq(Complex *a, Complex *b)
         {
             double amag = Mag(a), bmag = Mag(b);
             return (amag==bmag);
         }

(このテキストでは、等価演算子のみを紹介していることに注意してください。他の 4 つの演算子は良く似ています。詳細は、 complex.c または complex.source をご覧ください。)

PostgreSQL に関数を登録するために下記のようにします。

CREATE FUNCTION complex_abs_eq(complex, complex) RETURNS boolean
    AS 'PGROOT/src/tutorial/complex'
    LANGUAGE C;

ここで重要なことがいくつかあります。

これで演算子を定義する準備ができました。

CREATE OPERATOR = (
     leftarg = complex, rightarg = complex,
     procedure = complex_abs_eq,
     restrict = eqsel, join = eqjoinsel
         );

ここで重要なのは、プロシージャ名(つまり上記で定義されるC 関数)と制約と結合選択関数です。例で使われている選択関数をただ使って下さいcomplex.sourceを参照)。これらは「より小さい」「等しい」そして「以上」の場合に使われる関数とは違うことに注意して下さい。これらが供給されなければ、オプティマイザはインデックスを効果的に利用できません。

次のステップは、B-tree に必要な比較「サポートルーチン」の登録です。 これを実装するための C コードは、演算子プロシージャと同じファイルに入っています。

CREATE FUNCTION complex_abs_cmp(complex, complex)
    RETURNS integer
    AS 'PGROOT/src/tutorial/complex'
    LANGUAGE C;