51.62. pg_type

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

Таблица 51.62. Столбцы pg_type

ИмяТипСсылкиОписание
oidoid Идентификатор строки (скрытый атрибут; должен выбираться явно)
typnamename Имя типа данных
typnamespaceoidpg_namespace.oidOID пространства имён, содержащего этот тип
typowneroidpg_authid.oidВладелец типа
typlenint2 Для типа фиксированного размера в typlen задаётся число байт во внутреннем представлении типа. Но для типов переменной длины, typlen будет отрицательным. Значение -1 обозначает тип «varlena» (он содержит машинное слово, определяющее длину), а -2 обозначает строку в стиле C, оканчивающуюся нулём.
typbyvalbool Поле typbyval определяет, будут ли внутренние процедуры передавать переменные этого типа по значению или по ссылке. Полю typbyval лучше присвоить false, если длина typlen не равна 1, 2 или 4 (либо 8, на 64-битных машинах). Типы переменной длины всегда передаются по ссылке. Заметьте, что typbyval может быть false, даже если размер типа позволяет передачу по значению.
typtypechar Поле typtype принимает значение b для базового типа (base), c для составного (composite), то есть типа строки таблицы, d для домена (domain), e для перечисления (enum), p для псевдотипа (pseudo-type) или r для диапазона (range). См. также typrelid и typbasetype.
typcategorychar В поле typcategory задаётся произвольная классификация типов данных, на основе которой анализатор запросов может определить, какие неявные приведения будут «предпочитаемыми». См. Таблицу 51.63.
typispreferredbool True, если этот тип является предпочитаемым целевым типом в своей категории (typcategory)
typisdefinedbool True, если тип определён, и false, если это тип-заготовка для ещё не определённого типа. Когда значение typisdefined — false, можно полагаться только на заданное имя, пространство имён и OID типа.
typdelimchar Символ, разделяющий два значения этого типа при разборе вводимого массива. Заметьте, что этот разделитель связывается с типом данных элемента массива, а не с типом самого массива.
typrelidoidpg_class.oidЕсли это составной тип (см. typtype), этот столбец указывает на запись pg_class, определяющую соответствующую таблицу. (Для независимого составного типа запись в pg_class на самом деле не представляет таблицу, но она всё равно нужна для связывания с записями pg_attribute этого типа.) Для не составных типов содержит ноль.
typelemoidpg_type.oidЕсли значение typelem не 0, оно указывает на другую строку в pg_type. В этом случае к текущему типу можно обращаться по индексу, как к массиву, и получать значения типа typelem. «Настоящий» тип массива имеет переменную длину (typlen = -1), но для некоторых типов фиксированной длины (typlen > 0) также определяется typelem, например, для name и point. Если для типа фиксированной длины определён typelem, его внутренним представлением будет некоторое количество значений типа typelem, без других данных. Типы массивов переменной длины также содержат заголовок, определяемый подпрограммами массива.
typarrayoidpg_type.oidЕсли поле typarray не равно 0, оно указывает на другую запись в pg_type, описывающую «настоящий» тип массива, в которой этот тип будет элементом
typinputregprocpg_proc.oidФункция преобразования ввода (из текстового формата)
typoutputregprocpg_proc.oidФункция преобразования вывода (в текстовый формат)
typreceiveregprocpg_proc.oidФункция преобразования ввода (из двоичного формата), либо 0, если её нет
typsendregprocpg_proc.oidФункция преобразования вывода (в двоичный формат), либо 0, если её нет
typmodinregprocpg_proc.oidФункция ввода модификатора типа, либо 0, если тип не поддерживает модификаторы
typmodoutregprocpg_proc.oidФункция вывода модификатора типа, либо 0 для использования стандартного формата
typanalyzeregprocpg_proc.oidНестандартная функция ANALYZE, либо 0 для использования стандартной функции
typalignchar 

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

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

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

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

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

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

Примечание

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

typstoragechar 

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

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

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

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

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

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

typnotnullbool 

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

typbasetypeoidpg_type.oid

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

typtypmodint4 

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

typndimsint4 

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

typcollationoidpg_collation.oid

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

typdefaultbinpg_node_tree 

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

typdefaulttext 

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

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

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

Таблица 51.63. Коды typcategory

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