47.10. pg_cast

pg_cast表存储数据类型转换路径,包括内置路径和用户定义的路径。

应该注意,pg_cast并不表示系统知道如何执行的每种类型转换; 只表示那些不能从某些通用法则中推导出的。例如,在一个域类型和它的基本类型之间的转换, 不是明确的由pg_cast表示的。另外一个重要的例外是 "automatic I/O conversion casts",这些使用数据类型自己的I/O函数转换为或从 text或其他字符串类型转换的执行,不是由pg_cast明确表示的。

Table 47-10. pg_cast 字段

名字 类型 引用 描述
oid oid 行标识符(隐藏属性; 必须明确选择)
castsource oid pg_type.oid 源数据类型的 OID
casttarget oid pg_type.oid 目标数据类型的 OID
castfunc oid pg_proc.oid 用于执行这个转换的函数的 OID 。如果转换方式不需要一个函数,那么为零。
castcontext char 标识这个转换可以在什么环境里调用。e表示只能进行明确的转换 (使用CAST::语法)。a 表示在赋值给目标字段的时候隐含调用,也可以明确调用。i 表示在表达式中隐含,当然也包括其它情况。
castmethod char 标识转换是怎么执行的。f表示使用了在castfunc字段里指定的函数。 i表示使用了输入/输出函数。b表示该类型是二进制兼容的, 因此不需要什么转换。

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

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

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