pg_cast 表存储数据类型转换路径, 包括内置路径和那些通过 CREATE CAST 定义的。
Table 42-11. pg_cast 字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
castsource | oid | pg_type.oid | 源数据类型的 OID |
casttarget | oid | pg_type.oid | 目标数据类型的OID |
castfunc | oid | pg_proc.oid | 用于执行这个转换的函数的 OID。如果该数据类型是 二进制兼容的,那么为零(也就是说,不需要运行时的操作来执行 转换)。 |
castcontext | char | 标识这个转换可以在什么环境里调用。 e 表示只能进行明确的转换(使用 CAST 或者 ::)。 a 表示在赋值给目标字段的时候隐含调用, 也可以明确调用。 i 表示在表达式中隐含,当然也包括其他情况。 |
在 pg_cast 里列出的类型转换函数必须总是以类型转换的源类型作为它的第一个参数类型, 并且返回类型转换的目的类型作为它的结果类型。一个类型转换函数最多有三个参数。 如果出现了第二个参数,必须是 integer 类型;它接受与目标类型关联的修饰词, 如果没有,就是 -1。如果出现了第三个参数,那么必须是 boolean 类型; 如果该类型转换是一种明确的转换,那么它接受 true,否则接受 false。
在 pg_cast 里创建一条源类型和目标类型相同的记录是合理的, 只要相关联的函数接受多过一个参数。这样的记录代表"长度转换函数", 他们把该类型的数值转换为对特定的类型修饰词数值合法的值。 不过,请注意,现在还不支持将非缺省类型修饰词和用户创建数据类型关联起来, 因此这个设施只用于少量的内置类型,这些类型都有内置于语法分析器里的类型修饰词语法。
如果一条 pg_cast 的记录有着不同的原类型和目标类型, 并且有一个接收多于一个参数的函数,那么它就意味着用一个步骤从一种类型转换到另外一种类型, 同时还附加一个长度转换。如果没有这样的记录,那么转换成一个使用了类型修饰词的类型涉及两个步骤, 一个是在数据类型之间转换,另外一个是附加修饰词。