8.21. Pseudo-Types

PostgreSQL 类型系统包含许多专用条目,这些条目统称为* pseudo-types *。伪类型不能用作列数据类型,但可以用来声明函数的参数或结果类型。每个可用的伪类型在函数的行为不仅仅对应于简单地获取或返回特定 SQL 数据类型的值的情况下很有用。 Table 8.25列出了现有的伪类型。

表 8.25. 伪类型

NameDescription
any指示函数接受任何 Importing 数据类型。
anyelement指示函数接受任何数据类型(请参见Section 38.2.5)。
anyarray指示函数接受任何数组数据类型(请参见Section 38.2.5)。
anynonarray指示函数接受任何非数组数据类型(请参见Section 38.2.5)。
anyenum指示函数接受任何枚举数据类型(请参见Section 38.2.5Section 8.7)。
anyrange指示函数接受任何范围数据类型(请参见Section 38.2.5Section 8.17)。
cstring指示函数接受或返回以 Null 结尾的 C 字符串。
internal指示函数接受或返回服务器内部数据类型。
language_handler声明过程语言调用处理程序以返回language_handler
fdw_handler声明了外部数据包装器处理程序以返回fdw_handler
index_am_handler声明索引访问方法处理程序以返回index_am_handler
tsm_handler声明了 tablesample 方法处理程序以返回tsm_handler
record标识采用或返回未指定行类型的函数。
trigger声明了一个触发函数以返回trigger.
event_trigger声明了一个事件触发函数以返回event_trigger.
pg_ddl_command标识可用于事件触发器的 DDL 命令的表示形式。
void指示函数不返回任何值。
unknown标识尚未解决的类型,例如未修饰的字符串 Literals。
opaque以前用于许多上述目的的过时类型名称。

可以声明用 C 编码的函数(无论是内置的还是动态加载的)以接受或返回任何这些伪数据类型。函数作者有责任确保在将伪类型用作参数类型时该函数将安全地运行。

以过程语言编码的函数只能在其实现语言允许的情况下使用伪类型。目前,大多数程序语言都禁止将伪类型用作参数类型,并且只允许voidrecord作为结果类型(当该函数用作触发器或事件触发器时加上triggerevent_trigger)。有些还使用anyelementanyarrayanynonarrayanyenumanyrange类型支持多态函数。

internal伪类型用于声明仅由数据库系统在内部调用的函数,而不是在 SQL 查询中直接调用的函数。如果一个函数至少有一个internal -type 参数,则不能从 SQL 调用它。为了保持此限制的类型安全性,请遵循以下编码规则,这一点很重要:请勿创建任何声明返回internal的函数,除非该函数至少具有一个internal参数。