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 lists the existing pseudo-types.
Table 8.27. 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 37.2.5 ). | 
       
        anyarray
       
       | 
      Indicates that a function accepts any array data type (see Section 37.2.5 ). | 
       
        anynonarray
       
       | 
      Indicates that a function accepts any non-array data type (see Section 37.2.5 ). | 
       
        anyenum
       
       | 
      Indicates that a function accepts any enum data type (see Section 37.2.5 and Section 8.7 ). | 
       
        anyrange
       
       | 
      Indicates that a function accepts any range data type (see Section 37.2.5 and Section 8.17 ). | 
       
        anycompatible
       
       | 
      Indicates that a function accepts any data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5 ). | 
       
        anycompatiblearray
       
       | 
      Indicates that a function accepts any array data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5 ). | 
       
        anycompatiblenonarray
       
       | 
      Indicates that a function accepts any non-array data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5 ). | 
       
        anycompatiblerange
       
       | 
      Indicates that a function accepts any range data type, with automatic promotion of multiple arguments to a common data type (see Section 37.2.5 and Section 8.17 ). | 
       
        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 37.2.5
  
  .
 
  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.