Псевдотипы

Система типов QHB содержит ряд записей специального назначения, которые в совокупности называются псевдотипами. Псевдотип нельзя использовать в качестве типа данных столбца, но можно объявить функцию с аргументом или результатом такого типа. Каждый из доступных псевдотипов полезен в ситуациях, когда поведение функции не соответствует простому принятию или возвращению значения определенного типа данных SQL. Все существующие псевдотипы перечислены в Таблице 27.

Таблица 27. Псевдо-типы

ИмяОписание
anyУказывает, что функция принимает любой тип входных данных.
anyelementУказывает, что функция принимает любой тип данных (см. подраздел Полиморфные типы).
anyarrayУказывает, что функция принимает любой тип массива (см. подраздел Полиморфные типы).
anynonarrayУказывает, что функция принимает любой тип данных, кроме массива (см. подраздел Полиморфные типы).
anyenumУказывает, что функция принимает любой перечислимый тип данных (см. подраздел Полиморфные типы и раздел Перечислимые типы).
anyrangeУказывает, что функция принимает любой диапазонный тип данных (см. подраздел Полиморфные типы и раздел Диапазонные типы).
anymultirangeУказывает, что функция принимает любой мультидиапазонный тип данных (см. подраздел Полиморфные типы и раздел Диапазонные типы).
anycompatibleУказывает, что функция принимает любой тип данных и автоматически приводит различные аргументы к общему типу данных (см. подраздел Полиморфные типы).
anycompatiblearrayУказывает, что функция принимает любой тип массива и автоматически приводит различные аргументы к общему типу данных (см. подраздел Полиморфные типы).
anycompatiblenonarrayУказывает, что функция принимает любой тип данных, отличный от массива и автоматически приводит различные аргументы к общему типу данных (см. подраздел Полиморфные типы).
anycompatiblerangeУказывает, что функция принимает любой диапазонный тип данных и автоматически приводит различные аргументы к общему типу данных (см. подраздел Полиморфные типы и раздел Перечислимые типы).
anycompatiblemultirangeУказывает, что функция принимает любой мультидиапазонный тип данных и автоматически приводит различные аргументы к общему типу данных (см. подраздел Полиморфные типы и раздел Перечислимые типы).
cstringУказывает, что функция принимает или возвращает строку в стиле C с NULL в конце.
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Указывает, что функция не возвращает значение.
unknownОпределяет еще не определенный тип, например, необработанный строковый литерал.

Функции, написанные на языке C/RUST (встроенные или динамически загружаемые), могут быть объявлены для принятия или возврата любого из этих псевдотипов. Ответственность за то, что функция будет безопасна с псевдотипом в качестве аргумента, несет разработчик функции.

Функции, написанные на процедурных языках, могут использовать псевдотипы, только если это позволяет их язык реализации. В настоящее время большинство процедурных языков запрещают использование псевдотипа в качестве аргумента, а для результата допускают только типы void и recordtrigger или event_trigger, когда функция реализует триггер или триггер события). Некоторые языки также поддерживают полиморфные функции, использующие полиморфные псевдотипы, показанные выше и подробно рассмотренные в подразделе Полиморфные типы.

Псевдотип internal используется для объявления функций, предназначенных только для внутреннего вызова СУБД, а не путем прямого вызова в запросе SQL. Если у функции есть хотя бы один аргумент типа internal, ее нельзя вызвать из SQL. Чтобы сохранить типобезопасность данного ограничения, нужно следовать этому правилу кодирования: не создавайте функцию, которая объявляется как возвращающая internal, если у нее нет ни одного аргумента internal.