10.4. Almacenamiento de valores #

Los valores que se insertarán en una tabla se convierten al tipo de datos de la columna de destino de acuerdo con los siguientes pasos.

Conversión de tipos para almacenamiento de valores

  1. Comprueba si hay una coincidencia exacta con el destino.

  2. De lo contrario, intenta convertir la expresión al tipo de destino. Esto es posible si se registra un cast de asignación (assignment cast) entre los dos tipos en el catálogo pg_cast (consulta CREATE CAST). Alternativamente, si la expresión es un literal de tipo desconocido, el contenido de la cadena literal se enviará a la rutina de conversión de entrada para el tipo de destino.

  3. Comprueba si hay un cast de dimensionamiento (sizing cast) para el tipo de destino. Un cast de dimensionamiento es un cast de ese tipo a sí mismo. Si se encuentra uno en el catálogo pg_cast, aplícalo a la expresión antes de guardarla en la columna de destino. La función de implementación para dicho cast siempre toma un parámetro adicional de tipo integer, que recibe el valor atttypmod de la columna de destino (normalmente su longitud declarada, aunque la interpretación de atttypmod varía para diferentes tipos de datos), y puede tomar un tercer parámetro boolean que indica si el cast es explícito o implícito. La función de cast es responsable de aplicar cualquier semántica dependiente de la longitud, como la comprobación de tamaño o el truncamiento.

Example 10.9. Conversión de tipos para almacenamiento de character

Para una columna de destino declarada como character(20), la siguiente sentencia muestra que el valor almacenado se dimensiona correctamente:

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)

Lo que realmente ha sucedido aquí es que los dos literales desconocidos se resuelven a text por defecto, lo que permite que el operador || se resuelva como una concatenación de text. Luego, el resultado de tipo text del operador se convierte a bpchar (blank-padded char, el nombre interno del tipo de datos character) para que coincida con el tipo de la columna de destino. (Dado que la conversión de text a bpchar es compatible binariamente, esta conversión no inserta ninguna llamada a función real). Finalmente, la función de dimensionamiento bpchar(bpchar, integer, boolean) se encuentra en el catálogo del sistema y se aplica al resultado del operador y a la longitud de la columna almacenada. Esta función específica del tipo realiza la comprobación de longitud requerida y la adición de espacios de relleno.