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