以下の手順に従って、テーブルに挿入される値は対象とする列のデータ型に強制されます。
問い合わせの対象の型解決
対象に正確に一致するかどうかをチェックします。
なければ、式を対象の型に強制してみます。もし2つの型がバイナリ互換性があるものとして認識される、もしくは変換関数がある場合、これは成功します。もし式がunknown型リテラルの場合、リテラル文字列の内容は対象の型の入力変換ルーチンに与えられます。
対象が固定長な型(たとえばcharやvarchar型)ならば、対象の型用の大きさを調整する関数を探します。大きさを調整する関数は、同じ名前の型で、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)"。 これは文字データ型の内部名です。)に強制されます(しかし、パーサはtextとbpchar がバイナリ互換性があることを認識しているので、この型強制は暗黙のものであり、実際の関数呼び出しは挿入しません)。最後に、大きさを調整する関数bpchar(bpchar,integer)がシステムカタログの中から見つかり、演算子の結果と格納する列の長さを適用します。この型特有の関数は必要とされ長さを検査し、空白の埋め込みを行います。