53.10. pg_cast
В каталоге pg_cast
хранятся пути приведения типов (как встроенных, так и пользовательских).
Следует заметить, что pg_cast
представляет не каждое приведение, которое может выполнять система, а только те, которые нельзя вывести по некоторым общим правилам. Например, приведение типа домена к его базовому типу не представляется явно в pg_cast
. Ещё одно важное исключение составляют «автоматические приведения ввода/вывода», которые выполняются с применением собственных функций ввода/вывода типа данных, преобразующих тип в text
или другие строковые типы — они также не представляются явно в pg_cast
.
Таблица 53.10. Столбцы pg_cast
Тип столбца Описание |
---|
Идентификатор строки |
OID исходного типа данных |
OID целевого типа данных |
OID функции, выполняющей приведение, или ноль, если для данного метода приведения не требуется функция. |
Определяет, в каких контекстах может выполняться приведение. Символ |
Показывает, как выполняется приведение. Символ |
Функции приведения, перечисленные в pg_cast
, должны всегда принимать исходный тип приведения в качестве типа первого аргумента и возвращать результат, имеющий целевой тип. Функция приведения может иметь до трёх аргументов. Второй аргумент, если он присутствует, должен иметь тип integer
; в нём передаётся модификатор типа, связанный с целевым типом, либо -1, если такого модификатора нет. Третий аргумент, если он присутствует, должен иметь тип boolean
; в нём передаётся true
, если приведение выполняется явно, и false
в противном случае.
Вполне возможно создать запись в pg_cast
, в которой исходный тип будет совпадать с целевым, если связанная функция приведения принимает больше одного аргумента. Такие записи представляют «функции преобразования длины», которые приводят значения некоторого типа в соответствие с заданным значением модификатора.
Когда в записи pg_cast
исходный и целевой типы приведения различаются и функция принимает более одного аргумента, эта запись представляет преобразование типа из одного в другой и сведение к нужной длине за один шаг. Если же такой записи не находится, приведение к типу с определённым модификатором выполняется в два этапа, сначала выполняется преобразование типа, а затем применяется модификатор типа.
53.10. pg_cast
The catalog pg_cast
stores data type conversion paths, both built-in and user-defined.
It should be noted that pg_cast
does not represent every type conversion that the system knows how to perform; only those that cannot be deduced from some generic rule. For example, casting between a domain and its base type is not explicitly represented in pg_cast
. Another important exception is that “automatic I/O conversion casts”, those performed using a data type's own I/O functions to convert to or from text
or other string types, are not explicitly represented in pg_cast
.
Table 53.10. pg_cast
Columns
Column Type Description |
---|
Row identifier |
OID of the source data type |
OID of the target data type |
The OID of the function to use to perform this cast. Zero is stored if the cast method doesn't require a function. |
Indicates what contexts the cast can be invoked in. |
Indicates how the cast is performed. |
The cast functions listed in pg_cast
must always take the cast source type as their first argument type, and return the cast destination type as their result type. A cast function can have up to three arguments. The second argument, if present, must be type integer
; it receives the type modifier associated with the destination type, or -1 if there is none. The third argument, if present, must be type boolean
; it receives true
if the cast is an explicit cast, false
otherwise.
It is legitimate to create a pg_cast
entry in which the source and target types are the same, if the associated function takes more than one argument. Such entries represent “length coercion functions” that coerce values of the type to be legal for a particular type modifier value.
When a pg_cast
entry has different source and target types and a function that takes more than one argument, it represents converting from one type to another and applying a length coercion in a single step. When no such entry is available, coercion to a type that uses a type modifier involves two steps, one to convert between data types and a second to apply the modifier.