Chapter 7. 型変換

Table of Contents
7.1. 概要
7.2. 演算子
7.3. 関数
7.4. 問い合わせの対象
7.5. UNION構成要素とCASE構成要素

意図的かどうかにかかわらず、1つの式の中に異なる型を混ぜ合わせた式をSQLの問い合わせでは持つことができます。PostgreSQLは、異なる型が混在する式の評価に関して幅広い能力を持っています。

多くの場合、ユーザーは型変換機構の詳細を理解する必要はありません。しかし、PostgreSQLによって暗黙的に行われる変換は問い合わせの結果に影響を及ぼします。必要ならばユーザーまたはプログラマにより、明示的に型の強制を用いて目的とするものに合わせることができます。

この章では、PostgreSQLの型変換機構とその規定について紹介します。特定のデータ型、使用できる関数と演算子についての情報については、Chapter 5Chapter 6の関連する節を参照してください。

PostgreSQL 7.3 プログラマガイドには、暗黙的な型変換と強制に使用される正確なアルゴリズムについて、より詳細に記述されています。

7.1. 概要

SQLは強く型付けされた言語です。つまり、各データ項目は、その動作と許される使用方法を決定するデータ型を所有しています。 PostgreSQL は、他の SQL の実装よりもより一般的で柔軟性のある、拡張可能な型システムを持ちます。ゆえに、PostgreSQLでのほとんどの型変換の動作は、ユーザー定義型についても型の混在する式を有意義に使えるように、特定の目的について勝手に作り上げられることなく一般的なルールで管理されるべきです。

PostgreSQLのスキャナ/パーサーは字句要素を、整数、浮動小数点、文字列、名前、キーワードというわずか5個の基礎カテゴリに解読します。ほとんどの拡張された型は、まず文字列にトークン化されます。SQL言語定義では、文字列で型の名前を指定することを許しており、この手法はパーサーが正しい手順に沿って処理を始められるようにPostgreSQLによって使用されています。たとえば、以下のような問い合わせを考えてみましょう。

tgl=> SELECT text 'Origin' AS "Label", point '(0,0)' AS "Value";
 Label  | Value
--------+-------
 Origin | (0,0)
(1 row)

この問い合わせは、textpointという2つの型を指定した文字列定数を持ちます。型が指定されていない場合、後述するように、後の段階で解決されるように、とりあえず場所を確保するための型であるunknownが割り当てられます。

PostgreSQLのパーサには、個別の型変換ルールが必要な4つの基礎的なSQL構成要素があります。

演算子

PostgreSQLでは、(引数が2つである)二項演算子と同様に、(引数が1つである)前置、後置演算子を持つ式が使用できます。

関数呼び出し

PostgreSQLの型システムの多くは、多くの関数の集合を持って構築されています。ある特定の問い合わせにおける関数呼び出しは引数を1つ以上もち、システムカタログ内で使用可能とされている関数定義に一致していなければいけません。PostgreSQLは関数のオーバーロードを許可するので、関数名のみでは呼び出される関数を一意に識別しません。 パーサが、与えられる引数のデータ型に基づいて正しい関数を選択しなければいけません。

問い合わせの対象

SQLINSERTUPDATE文は式の結果をテーブルの中に格納します。問い合わせ内の式は対象となるカラムの型に一致する、または、変換できるものである必要があります。

UNION 構成要素と CASE 構成要素

UNIONを構成するSELECT文からの選択結果はすべて、ある1つの列集合に現れなければいけませんので、各SELECT句の型は統一された集合に一致し変換できる必要があります。同様に、CASE式が全体として既知の出力型を持つようになるために、CASE構成要素の結果式は共通の型を強制する必要があります。

一般的な型の変換ルールの多くは、PostgreSQL関数と演算子のシステムテーブルに組み込まれている簡単な規定を使用します。smallintintegerrealといった、SQL標準に固有の型用の規定をよりうまくサポートするために、変換ルールには特別に用意されたものもあります。

システムカタログには、データ型間のどの変換 (casts と呼ばれる) が有効か、およびこれらの変換の実行方法についての情報が格納されています。 CREATE CAST コマンドを使用すると、ユーザが新規のキャストを追加することができます。 (新規キャストは、通常、新規データ型の定義を使用して結合を行なう際に追加します。 埋め込み型のキャストのセットは、様々なことに配慮して作成されているため、変更しないでください。)

更に、SQL標準型用の適切な動作をうまく推測できるようにするための発見的方法がパーサに提供されています。 基本的な型カテゴリは、ブール値数値文字列ビット文字列日付時間幾何学データネットワークユーザ定義があります。ユーザ定義を除いた各カテゴリは、あいまいさがある場合に優先的に選択される好ましい型を持ちます。 ユーザ定義カテゴリでは、それぞれの型はそれ自身の好ましい型です。あいまいな式(複数の解析結果侯補を持つもの)は、複数の可能な組み込み型があったとしてもしばしば解決できますが、複数のユーザー定義型選択肢がある場合にはエラーが発生します。

すべての型変換ルールは次のようないくつかの基本的な考え方に基づいて設計 されています。