7.4. 問い合わせの対象

以下の手順に従って、テーブルに挿入される値は対象とする列のデータ型に強制されます。

問い合わせの対象の型解決

  1. 対象に正確に一致するかどうかをチェックします。

  2. なければ、式を対象の型に強制してみます。もし2つの型がバイナリ互換性があるものとして認識される、もしくは変換関数がある場合、これは成功します。もし式がunknown型リテラルの場合、リテラル文字列の内容は対象の型の入力変換ルーチンに与えられます。

  3. 対象が固定長な型(たとえばcharvarchar型)ならば、対象の型用の大きさを調整する関数を探します。大きさを調整する関数は、同じ名前の型で、1つ目がその型、2つ目が整数という2つの引数をとり、同じ型を返すという関数です。もし1つが見つかれば、適用され、列の宣言された長さを2番目のパラメータとして渡します。

Example 7-6. varchar格納型の変換

varchar(20)として宣言された対象の列への以下の問い合わせでは、対象の大きさが正確に調整されることが保証します。

tgl=> CREATE TABLE vv (v character(20));
CREATE
tgl=> INSERT INTO vv SELECT 'abc' || 'def';
INSERT 392905 1
tgl=> SELECT v, length(v) FROM vv;
          v           | length
----------------------+--------
 abcdef               |     20
(1 row)

ここで実際に起こったのは、デフォルトで || 演算子が text の連結として解決できるように、2つの unknown リテラルがtextに解決されたということです。そして演算子のtext型の結果は対象の列の型に合うようにbpchar("空白(blank)が埋められる(padded)文字(char)"。 これは文字データ型の内部名です。)に強制されます(しかし、パーサはtextbpchar がバイナリ互換性があることを認識しているので、この型強制は暗黙のものであり、実際の関数呼び出しは挿入しません)。最後に、大きさを調整する関数bpchar(bpchar,integer)がシステムカタログの中から見つかり、演算子の結果と格納する列の長さを適用します。この型特有の関数は必要とされ長さを検査し、空白の埋め込みを行います。