8.20. Псевдотипы
В систему типов Postgres Pro включены несколько специальных элементов, которые в совокупности называются псевдотипами. Псевдотип нельзя использовать в качестве типа данных столбца, но можно объявить функцию с аргументом или результатом такого типа. Каждый из существующих псевдотипов полезен в ситуациях, когда характер функции не позволяет просто получить или вернуть определённый тип данных SQL. Все существующие псевдотипы перечислены в Таблице 8.25.
Таблица 8.25. Псевдотипы
| Имя | Описание |
|---|---|
any | Указывает, что функция принимает любой вводимый тип данных. |
anyelement | Указывает, что функция принимает любой тип данных (см. Подраздел 36.2.5). |
anyarray | Указывает, что функция принимает любой тип массива (см. Подраздел 36.2.5). |
anynonarray | Указывает, что функция принимает любой тип данных, кроме массивов (см. Подраздел 36.2.5). |
anyenum | Указывает, что функция принимает любое перечисление (см. Подраздел 36.2.5 и Раздел 8.7). |
anyrange | Указывает, что функция принимает любой диапазонный тип данных (см. Подраздел 36.2.5 и Раздел 8.17). |
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 | Указывает, что функция не возвращает значение. |
opaque | Устаревший тип, который раньше использовался во всех вышеперечисленных случаях. |
Функции, написанные на языке C (встроенные или динамически загружаемые), могут быть объявлены с параметрами или результатами любого из этих типов. Ответственность за безопасное поведение функции с аргументами таких типов ложится на разработчика функции.
Функции, написанные на процедурных языках, могут использовать псевдотипы, только если это позволяет соответствующий язык. В настоящее время большинство процедурных языков запрещают использовать псевдотипы в качестве типа аргумента и позволяют использовать для результатов только типы void и record (и trigger или event_trigger, когда функция реализует триггер или событийный триггер). Некоторые языки также поддерживают полиморфные функции с типами anyelement, anyarray, anynonarray, anyenum и anyrange.
Псевдотип internal используется в объявлениях функций, предназначенных только для внутреннего использования в СУБД, но не для прямого вызова в запросах SQL. Если у функции есть как хотя бы один аргумент типа internal, её нельзя будет вызывать из SQL. Чтобы сохранить типобезопасность при таком ограничении, следуйте важному правилу: не создавайте функцию, возвращающую результат типа internal, если у неё нет ни одного аргумента internal.
8.20. Pseudo-Types
The Postgres Pro 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.25 lists the existing pseudo-types.
Table 8.25. 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). |
anyarray | Indicates that a function accepts any array data type (see Section 36.2.5). |
anynonarray | Indicates that a function accepts any non-array data type (see Section 36.2.5). |
anyenum | Indicates that a function accepts any enum data type (see Section 36.2.5 and Section 8.7). |
anyrange | Indicates that a function accepts any range data type (see Section 36.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. |
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. |
opaque | An obsolete type name that formerly served all the above purposes. |
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.