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 51.10. pg_cast
Columns
Name | Type | References | Description |
---|---|---|---|
oid | oid | Row identifier (hidden attribute; must be explicitly selected) | |
castsource | oid |
| OID of the source data type |
casttarget | oid |
| OID of the target data type |
castfunc | oid |
| The OID of the function to use to perform this cast. Zero is stored if the cast method doesn't require a function. |
castcontext | char | Indicates what contexts the cast can be invoked in.
e means only as an explicit cast (using
CAST or :: syntax).
a means implicitly in assignment
to a target column, as well as explicitly.
i means implicitly in expressions, as well as the
other cases.
| |
castmethod | char | Indicates how the cast is performed.
f means that the function specified in the castfunc field is used.
i means that the input/output functions are used.
b means that the types are binary-coercible, thus no conversion is required.
|
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.