10.4. Хранимое значение

Значения, вставляемые в таблицу, преобразуется в тип данных целевой колонки по следующему алгоритму.

Преобразование по типу хранения

  1. Проверить точное совпадение с целевым типом.

  2. Если типы не совпадают, попытаться привести тип к целевому. Это возможно, если зарегистрировано преобразование между двумя типами. Если результат выражения — строка неизвестного типа, содержимое этой строки будет подано на вход процедуре ввода целевого типа.

  3. Проверить, не требуется ли приведение размера для целевого типа. Приведение размера — это преобразование типа к такому же. Если это приведение описано в каталоге pg_cast, применить к его к результату выражения, прежде чем сохранить в целевой колонке. Функция, реализующая такое приведение, всегда принимает дополнительный параметр типа integer, в котором передаётся значение atttypmod для целевой колонки (обычно это её объявленный размер, хотя интерпретироваться значение atttypmod для разных типов данных может по-разному), и третий параметр типа boolean, передающий признак явное/неявное преобразование. Функция приведения отвечает за все операции с длиной, включая её проверку и усечение данных.

Пример 10-8. Преобразование для типа хранения 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, что позволяет применить к ним оператор || как оператор конкатенации значений text. Затем результат оператора, имеющий тип text, приводится к типу bpchar ("blank-padded char" (символы, дополненные пробелами), внутреннее имя типа character) в соответствии с типом целевой колонки. (Так как типы text и bpchar двоично-совместимы, при этом преобразовании реальный вызов функции не добавляется.) Наконец, в системном каталоге находится функция изменения размера bpchar(bpchar, integer, boolean) и применяется для результата оператора и длины колонки. Эта связанная с типом функция проверяет длину данных и добавляет недостающие пробелы.