CREATE TYPE typename ( INPUT = input_function, OUTPUT = output_function , INTERNALLENGTH = { internallength | VARIABLE } [ , EXTERNALLENGTH = { externallength | VARIABLE } ] [ , DEFAULT = default ] [ , ELEMENT = element ] [ , DELIMITER = delimiter ] [ , SEND = send_function ] [ , RECEIVE = receive_function ] [ , PASSEDBYVALUE ] [ , ALIGNMENT = alignment ] [ , STORAGE = storage ] )
作成する型の名前です。
新しい型の内部長を指定するリテラル値です。
新しい型の外部(表示用)長を指定するリテラル値です。
CREATE FUNCTION によって作成された、外部形式のデータを、その型の内部形式のデータに変換する関数の名前です。
CREATE FUNCTION によって作成された、内部形式によるデータを 表示に適した形式のデータに変換する関数の名前です。
作成されるのは配列型で、その配列の要素の型を指定します。
この型による配列の値の間の区切り文字です。
データ型のデフォルト値です。通常はこれは省略されるのでデフォルトは NULL になります。
CREATE FUNCTION によって作成された、この型のデータを他のマシンに転送できるような形式に変換する関数の名前です。
CREATE FUNCTION によって作成された、この型のデータを 他のマシンから、内部形式に転送できるような形式に変換する関数の名前です。
データ型の格納位置配置条件です。このオプションが指定された場合、 char、 int2、 int4またはdoubleである必要があります。デフォルトはint4です。
データ型の格納手法です。指定する場合は、 plain、 external、 extended、または 'main でなければなりません。デフォルトは plain です。
CREATE TYPEを使うことによって、ユーザはPostgreSQLの現在のデータベースで使用できる、新しいユーザ定義データ型を登録できます。型を定義したユーザはその所有者となります。 typename は新しい型の名前で、そのデータベースに定義された型名の中で一意でなければなりません。
CREATE TYPE では、型を定義する前に、 (CREATE FUNCTION を用いて)2つの関数を登録しておく必要があります。 新しい基本型の表現形式は、型の外部表現形式をその型用に定義された演算子と関数が使用可能な内部表現形式に変換する、 input_function で決定されます。当然、 output_function はこの逆の変換をします。入力関数は、1つの opaque 型の引数、または、 opaque, OID, int4 という3つの引数(最初の引数は、C スタイルの入力テキスト、2番目は配列型の場合の要素の型、3番目は既知の場合、対象列の typmod です。)をとるように宣言されます。出力関数は、1つの opaque 型の引数、または、 opaque, OID という 2 つの引数(最初の引数は実際はデータ型自身です。しかし、出力関数は最初に宣言されなければなりませんので、これを opaque 型として受け付けるよう宣言する方が簡単です。2番目の引数は上と同様、配列型の場合の、要素の型です。)をとるように宣言されます。
新しい基本型を、 internallength が正の整数となる固定長として作成することも、 internallength をVARIABLE に設定することで示される、可変長として作成することもできます。(内部的には、これは typlen を -1 に設定することで表現されます。)全ての可変長型の内部表現は、型の値の全長を示す整数値から始まらなければなりません。
外部表現形式も同様にして、 externallength をキーワードを使用して指定されます。(この値は現在使用されません。通常省略され、そのデフォルトを VARIABLE とします。)
型が配列であることを示すには、 ELEMENT キーワードを使用して配列要素の型を指定して下さい。例えば、4 バイト整数("int4") の配列を定義するには、
ELEMENT = int4
と指定して下さい。より詳細は、後述の配列型で説明します。
この型による配列の外部形式における値間の区切りを示すために、 delimiter で特定の文字を設定することができます。デフォルトの区切り文字はカンマ(',')です。この区切り文字は、配列要素の型に関係するものであり、配列型自体に関係するものでないことに注意して下さい。
ユーザがそのデータ型の列のデフォルトを NULL 以外の何かにしたい場合、デフォルト値を指定することができます。そのデフォルト値を DEFAULT キーワードで指定して下さい。(この方法のデフォルト値は、特定の列に付与された、明示的な DEFAULT 句によって上書きされる可能性があります。)
オプションの引数 send_function と receive_function は、現在、使用されていません。通常は(それぞれのデフォルト、 output_function と input_function に設定され。)省略されます。これらの関数は今後、マシン非依存のバイナリ表現を指定するために復活する可能性があります。
オプションのフラグ PASSEDBYVALUE は、このデータ型の値は参照ではなく値によって渡されることを示します。(ほとんどのマシンでは 4 バイト、まれに 8 バイトとなる ) Datum よりも長い内部表現の型は値によって渡すことができないことに注意して下さい。
alignment キーワードは、そのデータ型に必要とされる格納位置配置を指定します。指定可能な値は、1バイト、2バイト、4バイト、8バイト境界の位置合わせと同等のことを意味します。可変長型の位置配置は最低でも 4 を持たなければならないことに注意して下さい。最初の要素として int4 を持たなければならないからです。
キーワード storage を使用することで、可変長データ型を格納する際の戦略を選択することができます。(固定長の型には plain のみが許されています)。 plain はデータ型に対して TOAST を使えなくします。データは常に一列で格納され、圧縮されません。 extended は TOAST の全ての機能を有効にします。システムはまず長いデータ値を圧縮しようとし、それでもまだ長過ぎる場合は値をメインテーブルの行から削除します。 external はメインテーブルから値を削除することを許しますが、システムはデータを圧縮しようとしません。 main はデータの圧縮を許しますが、値をメインテーブルから削除することを止めます。(この格納メソッドを持つデータアイテムは、他に行を適合させる方法がない場合にはメインテーブルから削除されてしまうかもしれませんが、extended や external が指定されているアイテムよりも優先してメインテーブルに残されます。)
ユーザ定義のデータ型が作成されると、 PostgreSQL は、自動的に、その名前として基本型名の前にアンダースコアを付けた、関連する配列型を作成します。パーサはこの命名規則を理解し、 foo[] 型の列への要求を _foo 型への要求に変換します。この暗黙的に作成される配列型は可変長で、組み込み入出力関数 array_in と array_out を使用します。
理論的に考えると、 "システムが自動的に配列型を正しく作成するのであれば、 ELEMENT オプションはどうして存在するのだろう" と不思議に思うでしょう。 ELEMENT が意味を持つ、唯一の場合があります。それは、内部的に N 個の同一のものの配列となり、そのN個に対し、要素番号を指定して直接アクセスでき、さらに、その型全体として、何らかの操作を用意することを予定する、固定長の型を作成する時です。例えば、name 型は、その要素である chars 型のものにこのようなアクセス方法を許可しています。2次元の point 型では、その2 つの浮動小数点の構成要素に point[0] および point[1] というアクセスを行なうことができます。この機能は、その内部形式が正確に N 個の同一のフィールドの並びである、固定長の型でのみ動作します。要素番号指定が可能な可変長型は、 array_in と array_out を使用して、汎化された内部表現を持つ必要があります。歴史的な理由により、固定長配列型への要素番号指定は 0 から始まり、可変長配列の場合は 1 から始まります。(これは明らかに間違いなのですが、変更するには遅すぎました。)
ユーザ定義型の名前はアンダースコア ("_") から始めることはできません。また、30文字(もしくは 一般化した表現で NAMEDATALEN-2)長までです。(他の名前の場合は NAMEDATALEN-1 文字長まで許されます。)アンダースコアから始まる型名は、内部的に作成される配列型の名前のために予約されています。
以下のコマンドは、 box データ型を作成し、その型をテーブル定義の中で使用します。
CREATE TYPE box (INTERNALLENGTH = 16, INPUT = my_procedure_1, OUTPUT = my_procedure_2); CREATE TABLE myboxes (id INT4, description box);
box の内部構造が、4個の float4 の配列であったとすると、以下のように書くこともできます。
CREATE TYPE box (INTERNALLENGTH = 16, INPUT = my_procedure_1, OUTPUT = my_procedure_2, ELEMENT = float4);
これにより、box 値の浮動小数点要素は要素番号でアクセスできます。その他は、前と同様の動作をします。
以下の例は、ラージオブジェクト型を作成し、テーブル定義にてそれを使用します。
CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout, INTERNALLENGTH = VARIABLE); CREATE TABLE big_objs (id int4, obj bigobj);