49.54. pg_type

В каталоге pg_type хранится информация о типах данных. Базовые типы и типы-перечисления (скалярные типы) создаются командой CREATE TYPE, а домены — командой CREATE DOMAIN. При добавлении любой таблицы в базу данных автоматически создаётся составной тип, представляющий структуру строки таблицы. Также возможно создавать составные типы с помощью команды CREATE TYPE AS.

Таблица 49-54. Столбцы pg_type

ИмяТипСсылкиОписание
oid oid  Идентификатор строки (скрытый атрибут; должен выбираться явно)
typname name  Имя типа данных
typnamespace oid pg_namespace.oid OID пространства имён, содержащего этот тип
typowner oid pg_authid.oid Владелец типа
typlen int2  Для типа фиксированного размера в typlen задаётся число байт во внутреннем представлении типа. Но для типов переменной длины, typlen будет отрицательным. Значение -1 обозначает тип "varlena" (он содержит машинное слово, определяющее длину), а -2 обозначает строку в стиле C, оканчивающуюся нулём.
typbyval bool  Поле typbyval определяет, будут ли внутренние процедуры передавать переменные этого типа по значению или по ссылке. Полю typbyval лучше присвоить false, если длина typlen не равна 1, 2 или 4 (либо 8, на 64-битных машинах). Типы переменной длины всегда передаются по ссылке. Заметьте, что typbyval может быть false, даже если размер типа позволяет передачу по значению.
typtype char  Поле typtype принимает значение b для базового типа (base), c для составного (composite), то есть типа строки таблицы, d для домена (domain), e для перечисления (enum), p для псевдотипа (pseudo-type) или r для диапазона (range). См. также typrelid и typbasetype.
typcategory char  В поле typcategory задаётся произвольная классификация типов данных, на основе которой анализатор запросов может определить, какие неявные приведения будут "предпочитаемыми". См. Табл. 49-55.
typispreferred bool  True, если этот тип является предпочитаемым целевым типом в своей категории (typcategory)
typisdefined bool  True, если тип определён, и false, если это тип-заготовка для ещё не определённого типа. Когда значение typisdefined — false, можно полагаться только на заданное имя, пространство имён и OID типа.
typdelim char  Символ, разделяющий два значения этого типа при разборе вводимого массива. Заметьте, что этот разделитель связывается с типом данных элемента массива, а не с типом самого массива.
typrelid oid pg_class.oid Если это составной тип (см. typtype), этот столбец указывает на запись pg_class, определяющую соответствующую таблицу. (Для независимого составного типа запись в pg_class на самом деле не представляет таблицу, но она всё равно нужна для связывания с записями pg_attribute этого типа.) Для не составных типов содержит ноль.
typelem oid pg_type.oid Если значение typelem не 0, оно указывает на другую строку в pg_type. В этом случае к текущему типу можно обращаться по индексу, как к массиву, и получать значения типа typelem. "Настоящий" тип массива имеет переменную длину (typlen = -1), но для некоторых типов фиксированной длины (typlen > 0) также определяется typelem, например, для name и point. Если для типа фиксированной длины определён typelem, его внутренним представлением будет некоторое количество значений типа typelem, без других данных. Типы массивов переменной длины также содержат заголовок, определяемый подпрограммами массива.
typarray oid pg_type.oid Если поле typarray не равно 0, оно указывает на другую запись в pg_type, описывающую "настоящий" тип массива, в которой этот тип будет элементом
typinput regproc pg_proc.oid Функция преобразования ввода (из текстового формата)
typoutput regproc pg_proc.oid Функция преобразования вывода (в текстовый формат)
typreceive regproc pg_proc.oid Функция преобразования ввода (из двоичного формата), либо 0, если её нет
typsend regproc pg_proc.oid Функция преобразования вывода (в двоичный формат), либо 0, если её нет
typmodin regproc pg_proc.oid Функция ввода модификатора типа, либо 0, если тип не поддерживает модификаторы
typmodout regproc pg_proc.oid Функция вывода модификатора типа, либо 0 для использования стандартного формата
typanalyze regproc pg_proc.oid Нестандартная функция ANALYZE, либо 0 для использования стандартной функции
typalign char  

Переменная typalign определяет выравнивание, требуемое при хранении значения этого типа. Эта величина применяется при хранении на диске, а также для большинства представлений значений внутри PostgreSQL. Когда последовательно хранятся несколько значений, как например в представлении полной строки на диске, дополнительные байты добавляются перед значением этого типа, чтобы оно начиналось с указанной границы. Заданное выравнивание определяет смещение первого элемента последовательности.

Возможные значения:

  • c = выравнивание по символам (char), то есть выравнивание не требуется.

  • s = выравнивание по коротким словам (short), 2 байта для большинства машин.

  • i = выравнивание по целым (int), 4 байта для большинства машин.

  • d = выравнивание по двойным словам (double), 8 байт для большинства машин, но не для всех.

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

typstorage char  

Значение typstorage для типов varlena (типов с typlen = -1) говорит, готов ли тип для помещения в TOAST, и какова стратегия по умолчанию для атрибутов этого типа. Возможные значения:

  • p: Значение всегда должно храниться простым образом (plain).

  • e: Значение может храниться во "вторичном" отношении (если оно есть, см. pg_class.reltoastrelid).

  • m: Значение может храниться сжатым внутри строки.

  • x: Значение может храниться сжатым внутри строки или во "вторичном" хранилище.

Заметьте, что столбцы m тоже могут быть перемещены во вторичное хранилище, но только в качестве последней меры (столбцы e и x перемещаются в первую очередь).

typnotnull bool  

Поле typnotnull представляет ограничение «не NULL» для типа. Применяется только для доменов.

typbasetype oid pg_type.oid

Если это домен (см. typtype), то typbasetype указывает на тип, на котором он основан. Ноль, если это не домен.

typtypmod int4  

Домены используют typtypmod для записи модификатора (typmod), применяемого к их базовому типу (-1, если базовый тип не использует typmod). Если тип не является доменом, принимает значение -1.

typndims int4  

Значение typndims задаёт число размерностей массива для домена, определённого поверх массива (то есть, когда typbasetype — тип массива). Для типов, отличных от доменов поверх типов массивов, принимает значение 0.

typcollation oid pg_collation.oid

Значение typcollation задаёт правило сортировки для типа. Если тип не поддерживает сортировки, оно должно быть нулевым. У базового типа, поддерживающего сортировки, в этом поле будет DEFAULT_COLLATION_OID. Домен на базе сортируемого типа может иметь другой OID правила сортировки, если оно было изменено для домена.

typdefaultbin pg_node_tree  

Если поле typdefaultbin не NULL, в нём содержится представление выражения по умолчанию для этого типа (совместимое с nodeToString(). Это поле используется только для доменов.

typdefault text  

Поле typdefault содержит NULL, если с типом не связано значение по умолчанию. Если typdefaultbin не NULL, typdefault должно содержать понятную человеку версию выражения значения по умолчанию, записанного в typdefaultbin. Если typdefaultbin содержит NULL, а typdefault нет, то в typdefault находится внешнее представление значения по умолчанию, которое можно передать функции преобразования ввода и получить константу.

typacl aclitem[]  Права доступа; за подробностями обратитесь к описанию GRANT и REVOKE

В Табл. 49-55 перечисляются определённые в системе значения typcategory. Если этот список будет дополняться в будущем, в него будут добавляться тоже буквы ASCII в верхнем регистре. Все другие символы ASCII зарезервированы для категорий, определяемых пользователями.

Таблица 49-55. Коды typcategory

КодКатегория
A Типы массивов
B Логические типы
C Составные типы
D Типы даты/времени
E Типы-перечисления
G Геометрические типы
I Типы, описывающие сетевые адреса
N Числовые типы
P Псевдотипы
R Диапазонные типы
S Строковые типы
T Интервальные типы
U Пользовательские типы
V Типы битовых строк
X Неизвестный тип (unknown)