--- title: "Pseudo-Types" id: datatype-pseudo pg_version: "20devel" --- ## 8.21. Pseudo-Types The PostgreSQL type system contains a number of special-purpose entries that are collectively called *pseudo-types*. A pseudo-type cannot be used as a column data type, but it can be used to declare a function's argument or result type. Each of the available pseudo-types is useful in situations where a function's behavior does not correspond to simply taking or returning a value of a specific SQL data type. [Table 8.27](datatype-pseudo.md#datatype-pseudotypes-table) lists the existing pseudo-types. **Pseudo-Types** | Name | Description | | --- | --- | | `any` | Indicates that a function accepts any input data type. | | `anyelement` | Indicates that a function accepts any data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic)). | | `anyarray` | Indicates that a function accepts any array data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic)). | | `anynonarray` | Indicates that a function accepts any non-array data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic)). | | `anyenum` | Indicates that a function accepts any enum data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic) and [Section 8.7](datatype-enum.md)). | | `anyrange` | Indicates that a function accepts any range data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic) and [Section 8.17](rangetypes.md)). | | `anymultirange` | Indicates that a function accepts any multirange data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic) and [Section 8.17](rangetypes.md)). | | `anycompatible` | Indicates that a function accepts any data type, with automatic promotion of multiple arguments to a common data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic)). | | `anycompatiblearray` | Indicates that a function accepts any array data type, with automatic promotion of multiple arguments to a common data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic)). | | `anycompatiblenonarray` | Indicates that a function accepts any non-array data type, with automatic promotion of multiple arguments to a common data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic)). | | `anycompatiblerange` | Indicates that a function accepts any range data type, with automatic promotion of multiple arguments to a common data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic) and [Section 8.17](rangetypes.md)). | | `anycompatiblemultirange` | Indicates that a function accepts any multirange data type, with automatic promotion of multiple arguments to a common data type (see [Section 36.2.5](extend-type-system.md#extend-types-polymorphic) and [Section 8.17](rangetypes.md)). | | `cstring` | Indicates that a function accepts or returns a null-terminated C string. | | `internal` | Indicates that a function accepts or returns a server-internal data type. | | `language_handler` | A procedural language call handler is declared to return `language_handler`. | | `fdw_handler` | A foreign-data wrapper handler is declared to return `fdw_handler`. | | `table_am_handler` | A table access method handler is declared to return `table_am_handler`. | | `index_am_handler` | An index access method handler is declared to return `index_am_handler`. | | `tsm_handler` | A tablesample method handler is declared to return `tsm_handler`. | | `record` | Identifies a function taking or returning an unspecified row type. | | `trigger` | A trigger function is declared to return `trigger.` | | `event_trigger` | An event trigger function is declared to return `event_trigger.` | | `pg_ddl_command` | Identifies a representation of DDL commands that is available to event triggers. | | `void` | Indicates that a function returns no value. | | `unknown` | Identifies a not-yet-resolved type, e.g., of an undecorated string literal. | Functions coded in C (whether built-in or dynamically loaded) can be declared to accept or return any of these pseudo-types. It is up to the function author to ensure that the function will behave safely when a pseudo-type is used as an argument type. Functions coded in procedural languages can use pseudo-types only as allowed by their implementation languages. At present most procedural languages forbid use of a pseudo-type as an argument type, and allow only `void` and `record` as a result type (plus `trigger` or `event_trigger` when the function is used as a trigger or event trigger). Some also support polymorphic functions using the polymorphic pseudo-types, which are shown above and discussed in detail in [Section 36.2.5](extend-type-system.md#extend-types-polymorphic). The `internal` pseudo-type is used to declare functions that are meant only to be called internally by the database system, and not by direct invocation in an SQL query. If a function has at least one `internal`-type argument then it cannot be called from SQL. To preserve the type safety of this restriction it is important to follow this coding rule: do not create any function that is declared to return `internal` unless it has at least one `internal` argument.