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
Comprueba si hay una coincidencia exacta con el destino.
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.
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.