55.66. pg_type #

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

Таблица 55.66. Столбцы 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) или m для мультидиапазона (multirange). См. также typrelid и typbasetype.

typcategory char

В поле typcategory задаётся произвольная классификация типов данных, на основе которой анализатор запросов может определить, какие неявные приведения будут «предпочитаемыми». См. Таблицу 55.67.

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 этого типа.) Для не составных типов содержит ноль.

typsubscript regproc (ссылается на pg_proc.oid)

OID функции обработки индексов элементов или ноль, если этот тип не поддерживает обращение к элементам по индексу. Для «настоящих» типов массивов typsubscript = array_subscript_handler, но другие типы могут реализовывать обращение к элементам по индексу особым образом.

typelem oid (ссылается на pg_type.oid)

Если значение typelem ненулевое, оно указывает на другую строку в pg_type, определяя тип, возвращаемый при обращении по индексу. Если значение typsubscript нулевое, то и значение typelem должно быть нулевым. Однако в некоторых случаях оно может быть нулевым и когда значение typsubscript ненулевое, если обработчик не учитывает typelem при определении типа результата. Обратите внимание, что зависимость typelem подразумевает физическое включение типа элемента в целевой тип; поэтому возможности изменения DDL типа элемента могут быть ограничены существованием данного типа.

typarray oid (ссылается на pg_type.oid)

Если значение typarray ненулевое, оно указывает на другую запись в pg_type, описывающую «настоящий» тип массива, в которой этот тип будет элементом

typinput regproc (ссылается на pg_proc.oid)

Функция преобразования ввода (из текстового формата)

typoutput regproc (ссылается на pg_proc.oid)

Функция преобразования вывода (в текстовый формат)

typreceive regproc (ссылается на pg_proc.oid)

Функция преобразования ввода (из двоичного формата), либо ноль, если её нет

typsend regproc (ссылается на pg_proc.oid)

Функция преобразования вывода (в двоичный формат), либо ноль, если её нет

typmodin regproc (ссылается на pg_proc.oid)

Функция ввода модификатора типа, либо ноль, если тип не поддерживает модификаторы

typmodout regproc (ссылается на pg_proc.oid)

Функция вывода модификатора типа, либо ноль для использования стандартного формата

typanalyze regproc (ссылается на pg_proc.oid)

Нестандартная функция ANALYZE, либо ноль для использования стандартной функции

typalign char

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

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

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

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

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

  • x = выравнивание по размеру xid (8 байт для всех машин).

typstorage char

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

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

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

  • m (main, основное): Значения могут сжиматься и храниться внутри кортежа.

  • x (extended, расширенное): Значения могут сжиматься и/или перемещаться во вторичное хранилище.

Для типов, которые могут быть помещены в TOAST, обычно применяется стратегия 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[]

Права доступа; за подробностями обратитесь к Разделу 5.7.


Примечание

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

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

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

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