45.10. pg_cast

pg_cast表存储数据类型转换路径,包括内置路径和那些通过CREATE CAST定义的路径。

应当指出,pg_cast并不代表 系统知道如何执行的每一个类型转换,只有那些 不能从一些通用规则推导出的。例如, 在域和它的基类型之间转化没有明确表示在pg_cast。另一个重要例外是"自动I/O转换"。 执行使用数据类型的I/O函数到转换到text或其它字符串类型, 没有明确表示在pg_cast

Table 45-10. pg_cast Columns

名称类型引用描述
castsourceoidpg_type.oid源数据类型的OID
casttargetoidpg_type.oid目标数据类型的OID
castfuncoidpg_proc.oid 用于执行这个转换的函数的OID。如果这个转换方法不需要函数,那么为零
castcontextchar  标识这个转换可以在什么环境里调用。e表示只能进行明确的转换(使用CAST::语法)。 a表示在赋值给目标字段的时候隐含调用,也可以明确调用。i表示在表达式中隐含,当然也包括其它情况。
castmethodchar  说明转换是怎么运行的。 f意味着在castfunc字段中应用的规定函数。 i意味着输入输出函数被应用。 b 意味着类型是二进制的 因此不要求转换。

pg_cast里列出的类型转换函数必须总是以类型转换的源类型作为它的第一个参数类型, 并且返回类型转换的目的类型作为它的结果类型。一个类型转换函数最多有三个参数。 如果出现了第二个参数,必须是integer类型;它接受与目标类型关联的修饰词,如果没有,就是-1。 如果出现了第三个参数,那么必须是boolean类型;如果该类型转换是一种明确的转换, 那么它接受true,否则接受false

pg_cast里创建一条源类型和目标类型相同的记录是合理的, 只要相关联的函数接受多过一个参数。这样的记录代表"长度转换函数", 他们把该类型的数值转换为对特定的类型修饰词数值合法的值。

如果一条pg_cast记录有着不同的原类型和目标类型,并且有一个接收多于一个参数的函数, 那么它就意味着用一个步骤从一种类型转换到另外一种类型,同时还附加一个长度转换。 如果没有这样的记录,那么转换成一个使用了类型修饰词的类型涉及两个步骤, 一个是在数据类型之间转换,另外一个是附加修饰词。