Pseudo-types v16

Data typeNativeAliasDescription
anyIndicates that a function accepts any input data type.
anyelementIndicates that a function accepts any data type. For more information, see Polymorphic types in the PostgreSQL documentation.
anyarrayIndicates that a function accepts any array data type. For more information, see Polymorphic types in the PostgreSQL documentation.
anynonarrayIndicates that a function accepts any non-array data type. For more information, see Polymorphic types in the PostgreSQL documentation.
anyenumIndicates that a function accepts any enum data type. For more information, see Polymorphic types and Enumerated types in the PostgreSQL documentation.
anyrangeIndicates that a function accepts any range data type. For more information, see Polymorphic types and Range types in the PostgreSQL documentation.
cstringIndicates that a function accepts or returns a null-terminated C string.
internalIndicates that a function accepts or returns a server-internal data type.
language_handlerA procedural language call handler is declared to return language_handler.
fdw_handlerA foreign-data wrapper handler is declared to return fdw_handler.
recordIdentifies a function taking or returning an unspecified row type.
triggerA trigger function is declared to return trigger.
event_triggerAn event trigger function is declared to return event_trigger.
voidIndicates that a function returns no value.
opaqueAn obsolete type name that formerly served all the above purposes.

Overview

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.

Functions coded in C (whether built-in or dynamically loaded) can be declared to accept or return any of these pseudo data 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 types anyelement, anyarray, anynonarray, anyenum, and anyrange.

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.