PostgreSQLのデータ型は、基本型、コンテナ型、ドメイン、疑似型に分類されます。
基本型はinteger
のように、SQL言語レベル以下で実装されたものです
(通常はCのような低レベル言語で作成されます)。
一般的にこれらは抽象データ型とも呼ばれるものに対応します。
PostgreSQLは、ユーザによって提供された関数を通してのみ、こうした型に対する操作が可能で、また、こうした型の動作をユーザが記述する限りにおいてのみ理解します。
組み込みの基本型は、第8章に記載されています。
列挙(enum)型は基本型の一種とみなすことができます。 主な違いは、列挙型は低レベルプログラミング無しに、SQLコマンドだけで作ることができることです。 より詳細については、8.7を参照してください。
PostgreSQLには三種類の「コンテナ」型があります。これは他の型の複数の値を含む型です。 配列、複合型、範囲型があります。
配列は、全て同じ型の複数の値を保持することができます。 配列型は各基本型、複合型、範囲型およびドメイン型に対して自動的に作られます。 しかし、配列の配列はありません。 この型システムにおいては多次元配列は一次元配列と同じです。 より詳細については、8.15を参照してください。
ユーザがテーブルを作成すると、複合型、もしくは行型が作成されます。 関連するテーブルを持たない「スタンドアローン」の複合型をCREATE TYPEを使用して定義することもできます。 複合型は関連したフィールド名を持つ基本型の単なるリストです。 複合型の値は行もしくはフィールド値のレコードです。 より詳細については、8.16を参照してください。
範囲型は同じ型の二つの値を保持することができます。これらは範囲の下限と上限です。 範囲型はユーザによって作られますが、少数の組み込みの型もあります。 より詳細については、8.17を参照してください。
ドメインは、特定の元となる型に基づいたもので、多くの目的では、その元となる型と交換可能です。 しかし、ドメインは元となる基本型で許可される範囲内で値の有効範囲を制限する制約を持つことができます。 ドメインはSQLコマンドのCREATE DOMAINを使って作られます。 より詳細については、8.18を参照してください。
特殊な目的用に数個の「疑似型」があります。 疑似型はテーブルの列やコンテナ型の構成要素として現れることはありません。 しかし、関数の引数や結果型を宣言する際に使用することができます。 これは、型システム内で特殊な関数クラスを識別するための機構を提供します。 表 8.27に既存の疑似型を列挙します。
特殊な用途を持つ疑似型には、anyelement
とanyarray
、anynonarray
、anyenum
およびanyrange
の5つがあります。
これらはまとめて多様型と呼ばれます。
これらの型を使用すると宣言された関数は全て、多様関数と呼ばれます。
多様関数は多くの異なるデータ型を操作することができます。
データ型の指定は、特定の呼び出しに実際に渡されるデータ型によって決定されます。
多様引数と結果は互いに結び付いており、多様関数を呼び出す問い合わせが解析される時に特定のデータ型が決定されます。
anyelement
として宣言された位置(引数もしくは戻り値)にはそれぞれ、任意の実データ型を指定することができますが、1つの呼び出しでは、これらはすべて同一の実データ型でなければなりません。
anyarray
として宣言された位置には、任意の配列データ型を持つことができます。
しかし、同様にこれらはすべて同じデータ型でなければなりません。
また同様にanyrange
として宣言された位置はすべて同じ範囲型でなければなりません。
さらにanyarray
と宣言された位置とanyelement
と宣言された位置の両方がある場合、anyarray
の位置の実際の配列型は、その要素の型がanyelement
位置に現れる型と同じでなければなりません。
同様にanyrange
と宣言された位置とanyelement
もしくはanyarray
と宣言された位置の両方がある場合、anyrange
の位置の実際の範囲型は、その範囲の派生元型がanyelement
位置に現れる型と同じであり、anyarray
位置の要素の型と同じでなければなりません。
anynonarray
は、実際の型が配列型であってはならないという制限が加わっている点を除き、anyelement
とまったく同様に扱われます。
anyenum
は、実際の型が列挙型でなければならないという制約が加わっている点を除き、anyelement
とまったく同様に扱われます。
このように、2つ以上の引数位置が多様型と宣言されると、全体の効果として、実引数型の特定の組み合わせのみが許されるようになります。
例えば、equal(anyelement, anyelement)
と宣言された関数は、2つの引数が同じデータ型である限り、任意の入力値を2つ取ることになります。
関数の戻り値を多様型として宣言する時、少なくとも1つの引数位置も多様でなければなりません。
そして引数として与えられる実データ型がその呼び出しの実結果型を決定します。
例えば、配列添字機構がなかったとすると、subscript(anyarray, integer) returns anyelement
として添字機構を実装する関数を定義できます。
この宣言には、最初の実引数は配列型になり、パーサはこの最初の実引数の型より正しい結果型を推論することができます。
他にも例えば、f(anyarray) returns anyenum
と宣言された関数は列挙型の配列のみを受け付けます。
ほとんどの場合、パーサは異なる多様型の引数から多様結果型の実データ型を推論できます。
例えば、anyarray
をanyelement
から、もしくはその逆から推定できます。
例外はanyrange
型の多様結果はanyrange
型の引数を必要とします。
anyarray
もしくはanyelement
の引数からは推定できません。
これは、同じ派生元型の複数の範囲型が存在する可能性があるためです。
anynonarray
型とanyenum
型が、別個の型変数を表していないことに注意してください。
これはanyelement
と同じ型で、追加の制約が付いているだけです。
例えば、f(anyelement, anyenum)
として関数を宣言することは、f(anyenum, anyenum)
と宣言することと同一です。
両方の実引数は同じ列挙型でなければなりません。
可変長引数の関数(37.5.5で説明する可変個の引数を取る関数)を多様とすることができます。
最後のパラメータをVARIADIC
anyarray
と宣言することで実現されます。
引数を一致させ、実際の結果型を決めるために、こうした関数はanynonarray
パラメータを適切な個数記述した場合と同様に動作します