51.10. pg_cast
В каталоге pg_cast
хранятся пути приведения типов (как встроенных, так и пользовательских).
Следует заметить, что pg_cast
представляет не каждое приведение, которое может выполнять система, а только те, которые нельзя вывести по некоторым общим правилам. Например, приведение типа домена к его базовому типу не представляется явно в pg_cast
. Ещё одно важное исключение составляют «автоматические приведения ввода/вывода», которые выполняются с применением собственных функций ввода/вывода типа данных, преобразующих тип в text
или другие строковые типы — они также не представляются явно в pg_cast
.
Таблица 51.10. Столбцы pg_cast
Тип столбца Описание |
---|
Идентификатор строки |
OID исходного типа данных |
OID целевого типа данных |
OID функции, выполняющей приведение, или ноль, если для данного метода приведения не требуется функция. |
Определяет, в каких контекстах может выполняться приведение. Символ |
Показывает, как выполняется приведение. Символ |
Функции приведения, перечисленные в pg_cast
, должны всегда принимать исходный тип приведения в качестве типа первого аргумента и возвращать результат, имеющий целевой тип. Функция приведения может иметь до трёх аргументов. Второй аргумент, если он присутствует, должен иметь тип integer
; в нём передаётся модификатор типа, связанный с целевым типом, либо -1, если такого модификатора нет. Третий аргумент, если он присутствует, должен иметь тип boolean
; в нём передаётся true
, если приведение выполняется явно, и false
в противном случае.
Вполне возможно создать запись в pg_cast
, в которой исходный тип будет совпадать с целевым, если связанная функция приведения принимает больше одного аргумента. Такие записи представляют «функции преобразования длины», которые приводят значения некоторого типа в соответствие с заданным значением модификатора.
Когда в записи pg_cast
исходный и целевой типы приведения различаются и функция принимает более одного аргумента, эта запись представляет преобразование типа из одного в другой и сведение к нужной длине за один шаг. Если же такой записи не находится, приведение к типу с определённым модификатором выполняется в два этапа, сначала выполняется преобразование типа, а затем применяется модификатор типа.