8.21. Псевдотипы #
В систему типов PostgreSQL включены несколько специальных элементов, которые в совокупности называются псевдотипами. Псевдотип нельзя использовать в качестве типа данных столбца, но можно объявить функцию с аргументом или результатом такого типа. Каждый из существующих псевдотипов полезен в ситуациях, когда характер функции не позволяет просто получить или вернуть определённый тип данных SQL. Все существующие псевдотипы перечислены в Таблице 8.27.
Таблица 8.27. Псевдотипы
Имя | Описание |
---|---|
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). |
anymultirange | Указывает, что функция принимает любой мультидиапазонный тип данных (см. Подраздел 36.2.5 и Раздел 8.17). |
anycompatible | Указывает, что функция принимает любой тип данных и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 36.2.5). |
anycompatiblearray | Указывает, что функция принимает любой тип массива и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 36.2.5). |
anycompatiblenonarray | Указывает, что функция принимает любой тип, отличный от массива, и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 36.2.5). |
anycompatiblerange | Указывает, что функция принимает любой тип диапазонный данных и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 36.2.5 и Раздел 8.17). |
anycompatiblemultirange | Указывает, что функция принимает любой мультидиапазонный тип данных и может автоматически приводить различные аргументы к общему типу данных (см. Подраздел 36.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
, когда функция реализует триггер или событийный триггер). Некоторые языки также поддерживают полиморфные функции с полиморфными псевдотипами, подробно рассмотренными в Подразделе 36.2.5.
Псевдотип internal
используется в объявлениях функций, предназначенных только для внутреннего использования в СУБД, но не для прямого вызова в запросах SQL. Если у функции есть как хотя бы один аргумент типа internal
, её нельзя будет вызывать из SQL. Чтобы сохранить типобезопасность при таком ограничении, следуйте важному правилу: не создавайте функцию, возвращающую результат типа internal
, если у неё нет ни одного аргумента internal
.