伪类型 ============ OushuDB 类型系统包含了一些特殊目的的项,它们被统称为\ *伪类型*\ 。一个伪类型不能被用作一个列的数据类型,但是它可以被用来定义一个函数的参数或者结果类型。每一种可用的伪类型都有其可以发挥作用的情况,这些情况的特点是一个函数的行为并不能符合于简单使用或者返回一种特定SQL数据类型的值。\ `表 伪类型 `__\ 列出了现有的伪类型。 .. container:: table :name: DATATYPE-PSEUDOTYPES-TABLE **表 伪类型** .. container:: table-contents +----------------------+-----------------------------------------------------------------+ | 名字 | 描述 | +======================+=================================================================+ | ``any`` | 表示一个函数可以接受任意输入数据类型。 | +----------------------+-----------------------------------------------------------------+ | ``anyelement`` | 表示一个函数可以接受任意数据类型。 | +----------------------+-----------------------------------------------------------------+ | ``anyarray`` | 表示一个函数可以接受任意数组数据类型。 | +----------------------+-----------------------------------------------------------------+ | ``anynonarray`` | 表示一个函数可以接受任意非数组数据类型。 | +----------------------+-----------------------------------------------------------------+ | ``anyenum`` | 表示一个函数可以接受任意枚举数据类型。 | +----------------------+-----------------------------------------------------------------+ | ``anyrange`` | 表示一个函数可以接受任意范围数据类型。 | +----------------------+-----------------------------------------------------------------+ | ``cstring`` | 表示一个函数接受或者返回一个非空结尾的C字符串。 | +----------------------+-----------------------------------------------------------------+ | ``internal`` | 表示一个函数接受或返回一个服务器内部数据类型。 | +----------------------+-----------------------------------------------------------------+ | ``language_handler`` | 一个被声明为返回\ ``language_handler``\ 的过程语言调用处理器。 | +----------------------+-----------------------------------------------------------------+ | ``fdw_handler`` | 一个被声明为返回\ ``fdw_handler``\ 的外部数据包装器处理器。 | +----------------------+-----------------------------------------------------------------+ | ``index_am_handler`` | 一个被声明为返回\ ``index_am_handler``\ 索引访问方法处理器。 | +----------------------+-----------------------------------------------------------------+ | ``tsm_handler`` | 一个被声明为返回\ ``tsm_handler``\ 的表采样方法处理器。 | +----------------------+-----------------------------------------------------------------+ | ``record`` | 标识一个接收或者返回一个未指定的行类型的函数。 | +----------------------+-----------------------------------------------------------------+ | ``trigger`` | 一个被声明为返回\ ``trigger``\ 的触发器函数。 | +----------------------+-----------------------------------------------------------------+ | ``event_trigger`` | 一个被声明为返回\ ``event_trigger``\ 的事件触发器函数。 | +----------------------+-----------------------------------------------------------------+ | ``pg_ddl_command`` | 标识一种对事件触发器可用的 DDL 命令的表达。 | +----------------------+-----------------------------------------------------------------+ | ``void`` | 表示一个函数不返回值。 | +----------------------+-----------------------------------------------------------------+ | ``unknown`` | 标识一种还未被解析的类型,例如一个未修饰的字符文本。 | +----------------------+-----------------------------------------------------------------+ | ``opaque`` | 一种已被废弃的类型名称,以前它用于实现以上的很多种目的。 | +----------------------+-----------------------------------------------------------------+ 用 C 编写的函数(不管是内建的还是动态载入的)可以被声明为接受或返回这些为数据类型的任意一种。函数的作者应当保证当一个伪类型被用作一个参数类型时函数的行为是安全的。 用过程语言编写的函数只有在其实现语言允许的情况下才能使用伪类型。目前大部分过程语言都禁止使用伪类型作为一种参数类型,并且只允许使用\ ``void``\ 和\ ``record``\ 作为结果类型(如果函数被用于一个触发器或者事件触发器, ``trigger``\ 或者\ ``event_trigger``\ 也被允许作为结果类型)。某些过程语言也支持在多态函数中使用类型\ ``anyelement``\ 、\ ``anyarray``\ 、\ ``anynonarray``\ 、\ ``anyenum``\ 和\ ``anyrange``\ 。 ``internal``\ 伪类型用于定义只在数据库系统内部调用的函数,这些函数不会被 SQL 直接调用。如果一个函数拥有至少一个\ ``internal``\ 类型的参数,则它不能从 SQL 中被调用。为了保持这种限制的类型安全性,遵循以下编码规则非常重要:不要创建任何被声明要返回\ ``internal``\ 的函数,除非它有至少一个\ ``internal``\ 参数。