PostgreSQL
PrevChapter 32. 拡張 SQL:型Next

ユーザ定義型

ユーザ定義型に必要な関数

ユーザ定義型では、常に入力関数と出力関数が必要です。これらの 関数は、型が(ユーザによる入力とユーザへの出力のための)文字列中 にどうやって現れるか、またその型がメモリ中でどう構成されるかを 決定します。入力関数はその入力として NULL 終端文字列を取り、 その型の(メモリ中の)内部表現を返します。出力関数はその型の内部 表現を取り、NULL 終端文字列を返します。 ここで私たちは、複素数を表現する複素数型を定義したいとします。 私たちはごく自然に、

         typedef struct Complex {
             double      x;
             double      y;
         } Complex;
という C 構造体のようなメモリ中の複素数表現 と、外部文字列表現として form(x,y) の文字列を選びますよね。 これらの関数は、通常、特に出力関数としては記述するのが困難です。 しかしながら、いくつか忘れてはならない点があります。

複素数(complex)型を定義するにあたり、その型 を生成する前に 2 つのユーザ定義関数 complex_in と complex_out を生成する必要があります。

         CREATE FUNCTION complex_in(opaque)
            RETURNS complex
            AS 'PGROOT/tutorial/obj/complex.so'
            LANGUAGE 'c';

         CREATE FUNCTION complex_out(opaque)
            RETURNS opaque
            AS 'PGROOT/tutorial/obj/complex.so'
            LANGUAGE 'c';

         CREATE TYPE complex (
            internallength = 16,
            input = complex_in,
            output = complex_out
         );

前に述べたように、Postgres はベース 型としての配列を完全にサポートしています。これに加えて、 Postgres ではユーザ定義型の配列も サポートします。型を定義する時、Postgres は自動的にその型の配列のサポートを提供します。 歴史的な理由により、配列型はユーザ型の名前の前にアンダースコア 文字 _ が付いた名前になります。複合型の場合は、すでにシステム はそれらが内部的にどう見えるかを理解しているので、それらに対して 関数を定義する必要はありません。

巨大なオブジェクト

ここまでに説明してきたのは、すべて "小さな" オブジェクトに関して だけです。小さいと言うのは、サイズが 8KB 以下のものをいいます。

NOTE: 1024 ロングワードは 8192 バイトです。事実、型は 8192 バイトより 小さくなければなりません。これは、Postgres のタプルとページ・オーバーヘッドがこの 8KB という 制限に合うように調整されているからです。適合する実際の値は マシンのアーキテクチャに依存します。

もしあなたが、文書検索システムやビットマップ格納のような大きな 型を必要とするのであれば、Postgres の巨大オブジェクト・インターフェースを使う必要があります。


PrevHomeNext
拡張 SQL:型Up拡張 SQL:演算子