Псевдотипы
Система типов 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 и record (и trigger или event_trigger, когда функция реализует триггер или триггер события). Некоторые языки также поддерживают полиморфные функции, использующие полиморфные псевдотипы, показанные выше и подробно рассмотренные в подразделе Полиморфные типы.
Псевдотип internal используется для объявления функций, предназначенных только для внутреннего вызова СУБД, а не путем прямого вызова в запросе SQL. Если у функции есть хотя бы один аргумент типа internal, ее нельзя вызвать из SQL. Чтобы сохранить типобезопасность данного ограничения, нужно следовать этому правилу кодирования: не создавайте функцию, которая объявляется как возвращающая internal, если у нее нет ни одного аргумента internal.