以下の手順に従って、テーブルに挿入される値は対象とする列のデータ型に変換されます。
値の格納における型変換
対象に正確に一致するかどうかを検査します。
なければ、式を対象の型に変換してみます。
もし2つの型の間の代入キャストがpg_cast
カタログ(CREATE CASTを参照してください)に登録されている場合、これは可能です。
あるいは、もし式がunknown型リテラルの場合、リテラル文字列の内容は対象の型の入力変換ルーチンに与えられます。
対象の型に対してサイズ調整キャストがあるかどうかを検査します。
サイズ調整キャストは、ある型からその同じ型へのキャストです。
pg_cast
カタログに1つ見つかった場合は、格納先の列に収納する前に式に適用します。
こうしたキャストを実装する関数は、常にinteger
型のパラメータを1つ余計に取ります。
このパラメータは、格納先の列のatttypmod
値を受け付けます
(atttypmod
の解釈方法はデータ型によって異なりますが、典型的にはそれの宣言された長さです)。
また、キャストが明示的か暗黙的かを示す、第三のboolean
パラメータを取ることもできます。
サイズ検査や切り詰めなど、長さに依存したセマンティクスの適用について、キャスト関数が責任を持ちます。
例10.9 character
格納における型変換
character(20)
として宣言された対象の列への以下の文では、対象の大きさが正確に調整されることを示します。
CREATE TABLE vv (v character(20)); INSERT INTO vv SELECT 'abc' || 'def'; SELECT v, octet_length(v) FROM vv; v | octet_length ----------------------+-------------- abcdef | 20 (1 row)
ここで実際に起こったのは、デフォルトで||
演算子がtext
の連結として解決できるように、2つのunknownリテラルがtext
に解決されたということです。
そして演算子のtext
型の結果は対象の列の型に合うようにbpchar
(「空白が埋められる文字」, character
データ型の内部名)に変換されます
(しかし、text
からbpchar
へバイナリ変換可能ですので、この型変換のために実際の関数呼び出しは挿入されません)。
最後に、bpchar(bpchar, integer, boolean)
サイズ調整関数がシステムカタログの中から見つかり、演算子の結果と格納する列の長さを適用します。
この型特有の関数は必要とされる長さを検査し、空白の埋め込みを行います。