10.4. Хранилище значений#

10.4. Хранилище значений

10.4. Хранилище значений #

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

Тип хранения значения преобразования

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

  2. В противном случае попробуйте преобразовать выражение в целевой тип. Это возможно, если между двумя типами зарегистрировано приведение типов assignment cast в каталоге pg_cast (см. CREATE CAST). В качестве альтернативы, если выражение является литералом неизвестного типа, содержимое строки литерала будет передано в процедуру преобразования ввода для целевого типа.

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

Пример 10.9. символ Преобразование типа хранения

Для целевого столбца, объявленного как 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) находится в системном каталоге и применяется к результату оператора и сохраненной длине колонки. Эта типо-специфичная функция выполняет необходимую проверку длины и добавление пробелов для выравнивания.