8.21. Псевдотипы
В систему типов Postgres Pro включены несколько специальных элементов, которые в совокупности называются псевдотипами. Псевдотип нельзя использовать в качестве типа данных столбца, но можно объявить функцию с аргументом или результатом такого типа. Каждый из существующих псевдотипов полезен в ситуациях, когда характер функции не позволяет просто получить или вернуть определённый тип данных SQL. Все существующие псевдотипы перечислены в Таблице 8.27.
Таблица 8.27. Псевдотипы
| Имя | Описание | 
|---|---|
| any | Указывает, что функция принимает любой вводимый тип данных. | 
| anyelement | Указывает, что функция принимает любой тип данных (см. Подраздел 35.2.5). | 
| anyarray | Указывает, что функция принимает любой тип массива (см. Подраздел 35.2.5). | 
| anynonarray | Указывает, что функция принимает любой тип данных, кроме массивов (см. Подраздел 35.2.5). | 
| anyenum | Указывает, что функция принимает любое перечисление (см. Подраздел 35.2.5 и Раздел 8.7). | 
| anyrange | Указывает, что функция принимает любой диапазонный тип данных (см. Подраздел 35.2.5 и Раздел 8.17). | 
| anycompatible | Указывает, что функция принимает любой тип данных и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 35.2.5). | 
| anycompatiblearray | Указывает, что функция принимает любой тип массива и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 35.2.5). | 
| anycompatiblenonarray | Указывает, что функция принимает любой тип, отличный от массива, и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 35.2.5). | 
| anycompatiblerange | Указывает, что функция принимает любой тип диапазонный данных и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 35.2.5 и Раздел 8.17). | 
| cstring | Указывает, что функция принимает или возвращает строку в стиле C. | 
| internal | Указывает, что функция принимает или возвращает внутренний серверный тип данных. | 
| language_handler | Обработчик процедурного языка объявляется как возвращающий тип language_handler. | 
| fdw_handler | Обработчик обёртки сторонних данных объявляется как возвращающий тип fdw_handler. | 
| table_am_handler | Обработчик табличного метода доступа объявляется как возвращающий тип table_am_handler. | 
| index_am_handler | Обработчик метода доступа индекса объявляется как возвращающий тип index_am_handler. | 
| tsm_handler | Обработчик метода выборки из таблицы объявляется как возвращающий тип tsm_handler. | 
| record | Указывает, что функция принимает или возвращает неопределённый тип строки. | 
| trigger | Триггерная функция объявляется как возвращающая тип trigger. | 
| event_trigger | Функция событийного триггера объявляется как возвращающая тип event_trigger. | 
| pg_ddl_command | Обозначает представление команд DDL, доступное событийным триггерам. | 
| void | Указывает, что функция не возвращает значение. | 
| unknown | Обозначает ещё не распознанный тип, например простую строковую константу. | 
Функции, написанные на языке C (встроенные или динамически загружаемые), могут быть объявлены с параметрами или результатами любого из этих псевдотипов. Ответственность за безопасное поведение функции с аргументами таких типов ложится на разработчика функции.
Функции, написанные на процедурных языках, могут использовать псевдотипы, только если это позволяет соответствующий язык. В настоящее время большинство процедурных языков запрещают использовать псевдотипы в качестве типа аргумента и позволяют использовать для результатов только типы void и record (и trigger или event_trigger, когда функция реализует триггер или событийный триггер). Некоторые языки также поддерживают полиморфные функции с полиморфными псевдотипами, подробно рассмотренными в Подразделе 35.2.5.
Псевдотип internal используется в объявлениях функций, предназначенных только для внутреннего использования в СУБД, но не для прямого вызова в запросах SQL. Если у функции есть как хотя бы один аргумент типа internal, её нельзя будет вызывать из SQL. Чтобы сохранить типобезопасность при таком ограничении, следуйте важному правилу: не создавайте функцию, возвращающую результат типа internal, если у неё нет ни одного аргумента internal.