バージョンごとのドキュメント一覧

10.4. 値の格納 #

<title>Value Storage</title>

Values to be inserted into a table are converted to the destination column's data type according to the following steps. 以下の手順に従って、テーブルに挿入される値は対象とする列のデータ型に変換されます。

値の格納における型変換

<title>Value Storage Type Conversion</title>
  1. Check for an exact match with the target. 対象に正確に一致するかどうかを検査します。

  2. Otherwise, try to convert the expression to the target type. This is possible if an <firstterm>assignment cast</firstterm> between the two types is registered in the <structname>pg_cast</structname> catalog (see <xref linkend="sql-createcast"/>). Alternatively, if the expression is an unknown-type literal, the contents of the literal string will be fed to the input conversion routine for the target type. なければ、式を対象の型に変換してみます。 もし2つの型の間の代入キャストpg_castカタログ(CREATE CASTを参照してください)に登録されている場合、これは可能です。 あるいは、もし式がunknown型リテラルの場合、リテラル文字列の内容は対象の型の入力変換ルーチンに与えられます。

  3. Check to see if there is a sizing cast for the target type. A sizing cast is a cast from that type to itself. If one is found in the <structname>pg_cast</structname> catalog, apply it to the expression before storing into the destination column. The implementation function for such a cast always takes an extra parameter of type <type>integer</type>, which receives the destination column's <structfield>atttypmod</structfield> value (typically its declared length, although the interpretation of <structfield>atttypmod</structfield> varies for different data types), and it may take a third <type>boolean</type> parameter that says whether the cast is explicit or implicit. The cast function is responsible for applying any length-dependent semantics such as size checking or truncation. 対象の型に対してサイズ調整キャストがあるかどうかを検査します。 サイズ調整キャストは、ある型からその同じ型へのキャストです。 pg_castカタログに1つ見つかった場合は、格納先の列に収納する前に式に適用します。 こうしたキャストを実装する関数は、常にinteger型のパラメータを1つ余計に取ります。 このパラメータは、格納先の列のatttypmod値を受け付けます (atttypmodの解釈方法はデータ型によって異なりますが、典型的にはそれの宣言された長さです)。 また、キャストが明示的か暗黙的かを示す、第三のbooleanパラメータを取ることもできます。 サイズ検査や切り詰めなど、長さに依存したセマンティクスの適用について、キャスト関数が責任を持ちます。

例10.9 character格納における型変換

<title><type>character</type> Storage Type Conversion</title>

For a target column declared as <type>character(20)</type> the following statement shows that the stored value is sized correctly: 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)

What has really happened here is that the two unknown literals are resolved to <type>text</type> by default, allowing the <literal>||</literal> operator to be resolved as <type>text</type> concatenation. Then the <type>text</type> result of the operator is converted to <type>bpchar</type> (<quote>blank-padded char</quote>, the internal name of the <type>character</type> data type) to match the target column type. (Since the conversion from <type>text</type> to <type>bpchar</type> is binary-coercible, this conversion does not insert any real function call.) Finally, the sizing function <literal>bpchar(bpchar, integer, boolean)</literal> is found in the system catalog and applied to the operator's result and the stored column length. This type-specific function performs the required length check and addition of padding spaces. ここで実際に起こったのは、デフォルトで||演算子がtextの連結として解決できるように、2つのunknownリテラルがtextに解決されたということです。 そして演算子のtext型の結果は対象の列の型に合うようにbpchar空白が埋められる文字, characterデータ型の内部名)に変換されます (しかし、textからbpcharへバイナリ変換可能ですので、この型変換のために実際の関数呼び出しは挿入されません)。 最後に、bpchar(bpchar, integer, boolean)サイズ調整関数がシステムカタログの中から見つかり、演算子の結果と格納する列の長さを適用します。 この型特有の関数は必要とされる長さを検査し、空白の埋め込みを行います。