無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

10.1. 概要

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

PostgreSQL のスキャナ/パーサは字句要素を、整数、非整数値、文字列、識別子、キーワードという5個の基礎カテゴリに分解します。 ほとんどの非数値型定数は、まず文字列にクラス分けされます。 SQL 言語定義では、文字列で型の名前を指定することを許していて、パーサが正しい手順に沿って処理を始められるように PostgreSQL も採用しています。 例えば、以下のような問い合わせを考えてみましょう。

SELECT text 'Origin' AS "label", point '(0,0)' AS "value";

 label  | value
--------+-------
 Origin | (0,0)
(1 row)

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

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

関数呼び出し

PostgreSQL 型システムの大部分は、高度な関数群によって構築されています。 関数は複数の引数を取ることができます。 PostgreSQL では関数のオーバーロードが可能ですので、関数名だけでは呼び出すべき関数を一意に識別できません。 パーサは、提供される引数のデータ型に基づいて、正しい関数を選択しなければなりません。

演算子

PostgreSQL では、(引数が2つの)二項演算子と同様に、(引数が1つの)前置、後置単項演算子を持つ式が使用できます。 関数と同様、演算子もオーバーロード可能ですので、正しい演算子を選択する時に同じ問題が存在します。

値の格納

SQL INSERT UPDATE 文は式の結果をテーブルの中に格納します。 文内の式は対象となる列の型に一致する、または、変換できるものである必要があります。

UNION CASE 、および関連する構文

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

システムカタログには、データ型間の変換(もしくは キャスト )が有効かどうかや、その変換の実行方法に関する情報を格納します。 ユーザは CREATE CAST コマンドを使用してキャストを追加することができます (これは通常新しいデータ型を定義する時にまとめて行われます。 組み込み型間のキャスト集合は注意深く作成されており、また、変更しないことが最善です)。

暗黙のキャストを持つデータ型間の処理において、パーサが適切なキャスト処理のより良い決定を行えるよう追加の自律機構を備えています。データ型は、 boolean numeric string bitstring datetime timespan geometric network 、及びユーザ定義を含むいくつかの 型カテゴリ に分けられます。 ( 表47-52 の一覧を参照してください。 独自の型カテゴリを作成可能なことに注意して下さい。) 各カテゴリは、候補となる型の選択があった場合に、好ましいとされる1つ以上の 好ましい型 を持ちます。好ましい型の選択と利用可能な暗黙のキャストに注意すれば、曖昧な式(複数の解析結果候補を持つもの)が有効な方法で解決されることを保証することが可能です。

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


powered by SEO.CUG.NET